记一次SEMCMS代码审计
字数 1531 2025-08-09 22:00:49
SEMCMS (V3.9) 代码审计与漏洞分析教学文档
一、环境搭建
-
下载源码:
- 从 http://www.sem-cms.com/xiazai.html 下载 SEMCMS V3.9 版本源代码
- 使用 PHPStudy 搭建 Web 环境
-
数据库配置:
- 导入
semcms.sql数据包到数据库 - 设置中间件版本号
- 导入
-
目录结构分析:
/A_Admin - 后台管理界面文件 /Edit - JS 和 HTML 配置文件 /Image - 网页图片资源 /include - 全局包含文件 /install - 数据库备份文件 /Templete - JS 配置和网站配置文件
二、核心安全机制分析
1. 输入过滤机制
位于 /Include/contorl.php 第5-26行:
function verify_str($str) {
return inject_check_sql($str);
}
function inject_check_sql($sql_str) {
return preg_match('/select|insert|=|%|<|between|update|\'|\*|union|into|load_file|outfile/i',$sql_str);
}
function test_input($data) {
$data = str_replace("%", "percent", $data);
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data, ENT_QUOTES);
return $data;
}
过滤特点:
- 过滤 SQL 关键词:
select,insert,union,update等 - 过滤特殊字符:
=,%,<,',* - 大小写不敏感(/i 修饰符)
- 额外处理:空格去除、反斜杠删除、HTML 实体编码
三、漏洞分析与利用
1. SQL 注入漏洞
漏洞位置:web_inc.php 中的 $language 参数处理
$Language = test_input(verify_str($_POST["languageID"]));
绕过方法:
- 使用数字型注入(未过滤数字和比较运算符)
- 利用未过滤的关键词:
and,or,sleep()等
验证步骤:
- 使用 BurpSuite 拦截请求
- 修改为 POST 请求,添加
languageID参数 - 测试布尔型盲注:
languageID=1 and 3>100→ 返回错误页面languageID=1 and 3>2→ 返回正常页面
- 可构造时间盲注:
languageID=1 and sleep(5)
2. 暴力破解漏洞
漏洞位置:/A_Admin/SEMCMS_Function.php
漏洞特点:
- 无登录尝试次数限制
- 无验证码机制
- 密码经过 MD5 加密后比对
利用方法:
- 使用字典暴力破解
- 已知弱口令:
Admin/1
3. 信息泄露漏洞
漏洞位置:登录成功后的 Cookie 设置
setcookie("scusername", $user_name);
setcookie("scuseradmin", $user_admin);
setcookie("scuserpass", $user_ps);
泄露信息:
- 用户名(明文)
- 管理员账号(明文)
- 密码(MD5 哈希值)
利用方法:
- 获取 Cookie 值:
scuserpass=c4ca4238a0b923820dcc509a6f75849b - 使用 MD5 解密得到原始密码
4. 其他潜在漏洞
XSS 漏洞:
- 过滤了
<符号,增加了利用难度 - 需要寻找未严格过滤的输出点
文件包含漏洞:
- 使用
include_once包含文件 - 但未通过参数动态获取包含路径,实际可利用性低
四、防御建议
-
SQL 注入防御:
- 使用预处理语句(PDO/mysqli)
- 完善过滤规则,增加
and,or,sleep等关键词过滤
-
暴力破解防御:
- 实施登录尝试次数限制
- 添加验证码机制
- 使用强密码策略
-
信息泄露防御:
- 避免在 Cookie 中存储敏感信息
- 如需存储,应使用加密或签名机制
-
其他建议:
- 对文件包含使用固定路径白名单
- 实施更严格的 XSS 过滤,使用 CSP 策略
五、审计工具与方法
-
使用 Seay 源代码审计系统:
- 全局搜索关键函数和模式
- 重点关注用户输入处理流程
-
手工审计要点:
- 追踪用户输入从接收到使用的完整路径
- 检查所有过滤函数的完整性和一致性
- 验证所有数据库查询是否使用安全方式
-
动态测试方法:
- 使用 BurpSuite 拦截修改请求
- 构造各种边界条件测试输入过滤
- 验证错误处理机制是否泄露敏感信息
六、总结
SEMCMS V3.9 存在多处安全漏洞,其中 SQL 注入、暴力破解和信息泄露漏洞最为严重。审计时应重点关注输入过滤机制的完整性和一致性,特别是对用户可控数据的处理方式。开发类似系统时应采用更安全的编码实践,如参数化查询、完善的认证机制和最小化的信息泄露。