劫持 got 表
关于 got 表可以参考:深入理解GOT表和PLT表
在动态链接的情况下,程序加载的时候并不会把链接库中所有函数都一起加载进来,而是程
序执行的时候按需加载,如果有函数并没有被调用,那么它就不会在程序生命中被加载进来。
简单说就是,函数第一次用到的时候才会把在自己的真实地址给写到相应的 got 表里,没用
到就不绑定了。这就是延迟绑定,由于这个机制,第一次调用函数的时候,got 表中“存放”
的地址不是函数的真实地址,而是 plt 表中的第二条汇编指令,接下来会进行一系列操作装
载相应的动态链接库,将函数的真实地址写在 got 表中。以后调用该函数时,got 表保存着其
真实地址。
这里劫持 got 表就是修改函数的 got 表的地址的内容为我们的 shellcode 的地址:
- 通过 php 脚本解析
/proc/self/exe
得到 open 函数的 got 表的地址
- 通过读取
/proc/self/maps
得到程序基地址,栈地址,与 libc 基地址
- 通过 php 脚本解析 libc 得到 system 函数的偏移地址,结合 libc 基地址(两者相加)可以得
到 system 函数的实际地址
- 通过读写
/proc/self/mem
实现修改 open 函数的 got 表的地址的内容为我们的 shellcode
的地址。向我们指定的 shellcode 的地址写入我们的 shellcode
exp(命令无回显,如果没有权限读写 /proc/self/mem
,自然也就无法利用了)
利用 GC UAF
此漏洞利用 PHP 垃圾收集器中一个三年前的bug来绕过 disable_functions 并执行系统命
令
exp:https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php
利用 Json Serializer UAF
此漏洞利用 json 序列化程序中的释放后使用漏洞,利用 json 序列化程序中的堆溢出触发,以
绕过 disable_functions 和执行系统命令
- Linux 操作系统
- PHP7.1 - all versions to date
- PHP7.2 < 7.2.19 (released: 30 May 2019)
- PHP7.3 < 7.3.6 (released: 30 May 2019)
exp:https://github.com/mm0r1/exploits/blob/master/php-json-bypass/exploit.php
Backtrace UAF
该漏洞利用在 debug_backtrace()
函数中使用了两年的一个 bug。我们可以诱使它返回对
已被破坏的变量的引用,从而导致释放后使用漏洞
- Linux 操作系统
- PHP7.0 - all versions to date
- PHP7.1 - all versions to date
- PHP7.2 - all versions to date
- PHP7.3 < 7.3.15 (released 20 Feb 2020)
- PHP7.4 < 7.4.3 (released 20 Feb 2020)
exp:https://github.com/mm0r1/exploits/blob/master/php7-backtrace-bypass/exploit.php
利用 user_filter
此漏洞利用了 10 多年前报告的bug
- 5.* - exploitable with minor changes to the PoC
- 7.0 - all versions to date
- 7.1 - all versions to date
- 7.2 - all versions to date
- 7.3 - all versions to date
- 7.4 < 7.4.26
- 8.0 < 8.0.13
exp:https://github.com/mm0r1/exploits/blob/master/php-filter-bypass/exploit.php
利用 SplDoublyLinkedList UAF
https://www.freebuf.com/articles/web/251017.html
PHP 的 SplDoublyLinkedList 双向链表库中存在一个 UAF 漏洞,该漏洞将允许攻击者通过运行
PHP 代码来转义 disable_functions 限制函数。在该漏洞的帮助下,远程攻击者将能够实现
PHP 沙箱逃逸,并执行任意代码。更准确地来说,成功利用该漏洞后,攻击者将能够绕过 PHP
的某些限制,例如 disable_functions 和 safe_mode 等等
- PHP v7.4.10 及其之前版本
- PHP v8.0(Alpha)
例题:BMZCTF2020 - ezphp
exp:
https://github.com/cfreal/exploits/blob/master/php-SplDoublyLinkedList-offsetUnset/exploit.php