PHP GC UAF提权,轻松绕过disable_functions

由 晨星运营组 发布

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-


0条评论

发表评论