动态调用函数时的命令执行对于eval()和assert()的执行问题

前言

在做一道通过反序列化后动态调用函数的题目时,最后获取flag使用assert和phpinfo() 构成的命令可以执行 但eval和phpinfo()无法执行 ,本来以为只是因为assert可以把字符串参数当php代码执行,而eval是只能对合法的php代码可以执行的问题的原因,但这解释总感觉怪怪的,后来查询了一些文档并进行本地测试发现其另有原因。

附上题目中的主要代码:

class HelloPhp 
{ 
    public $a; 
    public $b; 
    public function __destruct(){ 
        $a = $this->a; 
        $b = $this->b; 
        echo $b($a); 
    } 
} 
$c = new HelloPhp;
@$ppp = unserialize($_GET["data"]); 

问题

eval()和assert()的命令执行问题
在本地进行代码测试

<?php
    $a='assert';
    $b='eval';
    $c='phpinfo();';
    echo $a($c);
    echo  "<br>-----------分隔线---------<br>";
    echo $b($c);
?>

结果:$a($c)执行成功 $b($c)执行失败
在这里插入图片描述

查了查文档,然后自己又测试了一下:

给了一个合理的解释:

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

什么是可变函数?

可变函数即变量名加括号,PHP系统会尝试解析成函数,如果有当前变量中的值为命名的函数,就会调用。如果没有就报错。
·
可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require eval() 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。

例:结果输出1

$b = 'get';
function get(){
	echo 1;
}
$b();

进一步研究

当我把PHP版本调到7.0时 assert()正常

但PHP版本调到7.1以上后,assert()和eval()都报错
在这里插入图片描述
assert报错:

Cannot call assert() with string argument dynamically in -> 无法在中使用字符串参数动态调用assert()

查询文档资料

在PHP7.1版本以后, assert()默认不再可以执行代码

这就是现在大量一句话木马不能使用的罪魁祸首,一般大多的马用assert()来执行代码了,当PHP版本更新后基本就团灭了,一般情况下修改成eval即可正常运行了

来自官方文档解释:
在这里插入图片描述

结论

(1)eval是语言构造器而不是一个函数,不能被可变函数调用
(2)在php7.1版本之后 assert()默认不再可以执行代码

补充

哎 平常还是要多了解了解不同服务和版本之间的安全更新问题
PHP7和PHP5在安全上的区别

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值