| name | thinkphp-security-audit |
| description | ThinkPHP 二次开发代码审计技能(中文)。用于 ThinkPHP 3/5/6 项目的漏洞排查、证据链分析和修复建议输出,覆盖 SQL 注入、命令执行、文件包含、反序列化、上传下载、路径穿越、模板注入、鉴权缺失与越权。触发场景:ThinkPHP 审计、历史风险核查、报告生成。 |
ThinkPHP Security Audit
审计目标
聚焦“二次开发风险”,优先发现业务代码引入的问题,而不是只复述框架历史漏洞。
标准流程
- 确认版本与结构(TP3/TP5/TP6、入口文件、路由模式、模块划分)。
- 梳理攻击面(控制器方法、API 路由、文件上传点、模板渲染点、后台管理接口)。
- 做 source-sink 链路分析(外部输入 -> 处理 -> 危险函数)。
- 优先审计高危漏洞族(注入/RCE/上传/越权)。
- 给出证据、修复建议、复测步骤与风险分级。
高危优先清单
先读取 references/thinkphp-checklist.md。
重点确认:
- SQL 注入:拼接 where/order/limit、
Db::query/execute 动态 SQL。
- 命令执行:
system/exec/passthru/shell_exec/proc_open。
- 文件包含与路径穿越:
include/require、文件下载读取路径可控。
- 任意文件上传:仅后缀校验、上传目录可执行、文件名可控。
- 模板注入:
fetch/display 传入不可信模板变量/片段。
- 反序列化:不可信
unserialize、可控对象链。
- SSRF:可控 URL 请求内网。
- 鉴权与越权:仅前端鉴权、缺资源归属校验。
二次开发常见失误
先读取 references/secondary-dev-pitfalls.md。
- 为“开发方便”关闭过滤或降低校验强度。
- 控制器中直接拼接查询条件。
- 把调试接口保留在线上环境。
- 复用历史工具类导致危险函数可达。
- 管理后台接口缺统一鉴权中间件。
版本差异与历史风险核查
先读取 references/version-diff-and-cve-notes.md。
- 先判断项目版本与补丁状态,再判断是否受历史漏洞影响。
- 将“框架历史风险”与“业务代码风险”分开输出。
- 对历史漏洞以“核查项 + 证据状态”表达,避免直接下结论。
语义护栏(抗幻觉)
先读取 references/semantic-guardrails.md。
执行时强制:
- 结论使用
CONFIRMED / SUSPECTED / INFO。
- 每条结论必须附证据链(source -> sink)。
- 输出必须满足 8 字段结构,缺字段重做。
- 仅评估本 skill 定义的漏洞族,不输出范围外结论。
输出要求
优先使用 templates/thinkphp-audit-report.md。
每条问题必须包含:
- 位置(文件/类/方法)
- 漏洞类型
- 可控输入与触发路径
- 利用前提
- 影响范围
- 修复建议(最小改动)
- 复测步骤
风险分级
- 高危:可直接导致 RCE、未授权数据泄露、批量越权。
- 中危:需要条件但可造成敏感影响。
- 低危:影响较小或利用复杂。
- 建议项:设计风险,尚未形成直接漏洞。
修复原则
- 参数化优先于转义,白名单优先于黑名单。
- 鉴权与资源归属在服务端强制校验。
- 上传与下载做路径规范化和隔离存储。
- 对外请求限制协议、域名/IP、重定向。
- 删除调试入口与危险开关。
禁止行为
- 不输出未授权攻击脚本。
- 不将关键词命中直接判定为漏洞。
- 不脱离版本与业务上下文下高危结论。