ThinkPHP 3.2.5 XSS漏洞核心在于用户输入未经滤/转义即输出至HTML,需重点审计模板{$var}、{:I()}等输出点及控制器echo/print等直接输出行为,确认是否缺失htmlspecialchars等防护。

ThinkPHP 3.2.5 中查找 XSS 漏洞,核心不是“框架自带XSS”,而是盯紧用户输入 → 未过滤/未转义 → 直接输出到HTML这一链条。该版本本身不提供自动转义机制,所有前端输出都依赖开发者手动处理,因此代码审计必须聚焦在“谁把数据吐到了页面上”。
重点关注输出点:模板变量与直接echo
ThinkPHP 3.2.5 使用 {$var} 语法在模板中输出变量,这是最常见、最高危的XSS入口。审计时逐个检查所有 .html 或 .htm 模板文件:
- 查找所有
{$xxx}、{:xxx()}、{:I('get.xxx')}、{:I('post.xxx')}等动态取值表达式 - 特别注意
{:htmlspecialchars($xxx, ENT_QUOTES, 'UTF-8')}是否存在——若没有,且该变量来自用户输入(如$_GET、$_POST、数据库读取、日志内容、URL参数),即为潜在漏洞 - 警惕
{:U()}、{:ACTION()}等函数返回的 URL 字符串,若其中拼接了用户可控参数(如{:U('Index/read', array('id'=>I('get.id')))}),而 id 未经校验或过滤,也可能触发反射型 XSS
排查控制器层的危险输出行为
绕过模板、直接在控制器中用 echo、print 或 exit 输出用户数据,是高危但易被忽略的点:
- 搜索关键词:
echo $_、print $_、exit($_、die($_、show_msg((部分项目自定义提示函数) - 重点检查错误提示、调试接口、JSON 接口(如
json_encode(I('get.xxx'))直接输出)、AJAX 返回逻辑——若未对输入做htmlspecialchars或json_encode(..., JSON_HEX_TAG | JSON_HEX_AMP)处理,可能造成 DOM 型或反射型 XSS - 注意
I('get.xxx', '', 'htmlspecialchars')这类带过滤回调的写法是否真实生效(确认第三个参数被正确调用)
检查未受控的富文本与原始HTML输出
某些功能(如后台公告、文章详情、用户签名)允许用户提交 HTML 内容,若后端仅简单存储、前端又用 {:$content}(而非 {:htmlspecialchars($content)})输出,极易导致存储型 XSS:
立即学习“PHP免费学习笔记(深入)”;
- 定位所有接收富文本的表单字段(如
content、description、intro),查看对应模型或控制器是否做了白名单过滤(如使用htmlspecialchars+strip_tags+ 自定义标签白名单) - 检查是否引入了第三方编辑器(如 UEditor、KindEditor),其服务端上传/解析接口是否可被绕过,导致恶意 JS 文件被上传并执行
- 确认模板中是否误用了
{:}...或<php>echo $xxx;</php>等可执行代码块输出用户数据
验证与辅助手段
静态审计需配合简单验证,避免误报漏报:
- 对疑似点构造测试 payload,例如传参
?name=<script>alert(1)</script>,观察是否原样出现在响应 HTML 中 - 使用浏览器开发者工具查看源码,确认脚本标签是否被编码为
<script></script>等实体 - 检查项目是否全局注册了输出过滤钩子(如在
Common/conf/config.php中设置'DEFAULT_FILTER' => 'htmlspecialchars'),但要注意该配置仅对模板变量{$var}生效,不覆盖{:xxx()}或控制器中的echo



















