php-serialization-audit

$npx mdskill add wgpsec/AboutSecurity/php-serialization-audit

Audit PHP deserialization, XXE, and SSTI vulnerabilities in source code.

  • Detects unsafe unserialize, XML parsing, and template rendering patterns.
  • Requires php-audit-pipeline data flow evidence for analysis.
  • Traces Source to Sink paths to verify data controllability.
  • Outputs critical vulnerability patterns with severity ratings.

SKILL.md

.github/skills/php-serialization-auditView on GitHub ↗
---
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 类漏洞的危险模式 / 安全模式代码对比 / EVID 证据示例 → [references/deser-patterns.md](references/deser-patterns.md)

---

## 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 }}` 直接渲染用户输入时可注入。检查是否启用沙箱模式 `sandbox`,沙箱策略是否过于宽松(允许危险 filter/function)
- **Smarty**: `{php}` 标签(Smarty 3.1+ 已废弃但可能未禁用)、`{if}` 表达式中注入 PHP 函数调用(`{if system('id')}{/if}`)
- **Blade**: `{!! $var !!}` 输出未转义内容,若 `$var` 用户可控则存在 XSS 或更严重风险;`@php` 指令如果可注入则直接 RCE
- **自定义模板引擎**: 搜索 `eval`/`preg_replace(/e)` + 字符串替换模式,自研模板引擎常见的致命组合

## 检测清单

- [ ] 所有 `unserialize` 调用点已逐一审查参数来源
- [ ] Phar 协议触发函数的路径参数可控性已检查
- [ ] POP 链入口魔术方法已列举,链路可达性已追踪
- [ ] `allowed_classes` 配置已验证,默认值 `true` 已标记
- [ ] XML 解析器的 `LIBXML_NOENT` 标志使用情况已确认
- [ ] `libxml_disable_entity_loader` 调用状态已检查(PHP < 8.0)
- [ ] Twig/Smarty/Blade 模板中用户输入的渲染方式已审查
- [ ] 自定义模板引擎的 eval 调用已排查
- [ ] 严重度评分使用了统一公式,与 pipeline 一致

More from wgpsec/AboutSecurity

SkillDescription
401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
agent-security|
ai-data-security|