PHP代码审计之TaoCMS(SQL注入+SSRF 0day)
字数 1888 2025-08-24 16:48:07
TaoCMS 3.0.2 代码审计报告与漏洞分析
1. 概述
本文档详细分析了 TaoCMS 3.0.2 版本中发现的三个安全漏洞:DOM 型 XSS、SQL 注入和 SSRF。这些漏洞均已提交 CNVD,且未在网络上公开披露过。
2. DOM 型 XSS 漏洞
2.1 漏洞描述
该漏洞存在于评论功能中,属于 DOM 型跨站脚本攻击漏洞。由于后端过滤不严谨加上前端直接操作节点属性,导致攻击者可以注入恶意 JavaScript 代码。
2.2 漏洞复现步骤
- 访问网站首页并选择任意文章
- 在评论区域填写以下信息:
- 姓名:
aaa')+alert(1)+(' - 邮箱:
www.gdit.edu.cn@qq.com - 网址:
www.baidu.com - 验证码:按要求输入
- 评论:任意内容
- 姓名:
- 提交评论后,点击"回复"按钮触发 XSS
2.3 漏洞分析
后端处理流程:
- 评论功能实现在
Model/Comment.php name参数经过safeword方法两次过滤处理strip_tags去除所有 HTML、XML、PHP 标签htmlspecialchars转换预定义字符为 HTML 实体nl2br将\n转换为<br />
前端处理流程:
- 前端
backcomment函数直接将用户输入拼接并赋值给节点属性 - 正常情况下,用户名会被单引号包裹:
backcomment('用户名') - 通过
')逃逸单引号范围,使用+拼接恶意代码
漏洞根源:
- 后端过滤忽略了用户输入会被插入 HTML 标签属性的情况
- 前端未对用户输入进行适当转义,直接拼接并赋值
3. SQL 注入漏洞
3.1 漏洞描述
该漏洞存在于后台数据库备份功能中,由于未对用户输入进行过滤,导致攻击者可执行任意 SQL 查询。
3.2 漏洞复现
POC:
GET /admin/admin.php?action=datastore&ctrl=create&bulist=admin+where+id=1+union+select+(user()),2,3,4,5,6,7,8 HTTP/1.1
3.3 漏洞分析
漏洞位置:
- 控制器位于
Model/Datastore.php - 漏洞点在
create方法
漏洞原理:
- 通过 GET 获取
bulist参数值 - 对
bulist值进行分割,分批读取数据库表数据 - 未对
bulist进行任何过滤,直接拼接到select * from后执行 - 导致攻击者可以控制 SQL 查询语句
利用方式:
- 构造恶意
bulist参数实现 UNION 注入 - 可获取数据库用户、表结构等敏感信息
4. SSRF 漏洞
4.1 漏洞描述
该漏洞存在于后台采集功能中,由于未对 URL 进行限制,导致攻击者可利用服务端发起任意 HTTP 请求,实现服务器端请求伪造(SSRF)。
4.2 漏洞复现
文件读取 POC:
file:///D:/1.txt?
端口探测 POC:
http://127.0.0.1:3306/?
4.3 漏洞分析
漏洞位置:
- 模块位于
Module/Spider.php - 漏洞点在
execute方法中的fetchurl调用
漏洞原理:
fetchurl方法直接获取传入的链接并请求数据- 未对传入的 URL 协议和地址做任何限制
- 通过构造特定正则表达式可获取响应内容
关键点分析:
titlepreg参数控制正则表达式匹配- 传入
(.*)可匹配所有内容
- 传入
- 使用
file://协议时需在末尾添加?或#- 原因:系统会拼接数字作为采集范围
?或#可注释掉后续拼接的内容
利用方式:
- 内网服务探测
- 文件读取
- 攻击内网脆弱服务
5. 修复建议
5.1 DOM 型 XSS 修复
- 后端:
- 对输出到 HTML 属性的内容进行额外转义
- 实现上下文相关的输出编码
- 前端:
- 避免直接操作 DOM 节点属性
- 使用
textContent替代innerHTML - 对用户输入进行适当的 HTML 实体编码
5.2 SQL 注入修复
- 使用预处理语句(PDO/mysqli)
- 对
bulist参数进行严格白名单过滤 - 限制该功能只能由高级管理员使用
- 实现最小权限原则,数据库用户仅具有必要权限
5.3 SSRF 修复
- 限制允许的 URL 协议(仅 http/https)
- 实现 URL 白名单机制
- 禁用对内部地址的访问
- 设置请求超时时间
- 验证响应内容是否符合预期格式
6. 总结
本文详细分析了 TaoCMS 3.0.2 中的三个安全漏洞,涵盖了从漏洞发现到利用的完整过程。这些漏洞的根源都在于对用户输入缺乏充分的验证和过滤,强调了安全开发中"不信任用户输入"原则的重要性。开发人员应当对所有用户输入进行严格验证,并根据输出上下文进行适当的编码和转义。