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 漏洞复现步骤

  1. 访问网站首页并选择任意文章
  2. 在评论区域填写以下信息:
    • 姓名:aaa')+alert(1)+('
    • 邮箱:www.gdit.edu.cn@qq.com
    • 网址:www.baidu.com
    • 验证码:按要求输入
    • 评论:任意内容
  3. 提交评论后,点击"回复"按钮触发 XSS

2.3 漏洞分析

后端处理流程:

  • 评论功能实现在 Model/Comment.php
  • name 参数经过 safeword 方法两次过滤处理
    • strip_tags 去除所有 HTML、XML、PHP 标签
    • htmlspecialchars 转换预定义字符为 HTML 实体
    • nl2br\n 转换为 <br />

前端处理流程:

  1. 前端 backcomment 函数直接将用户输入拼接并赋值给节点属性
  2. 正常情况下,用户名会被单引号包裹:backcomment('用户名')
  3. 通过 ') 逃逸单引号范围,使用 + 拼接恶意代码

漏洞根源:

  • 后端过滤忽略了用户输入会被插入 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 方法

漏洞原理:

  1. 通过 GET 获取 bulist 参数值
  2. bulist 值进行分割,分批读取数据库表数据
  3. 未对 bulist 进行任何过滤,直接拼接到 select * from 后执行
  4. 导致攻击者可以控制 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 调用

漏洞原理:

  1. fetchurl 方法直接获取传入的链接并请求数据
  2. 未对传入的 URL 协议和地址做任何限制
  3. 通过构造特定正则表达式可获取响应内容

关键点分析:

  1. titlepreg 参数控制正则表达式匹配
    • 传入 (.*) 可匹配所有内容
  2. 使用 file:// 协议时需在末尾添加 ?#
    • 原因:系统会拼接数字作为采集范围
    • ?# 可注释掉后续拼接的内容

利用方式:

  1. 内网服务探测
  2. 文件读取
  3. 攻击内网脆弱服务

5. 修复建议

5.1 DOM 型 XSS 修复

  1. 后端:
    • 对输出到 HTML 属性的内容进行额外转义
    • 实现上下文相关的输出编码
  2. 前端:
    • 避免直接操作 DOM 节点属性
    • 使用 textContent 替代 innerHTML
    • 对用户输入进行适当的 HTML 实体编码

5.2 SQL 注入修复

  1. 使用预处理语句(PDO/mysqli)
  2. bulist 参数进行严格白名单过滤
  3. 限制该功能只能由高级管理员使用
  4. 实现最小权限原则,数据库用户仅具有必要权限

5.3 SSRF 修复

  1. 限制允许的 URL 协议(仅 http/https)
  2. 实现 URL 白名单机制
  3. 禁用对内部地址的访问
  4. 设置请求超时时间
  5. 验证响应内容是否符合预期格式

6. 总结

本文详细分析了 TaoCMS 3.0.2 中的三个安全漏洞,涵盖了从漏洞发现到利用的完整过程。这些漏洞的根源都在于对用户输入缺乏充分的验证和过滤,强调了安全开发中"不信任用户输入"原则的重要性。开发人员应当对所有用户输入进行严格验证,并根据输出上下文进行适当的编码和转义。

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: 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: 端口探测 POC: 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 中的三个安全漏洞,涵盖了从漏洞发现到利用的完整过程。这些漏洞的根源都在于对用户输入缺乏充分的验证和过滤,强调了安全开发中"不信任用户输入"原则的重要性。开发人员应当对所有用户输入进行严格验证,并根据输出上下文进行适当的编码和转义。