PHP GC UAF提权
本文为CTFHUB的GC UAF题目解析,核心用于绕过PHP的disable_functions限制,实现命令执行,以下为关键技术点及操作步骤。
GC(Garbage Collection)机制
- PHP的GC机制主要处理循环引用的内存释放
- 当对象之间存在循环引用时,正常的引用计数无法释放这些对象,GC会检测并回收
- PHP 5.3+引入周期性垃圾收集器(Cycle Collector)来处理这类问题
GC UAF漏洞利用步骤
第一步:制造UAF场景
创建一组存在循环引用的对象,比如:
class A {
public $ref;
}
$a = new A();
$b = new A();
$a->ref = $b;
$b->ref = $a;
然后取消引用:
unset($a, $b);
这时候,两个对象形成的循环引用会被放入GC roots中等待清理
当GC清理这些对象时,如果其中某个对象的__destruct()方法访问了另一个已被释放的对象,就会触发UAF
第二步:布置恶意的析构方法
在某个对象的__destruct()方法中调用动态方法或魔术方法,并试图控制执行流程:
class Exploit {
function __destruct() {
global $evil_payload;
call_user_func($evil_payload);
}
}
在GC回收阶段,该方法会被调用
第三步:内存重用 & 漏洞触发
PHP释放内存后不会立即清零,下次分配可能会复用该内存块
攻击者伪造新的对象结构或函数调用结构,劫持执行流,典型的方式包括:
- 伪造
zend_execute_data结构 - 控制
call_user_func()的函数指针 - 伪造
zval指向一个特定的函数调用结构
第四步:构造绕过Payload,实现命令执行
通过UAF劫持执行流后,攻击者构造出一个函数调用链,最终跳转到原本被禁用的函数(如system)所在的位置,并执行命令
$func = "system"; // 被disable_functions禁用了
$evil_payload = [$func, "whoami"]; // 经过UAF执行这段
PHP会认为是正常的回调函数,而绕过disable_functions的检查
实操
-END-
版权所有:晨星交流
文章标题:PHP GC UAF提权,轻松绕过disable_functions
文章链接:https://morningstar.xin/?post=116
本站文章均为原创,未经授权请勿用于任何商业用途
文章标题:PHP GC UAF提权,轻松绕过disable_functions
文章链接:https://morningstar.xin/?post=116
本站文章均为原创,未经授权请勿用于任何商业用途
