PHP的SplDoublyLinkedList双向链表库中存在一个用后释放漏洞,该漏洞将允许攻击者通过运行PHP代码来转义disable_functions限制函数。在该漏洞的帮助下,远程攻击者将能够实现PHP沙箱逃逸,并执行任意代码。更准确地来说,成功利用该漏洞后,攻击者将能够绕过PHP的某些限制,例如disable_functions和safe_mode等等。
详情请看:https://www.freebuf.com/articles/web/251017.html
利用方法我们通过这道题 来演示一下利用 SplDoublyLinkedList UAC 来绕过disable_functions的具体方法。
进入题目,给出源码:
可知,我们传入的payload长度不能大于25,我们可以用以下方法来绕过长度限制:
a=eval($_POST[1]);&1=system('ls /');发现没反应:
直接连接蚁剑:
连接成功后依然是没法执行命令:
很有可能是题目设置了disable_functions来限制了一些命令执行函数,我们执行phpinfo看一下:
发现确实限制了常用的命令执行函数,需要我们进行绕过。
然后我们需要下载一个利用脚本:
将脚本上传到目标主机上有权限的目录中(/var/tmp/exploit.php),包含该exploit.php脚本即可成功执行命令:
利用 FFI 扩展执行命令
使用条件:
Linux 操作系统
PHP >= 7.4
开启了 FFI 扩展且ffi.enable=true
原理简述PHP 7.4 的 FFI(Foreign Function Interface),即外部函数接口,允许从用户在PHP代码中去调用C代码。
FFI的使用非常简单,只用声明和调用两步就可以。
首先我们使用FFI::cdef()函数在PHP中声明一个我们要调用的这个C库中的函数以及使用到的数据类型,类似如下:
$ffi = FFI::cdef("int system(char* command);"); # 声明C语言中的system函数这将返回一个新创建的FFI对象,然后使用以下方法即可调用这个对象中所声明的函数:
$ffi ->system("ls / > /tmp/res.txt"); # 执行ls /命令并将结果写入/tmp/res.txt由于system函数执行命令无回显,所以需要将执行结果写入到tmp等有权限的目录中,最后再使用echo file_get_contents("/tmp/res.txt");查看执行结果即可。
可见,当PHP所有的命令执行函数被禁用后,通过PHP 7.4的新特性FFI可以实现用PHP代码调用C代码的方式,先声明C中的命令执行函数或其他能实现我们需求的函数,然后再通过FFI变量调用该C函数即可Bypass disable_functions。
利用方法下面,我们通过 这道题来演示利用PHP 7.4 FFI来突破disable_functions的具体方法。
进入题目:
查看源码发现提示: