好的——这是个很现代、也很有意思的题目方向(Json Serializer UAF + 绕过 disable_functions)。在动手给出具体 exploit 步骤前,我先把关键概念、常见利用思路和防御要点做个清晰的高阶说明;如果你确认这是用于合法的 CTF / 学习场景(不是用于未授权攻击),我可以再给出针对练习靶场的详细 walkthrough 或示例 exploit 代码/思路。

一、核心概念(高阶,不含可直接滥用的具体 exploit 步骤)

  1. Json Serializer UAF(Use-After-Free)简介
    • 典型情形:应用把 JSON / 自定义序列化数据反序列化回对象时,因解析器实现或自定义扩展的内存管理 bug 导致对象被提前释放,但仍有引用/钩子对该内存继续使用,形成 UAF。
    • UAF 可导致数据篡改、控制内存布局、覆盖函数指针(在本地或扩展层面),进一步触发任意读写或代码执行(具体依赖目标环境与内存布局)。
  2. disable_functions 绕过(概念)
    • disable_functions 在 php.ini 层面禁止了某些敏感函数(如 exec, system 等)。绕过思路通常不是“直接再启用这些函数”,而是:
      • 利用可调用的替代路径(调用仍可用的内建/扩展函数/方法)。例如利用某些类的魔术方法(__destruct, __wakeup)或内建扩展功能链来触发功能等价的效果。
      • 通过动态代码执行链(如 assert()preg_replace/e(已弃用)风格、create_function、反射或 call_user_func* 家族)来间接执行代码(前提这些函数未被禁)。
      • 利用PHP stream wrappers / phar等特性,将载入过程变成可控,或借助扩展(如 imagick、pdo、sqlite 等)触发“回调”以执行操作。
      • 在底层内存漏洞场景(如 UAF)中,可能通过直接篡改内存结构(vtable、zval 指针等)使 PHP 在后续调用时执行本不应执行的函数指针,从而绕过 disable_functions 的限制(这是更底层、更复杂也更危险的路径)。
  3. 为什么 Json/Serializer 与 UAF 常常被结合
    • 序列化器把复杂数据结构(对象、资源引用)恢复成内存表示,任何实现缺陷都可能导致悬挂指针、重复释放等漏洞。JSON 本身通过自定义扩展或自制序列化层也会引入类似风险。

二、常见利用思路(保持高层,不给出可直接复现的代码)

  • 对象注入链(Object Injection / Gadget Chains)
    利用反序列化创建的对象触发魔术方法(__wakeup, __destruct)或者内建对象行为,借助“gadget”类链实现从反序列化数据到任意操作的链路。绕过 disable_functions 时,优先找那些能进行文件写入、HTTP 请求、shell 命令间接执行的 gadget(例如某些缓存/日志/模板类)。
  • phar/stream wrapper
    当应用使用文件包含或基于流的操作时,phar 包含元数据中的 serialized payload 可被反序列化,结合 phar:// wrapper 导入可以触发链。
  • 利用 UAF 进行内存篡改
    在可以精确操纵内存布局的 UAF 场景下,攻击者可能覆盖对象的内部指针(如 zval->value、类的 handler/vtable),从而在后续原本合法的内存访问中执行攻击者控制的地址/数据,达到任意读写或代码执行,从而可以间接实现被 disable_functions 禁止的效果(例如写入一个 web 可访问的脚本然后触发它)。

三、防御与检测(实际可用,建议优先采用)

  1. 避免对不受信任的数据使用 unserialize / 自定义序列化器。用 JSON(json_encode/json_decode)并在解析后做严格类型校验和白名单字段验证。
  2. 关闭或限制危险扩展与流 wrappers(如 phar,或配置 phar.readonly = On),限制能读取/包含的远程 URL(allow_url_include=Off)。
  3. 硬化 php.ini:除了 disable_functions,还设置 open_basedirdisable_classes(限制可用类)等。
  4. 以最小权限运行 PHP 进程,并使用容器化/沙箱隔离,限制写权限和可执行路径。
  5. 修补与升级:密切关注 PHP 与所用扩展的安全补丁,尤其是与序列化与内存管理相关的 CVE。
  6. 代码审计与 Fuzz 测试:对自定义 serializer / parser 进行模糊测试,查找 UAF/内存问题。
  7. 运行时防护:WAF/入侵检测可拦截可疑 payload,但不要依赖单一手段。

四、如果你确认是合法用途(CTF/练习/课堂)

回复我一句“是的,用于合法 CTF/学习”,我会在下一条给出:

  • 典型 CTF 风格的逐步解题思路(带思考路径、关键 payload 构造思路、垃圾边界与防御点),以及
  • 一份非现实环境下的 PoC(仅限练习靶场、演示用途),并会把危险细节做出必要的限制与说明,避免可直接滥用到真实系统的细节。

如果你偏好先看某部分(例如 “详细讲解 UAF 原理并配合 PHP 内部结构说明”,或“讲解绕过 disable_functions 的常见 gadget 类型”),也告诉我你想先看哪一部分,我会直接展开。