对于TPCMF框架的一次代码审计
字数 1282 2025-08-18 11:38:41

TPCMF框架储存型XSS漏洞分析与复现

1. 漏洞概述

  • 漏洞类型:储存型XSS(跨站脚本攻击)
  • 影响框架:天睿PHP内容管理框架(TPCMF)
  • 框架描述:基于PHP7技术+CodeIgniter4作为系统核心部件
  • 漏洞文件/dayrui/Fcms/Library/Form.php
  • 利用条件:用户注册功能可用,管理员查看用户列表

2. 环境准备

  • 源码版本:TPCMF框架-安装包-201905171230.zip
  • 下载地址:http://www.tpcmf.com/down/
  • 测试环境:本地搭建的TPCMF框架环境

3. 漏洞分析

3.1 漏洞位置

  • 主要漏洞文件/dayrui/Fcms/Library/Form.php
  • 相关调用文件/dayrui/Core/Controllers/Member/Register.php

3.2 漏洞成因

  1. 注册流程分析

    • 注册用户时,Register.php调用check_username()函数验证用户名
    • 该函数位于Form.php文件中
  2. 安全缺陷

    • check_username()函数仅检查用户名是否已注册
    • 未对用户名内容进行XSS过滤或转义处理
    • 导致恶意XSS代码被直接存储到数据库中
  3. 攻击链

    • 攻击者注册包含XSS payload的用户名
    • 管理员查看用户列表时触发XSS
    • 可窃取管理员cookie(未开启httponly时)

4. 漏洞复现步骤

4.1 准备工作

  1. 搭建本地TPCMF环境
  2. 确保用户注册功能可用

4.2 攻击步骤

  1. 访问注册页面
  2. 填写注册信息:
    • 用户名</tExtArEa>'"><sCRiPt>alert("xss")</sCrIpT>
    • 其他字段按正常注册填写
  3. 提交注册表单
  4. 以管理员身份登录后台
  5. 访问用户列表页面
  6. 观察XSS弹窗触发

4.3 验证结果

  • 管理员查看用户列表时,浏览器执行恶意脚本
  • 弹出"xss"警告框,证明漏洞存在

5. 漏洞修复建议

  1. 输入过滤

    • check_username()函数中添加XSS过滤
    • 使用HTML实体编码或专用过滤函数
  2. 输出编码

    • 在显示用户名时进行HTML编码
  3. 安全增强

    • 启用HTTPOnly标志保护cookie
    • 实施Content Security Policy (CSP)

6. 代码审计技巧

  1. 审计重点

    • 关注用户输入点(如注册、评论等)
    • 追踪输入数据的处理流程
    • 检查是否缺少过滤或编码
  2. 常见模式

    • 输入直接存入数据库
    • 输出时未编码
    • 使用不安全的函数(如innerHTML)
  3. 工具辅助

    • 使用代码审计工具扫描
    • 手动追踪关键函数调用链

7. 总结

该漏洞展示了典型的储存型XSS案例,由于缺乏输入验证和输出编码,导致攻击者可以注入恶意脚本。通过此案例,安全研究人员可以学习到:

  1. 代码审计中如何追踪用户输入流程
  2. 识别缺少安全措施的关键点
  3. 理解XSS漏洞的实际危害
  4. 掌握基本的漏洞修复方法

对于开发者而言,此案例强调了输入验证和输出编码的重要性,以及在框架设计中内置安全机制的必要性。

TPCMF框架储存型XSS漏洞分析与复现 1. 漏洞概述 漏洞类型 :储存型XSS(跨站脚本攻击) 影响框架 :天睿PHP内容管理框架(TPCMF) 框架描述 :基于PHP7技术+CodeIgniter4作为系统核心部件 漏洞文件 : /dayrui/Fcms/Library/Form.php 利用条件 :用户注册功能可用,管理员查看用户列表 2. 环境准备 源码版本 :TPCMF框架-安装包-201905171230.zip 下载地址 :http://www.tpcmf.com/down/ 测试环境 :本地搭建的TPCMF框架环境 3. 漏洞分析 3.1 漏洞位置 主要漏洞文件 : /dayrui/Fcms/Library/Form.php 相关调用文件 : /dayrui/Core/Controllers/Member/Register.php 3.2 漏洞成因 注册流程分析 : 注册用户时, Register.php 调用 check_username() 函数验证用户名 该函数位于 Form.php 文件中 安全缺陷 : check_username() 函数仅检查用户名是否已注册 未对用户名内容进行XSS过滤或转义处理 导致恶意XSS代码被直接存储到数据库中 攻击链 : 攻击者注册包含XSS payload的用户名 管理员查看用户列表时触发XSS 可窃取管理员cookie(未开启httponly时) 4. 漏洞复现步骤 4.1 准备工作 搭建本地TPCMF环境 确保用户注册功能可用 4.2 攻击步骤 访问注册页面 填写注册信息: 用户名 : </tExtArEa>'"><sCRiPt>alert("xss")</sCrIpT> 其他字段按正常注册填写 提交注册表单 以管理员身份登录后台 访问用户列表页面 观察XSS弹窗触发 4.3 验证结果 管理员查看用户列表时,浏览器执行恶意脚本 弹出"xss"警告框,证明漏洞存在 5. 漏洞修复建议 输入过滤 : 在 check_username() 函数中添加XSS过滤 使用HTML实体编码或专用过滤函数 输出编码 : 在显示用户名时进行HTML编码 安全增强 : 启用HTTPOnly标志保护cookie 实施Content Security Policy (CSP) 6. 代码审计技巧 审计重点 : 关注用户输入点(如注册、评论等) 追踪输入数据的处理流程 检查是否缺少过滤或编码 常见模式 : 输入直接存入数据库 输出时未编码 使用不安全的函数(如innerHTML) 工具辅助 : 使用代码审计工具扫描 手动追踪关键函数调用链 7. 总结 该漏洞展示了典型的储存型XSS案例,由于缺乏输入验证和输出编码,导致攻击者可以注入恶意脚本。通过此案例,安全研究人员可以学习到: 代码审计中如何追踪用户输入流程 识别缺少安全措施的关键点 理解XSS漏洞的实际危害 掌握基本的漏洞修复方法 对于开发者而言,此案例强调了输入验证和输出编码的重要性,以及在框架设计中内置安全机制的必要性。