某cms代码审计二
字数 1615 2025-08-25 22:58:55

CMS代码审计实战教学文档

0x01 前言

本教学文档基于某CMS系统的代码审计实践,重点分析存储型XSS漏洞和SQL注入漏洞的发现过程与利用方法。该CMS系统在CNVD上披露了相关漏洞,但厂商未修复,因此不公开具体名称。文档旨在提供代码审计的思路和方法。

0x02 存储型XSS漏洞分析

漏洞发现过程

  1. 漏洞触发点:文章标题字段
  2. Payload<details open ontoggle=confirm(document[coo+kie])>
  3. 触发条件
    • 普通用户在前台发表文章时插入XSS payload
    • 管理员在后台编辑该文章时不修改内容直接保存

代码审计分析

  1. 前台处理流程

    • 请求路径:/user/release.html
    • 关键函数:release()
    • 处理过程:
      • 检查登录状态
      • 检查违禁词汇(从webconf['mingan']获取)
      • 通过frparam函数处理输入数据
      • 调用format_param函数进行HTML实体编码(<&lt;, >&gt;
  2. 后台处理流程

    • 请求路径:/admin.php/Article/editarticle.html
    • 关键函数:editarticle()
    • 漏洞成因:
      • 后台编辑时同样调用frparam函数
      • 但未传入参数导致直接返回URL中的原始数据
      • 更新数据库时将实体编码还原为原始字符

漏洞利用要点

  • 前端输入被实体编码不是最终判断标准
  • 需要跟踪数据在整个流程中的处理过程
  • 特别关注后台编辑功能对数据的二次处理

0x03 SQL注入漏洞分析

漏洞一:文章发布功能注入

  1. 漏洞位置

    • 请求路径:/user/release.html
    • 注入参数:tidmolds
  2. 漏洞特征

    • 基于时间的延迟注入
    • SQL语句直接拼接用户输入,无过滤
  3. 代码分析

    • release()函数中存在两处SQL拼接
    • $this->classtypedata对应数据库classtype
    • get_fields_data函数未对输入进行过滤
  4. 利用条件

    • 只需满足$w['tid']!=0

漏洞二:用户资料修改功能注入

  1. 漏洞位置

    • 请求路径:/user/userinfo.html
    • 注入参数:provincecityaddress
  2. 漏洞特征

    • 用户输入直接拼接到SQL语句
    • 仅对telpasssexrepass等参数过滤
    • 地址相关参数无过滤
  3. 验证方法

    • 使用MySQL监控工具观察SQL语句执行
    • 可通过sqlmap自动化验证

0x04 审计工具与方法

  1. MySQL监控工具

    • 推荐使用Java编写的监控工具(文档中提供了下载链接)
    • 可清晰查看实际执行的SQL语句
  2. 审计要点

    • 跟踪用户输入在整个流程中的处理
    • 特别关注数据从编码到解码的过程
    • 检查所有SQL拼接点是否进行充分过滤
  3. XSS审计技巧

    • 不要因前端编码而放弃
    • 关注后台编辑功能可能存在的解码操作
    • 测试数据在不同环节的表现形式

0x05 防御建议

  1. XSS防御

    • 前后端统一编码/解码策略
    • 确保输出时进行适当的HTML编码
    • 对富文本内容使用白名单过滤
  2. SQL注入防御

    • 使用参数化查询或预处理语句
    • 对所有用户输入进行严格过滤
    • 实现统一的数据库操作接口,集中处理安全问题
  3. 其他建议

    • 建立敏感操作日志记录
    • 定期进行安全审计
    • 保持框架和组件更新

0x06 总结

本案例展示了CMS系统中常见的存储型XSS和SQL注入漏洞的发现与分析过程。关键点包括:

  1. XSS漏洞常出现在数据编码/解码不一致的环节
  2. SQL注入多源于未过滤的用户输入直接拼接到查询
  3. 系统性的代码审计需要跟踪数据完整生命周期
  4. 合适的工具可以大大提高审计效率

通过本案例的学习,安全研究人员可以掌握基本的代码审计思路和方法,应用于其他系统的安全评估工作中。

CMS代码审计实战教学文档 0x01 前言 本教学文档基于某CMS系统的代码审计实践,重点分析存储型XSS漏洞和SQL注入漏洞的发现过程与利用方法。该CMS系统在CNVD上披露了相关漏洞,但厂商未修复,因此不公开具体名称。文档旨在提供代码审计的思路和方法。 0x02 存储型XSS漏洞分析 漏洞发现过程 漏洞触发点 :文章标题字段 Payload : <details open ontoggle=confirm(document[ coo + kie ])> 触发条件 : 普通用户在前台发表文章时插入XSS payload 管理员在后台编辑该文章时不修改内容直接保存 代码审计分析 前台处理流程 : 请求路径: /user/release.html 关键函数: release() 处理过程: 检查登录状态 检查违禁词汇(从 webconf['mingan'] 获取) 通过 frparam 函数处理输入数据 调用 format_param 函数进行HTML实体编码( < → &lt; , > → &gt; ) 后台处理流程 : 请求路径: /admin.php/Article/editarticle.html 关键函数: editarticle() 漏洞成因: 后台编辑时同样调用 frparam 函数 但未传入参数导致直接返回URL中的原始数据 更新数据库时将实体编码还原为原始字符 漏洞利用要点 前端输入被实体编码不是最终判断标准 需要跟踪数据在整个流程中的处理过程 特别关注后台编辑功能对数据的二次处理 0x03 SQL注入漏洞分析 漏洞一:文章发布功能注入 漏洞位置 : 请求路径: /user/release.html 注入参数: tid 和 molds 漏洞特征 : 基于时间的延迟注入 SQL语句直接拼接用户输入,无过滤 代码分析 : release() 函数中存在两处SQL拼接 $this->classtypedata 对应数据库 classtype 表 get_fields_data 函数未对输入进行过滤 利用条件 : 只需满足 $w['tid']!=0 漏洞二:用户资料修改功能注入 漏洞位置 : 请求路径: /user/userinfo.html 注入参数: province 、 city 、 address 漏洞特征 : 用户输入直接拼接到SQL语句 仅对 tel 、 pass 、 sex 、 repass 等参数过滤 地址相关参数无过滤 验证方法 : 使用MySQL监控工具观察SQL语句执行 可通过sqlmap自动化验证 0x04 审计工具与方法 MySQL监控工具 : 推荐使用Java编写的监控工具(文档中提供了下载链接) 可清晰查看实际执行的SQL语句 审计要点 : 跟踪用户输入在整个流程中的处理 特别关注数据从编码到解码的过程 检查所有SQL拼接点是否进行充分过滤 XSS审计技巧 : 不要因前端编码而放弃 关注后台编辑功能可能存在的解码操作 测试数据在不同环节的表现形式 0x05 防御建议 XSS防御 : 前后端统一编码/解码策略 确保输出时进行适当的HTML编码 对富文本内容使用白名单过滤 SQL注入防御 : 使用参数化查询或预处理语句 对所有用户输入进行严格过滤 实现统一的数据库操作接口,集中处理安全问题 其他建议 : 建立敏感操作日志记录 定期进行安全审计 保持框架和组件更新 0x06 总结 本案例展示了CMS系统中常见的存储型XSS和SQL注入漏洞的发现与分析过程。关键点包括: XSS漏洞常出现在数据编码/解码不一致的环节 SQL注入多源于未过滤的用户输入直接拼接到查询 系统性的代码审计需要跟踪数据完整生命周期 合适的工具可以大大提高审计效率 通过本案例的学习,安全研究人员可以掌握基本的代码审计思路和方法,应用于其他系统的安全评估工作中。