| name | php-serialization-audit |
| description | PHP 源码序列化与模板类漏洞审计。当在 PHP 白盒审计中需要检测反序列化、XML 解析或模板注入漏洞时触发。
覆盖 3 类风险: PHP 反序列化(unserialize/phar 反序列化/POP 链构造)、
XXE(XML 外部实体注入/libxml 配置)、SSTI(模板注入/Twig/Blade/Smarty 引擎)。
需要 php-audit-pipeline 提供的数据流证据。
|
| metadata | {"tags":"deserialization, unserialize, phar, pop chain, xxe, xml, libxml, ssti, template injection, twig, smarty, blade, 反序列化, 模板注入, xml外部实体","category":"code-audit"} |
PHP 序列化与模板类漏洞源码审计
本 skill 聚焦源码层面判断"反序列化/XXE/SSTI 是否成立",核心是验证 Source→Sink 路径上的数据可控性和安全配置。构造 payload、链条利用等运行时技术属于对应黑盒 exploit skill 范畴。
深入参考
3 类漏洞速查表
| 类型 | 典型 Sink | 利用条件 | 严重度 |
|---|
| 反序列化 | unserialize, phar:// 触发函数 | 用户可控序列化数据 + 可用 Gadget 类 | Critical |
| XXE | DOMDocument::loadXML, simplexml_load_string, XMLReader::xml | 外部实体未禁用 + 用户可控 XML 输入 | High-Critical |
| SSTI | Twig::render, Smarty::display, Blade {!! !!}, eval | 用户输入直接进入模板渲染上下文 | Critical |
反序列化审计要点
- unserialize() 入口: 搜索所有
unserialize 调用,追踪参数来源(Cookie、Session、缓存、数据库、HTTP 请求体),判断用户是否可控
- Phar 反序列化:
file_exists/is_dir/fopen/filesize/copy 等 40+ 文件系统函数在处理 phar:// 协议时自动触发反序列化,检查路径参数是否用户可控
- POP 链搜索: 从
__destruct/__wakeup/__toString 入口出发,沿链式方法调用追踪到危险 Sink(文件写入/命令执行/SQL 操作)。重点关注 Composer 依赖中的 Gadget 类
- allowed_classes 限制:
unserialize($data, ['allowed_classes' => [...]]) 是否生效?空数组 [] 或 false 才完全安全,true(默认)不做任何限制
XXE 审计要点
- libxml_disable_entity_loader: 在 PHP < 8.0 中需显式调用
libxml_disable_entity_loader(true) 禁用外部实体。PHP 8.0+ 该函数已废弃且默认禁用,但 LIBXML_NOENT 标志仍可重新启用
- DOMDocument 风险:
loadXML($input, LIBXML_NOENT) 是最大风险点,该标志会展开外部实体。即使不传 LIBXML_NOENT,PHP < 8.0 默认仍可能加载实体
- SimpleXML/XMLReader:
simplexml_load_string 默认安全(PHP 8.0+),但 LIBXML_NOENT 标志使其危险;XMLReader::xml 同理
- 盲 XXE vs 带外: 解析结果是否回显到页面?无回显时检查是否可利用带外通道(HTTP/FTP/DNS)
SSTI 审计要点
- Twig: 普通
{{ user_input }} 变量输出通常只是渲染变量并受自动转义保护;SSTI 重点检查用户输入是否进入模板源码解析流程,如 createTemplate($userInput)、动态拼接模板字符串,或沙箱模式 sandbox 策略过于宽松(允许危险 filter/function)
- Smarty:
{php} 标签(Smarty 3.1+ 已废弃但可能未禁用)、{if} 表达式中注入 PHP 函数调用({if system('id')}{/if})
- Blade:
{!! $var !!} 输出未转义内容,若 $var 用户可控则存在 XSS 或更严重风险;@php 指令如果可注入则直接 RCE
- 自定义模板引擎: 搜索
eval/preg_replace(/e) + 字符串替换模式,自研模板引擎常见的致命组合
检测清单