thinkphp 5.0.13–5.0.15存在sql注入漏洞,源于insert/update方法中parsedata()对未校验数组参数的恶意拼接,可通过updatexml等报错注入利用,需结合主动探测、特征识别与手动验证确认。

ThinkPHP 5.0.15 存在已知的 SQL 注入漏洞(影响范围:5.0.13–5.0.15),主要出现在 insert() 和 update() 方法中,当用户输入以特定数组格式传入(如 ?param[0]=inc¶m[1]=updatexml(...)¶m[2]=1)且未开启严格字段校验时,可触发 Builder::parseData() 的恶意拼接,导致报错注入或布尔盲注。
扫描这类漏洞不依赖单一“全自动工具”,而是结合主动探测 + 特征识别 + 手动验证三步完成。以下是实用、可落地的操作方式:
明确目标入口点
漏洞触发需满足两个前提:
- 应用使用 ThinkPHP 5.0.13–5.0.15(可通过错误页、
/index.php?s=abc报错、响应头X-Powered-By: ThinkPHP或/public/static/下的框架文件时间戳判断) - 目标接口接收 GET/POST 参数并直接用于
db()->insert()或db()->update(),常见于注册、修改资料、密码重置等功能
典型可测路径示例:
-
GET /index.php?username[0]=inc&username[1]=1&username[2]=1 -
POST /user/update(Body 中含password[0]=inc&password[1]=updatexml(1,1,1)&password[2]=1)
使用 curl 或 Burp 手动探测(最可靠)
无需安装专用扫描器,用基础工具快速验证:
-
步骤一:确认是否回显数据库报错
curl "http://target.com/index.php?name[0]=inc&name[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&name[2]=1" -I
若响应状态为
200且响应体含XPATH syntax error或updatexml相关错误,则大概率存在漏洞。 -
步骤二:验证是否可提取数据
curl "http://target.com/index.php?name[0]=inc&name[1]=updatexml(1,concat(0x7e,database(),0x7e),1)&name[2]=1"
观察返回内容是否包含数据库名(如
~thinkphp_test~)。
⚠️ 注意:默认关闭 debug 模式时不会显示 SQL 错误。若无报错,尝试访问
/index.php?m=home&c=index&a=test等非常规路由,或配合目录扫描(如/.git/,/runtime/log/)寻找调试开启痕迹。
借助开源脚本辅助批量检测
已有公开 Python 脚本适配该漏洞,例如:
-
thinkphp-sqlinj-check.py(GitHub 可搜到)
支持自动识别 ThinkPHP 版本 + 发送 inc/exp payload + 判断响应关键词(XPATH,updatexml,extractvalue)
简单用法:
python3 thinkphp-sqlinj-check.py -u http://target.com/index.php -p name
它会自动构造并发送多个变体 payload(含 updatexml、extractvalue、floor+rand+group by),比人工更全面。
配合 Nuclei 模板做轻量扫描
Nuclei 社区有维护 TP5 注入模板(如 thinkphp5-sqli.yaml),适用于 CI/CD 或日常巡检:
- 安装后运行:
nuclei -u http://target.com -t workflows/thinkphp-workflow.yaml
或单独调用:
nuclei -u http://target.com -t vulnerabilities/thinkphp/thinkphp5-sqli.yaml
模板内已预置
name[0]=inc&name[1]=updatexml(...)类请求及正则匹配规则,命中即告警。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











