记一次SEMCMS代码审计
字数 1531 2025-08-09 22:00:49

SEMCMS (V3.9) 代码审计与漏洞分析教学文档

一、环境搭建

  1. 下载源码

    • 从 http://www.sem-cms.com/xiazai.html 下载 SEMCMS V3.9 版本源代码
    • 使用 PHPStudy 搭建 Web 环境
  2. 数据库配置

    • 导入 semcms.sql 数据包到数据库
    • 设置中间件版本号
  3. 目录结构分析

    /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()

验证步骤

  1. 使用 BurpSuite 拦截请求
  2. 修改为 POST 请求,添加 languageID 参数
  3. 测试布尔型盲注:
    • languageID=1 and 3>100 → 返回错误页面
    • languageID=1 and 3>2 → 返回正常页面
  4. 可构造时间盲注:languageID=1 and sleep(5)

2. 暴力破解漏洞

漏洞位置/A_Admin/SEMCMS_Function.php

漏洞特点

  1. 无登录尝试次数限制
  2. 无验证码机制
  3. 密码经过 MD5 加密后比对

利用方法

  • 使用字典暴力破解
  • 已知弱口令:Admin/1

3. 信息泄露漏洞

漏洞位置:登录成功后的 Cookie 设置

setcookie("scusername", $user_name);
setcookie("scuseradmin", $user_admin);
setcookie("scuserpass", $user_ps);

泄露信息

  • 用户名(明文)
  • 管理员账号(明文)
  • 密码(MD5 哈希值)

利用方法

  1. 获取 Cookie 值:scuserpass=c4ca4238a0b923820dcc509a6f75849b
  2. 使用 MD5 解密得到原始密码

4. 其他潜在漏洞

XSS 漏洞

  • 过滤了 < 符号,增加了利用难度
  • 需要寻找未严格过滤的输出点

文件包含漏洞

  • 使用 include_once 包含文件
  • 但未通过参数动态获取包含路径,实际可利用性低

四、防御建议

  1. SQL 注入防御

    • 使用预处理语句(PDO/mysqli)
    • 完善过滤规则,增加 and, or, sleep 等关键词过滤
  2. 暴力破解防御

    • 实施登录尝试次数限制
    • 添加验证码机制
    • 使用强密码策略
  3. 信息泄露防御

    • 避免在 Cookie 中存储敏感信息
    • 如需存储,应使用加密或签名机制
  4. 其他建议

    • 对文件包含使用固定路径白名单
    • 实施更严格的 XSS 过滤,使用 CSP 策略

五、审计工具与方法

  1. 使用 Seay 源代码审计系统

    • 全局搜索关键函数和模式
    • 重点关注用户输入处理流程
  2. 手工审计要点

    • 追踪用户输入从接收到使用的完整路径
    • 检查所有过滤函数的完整性和一致性
    • 验证所有数据库查询是否使用安全方式
  3. 动态测试方法

    • 使用 BurpSuite 拦截修改请求
    • 构造各种边界条件测试输入过滤
    • 验证错误处理机制是否泄露敏感信息

六、总结

SEMCMS V3.9 存在多处安全漏洞,其中 SQL 注入、暴力破解和信息泄露漏洞最为严重。审计时应重点关注输入过滤机制的完整性和一致性,特别是对用户可控数据的处理方式。开发类似系统时应采用更安全的编码实践,如参数化查询、完善的认证机制和最小化的信息泄露。

SEMCMS (V3.9) 代码审计与漏洞分析教学文档 一、环境搭建 下载源码 : 从 http://www.sem-cms.com/xiazai.html 下载 SEMCMS V3.9 版本源代码 使用 PHPStudy 搭建 Web 环境 数据库配置 : 导入 semcms.sql 数据包到数据库 设置中间件版本号 目录结构分析 : 二、核心安全机制分析 1. 输入过滤机制 位于 /Include/contorl.php 第5-26行: 过滤特点 : 过滤 SQL 关键词: select , insert , union , update 等 过滤特殊字符: = , % , < , ' , * 大小写不敏感(/i 修饰符) 额外处理:空格去除、反斜杠删除、HTML 实体编码 三、漏洞分析与利用 1. SQL 注入漏洞 漏洞位置 : web_inc.php 中的 $language 参数处理 绕过方法 : 使用数字型注入(未过滤数字和比较运算符) 利用未过滤的关键词: 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 设置 泄露信息 : 用户名(明文) 管理员账号(明文) 密码(MD5 哈希值) 利用方法 : 获取 Cookie 值: scuserpass=c4ca4238a0b923820dcc509a6f75849b 使用 MD5 解密得到原始密码 4. 其他潜在漏洞 XSS 漏洞 : 过滤了 < 符号,增加了利用难度 需要寻找未严格过滤的输出点 文件包含漏洞 : 使用 include_once 包含文件 但未通过参数动态获取包含路径,实际可利用性低 四、防御建议 SQL 注入防御 : 使用预处理语句(PDO/mysqli) 完善过滤规则,增加 and , or , sleep 等关键词过滤 暴力破解防御 : 实施登录尝试次数限制 添加验证码机制 使用强密码策略 信息泄露防御 : 避免在 Cookie 中存储敏感信息 如需存储,应使用加密或签名机制 其他建议 : 对文件包含使用固定路径白名单 实施更严格的 XSS 过滤,使用 CSP 策略 五、审计工具与方法 使用 Seay 源代码审计系统 : 全局搜索关键函数和模式 重点关注用户输入处理流程 手工审计要点 : 追踪用户输入从接收到使用的完整路径 检查所有过滤函数的完整性和一致性 验证所有数据库查询是否使用安全方式 动态测试方法 : 使用 BurpSuite 拦截修改请求 构造各种边界条件测试输入过滤 验证错误处理机制是否泄露敏感信息 六、总结 SEMCMS V3.9 存在多处安全漏洞,其中 SQL 注入、暴力破解和信息泄露漏洞最为严重。审计时应重点关注输入过滤机制的完整性和一致性,特别是对用户可控数据的处理方式。开发类似系统时应采用更安全的编码实践,如参数化查询、完善的认证机制和最小化的信息泄露。