某cms代码审计二
字数 1615 2025-08-25 22:58:55
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实体编码(<→<,>→>)
- 请求路径:
-
后台处理流程:
- 请求路径:
/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注入多源于未过滤的用户输入直接拼接到查询
- 系统性的代码审计需要跟踪数据完整生命周期
- 合适的工具可以大大提高审计效率
通过本案例的学习,安全研究人员可以掌握基本的代码审计思路和方法,应用于其他系统的安全评估工作中。