金山终端安全系统V9.0 SQL注入漏洞
字数 1348 2025-08-06 08:35:11
金山终端安全系统V9.0 SQL注入漏洞分析与复现
一、漏洞概述
金山终端安全系统(原金山安全)V9.0版本存在一处SQL注入漏洞,该漏洞位于update_software_info_v2.php文件中,由于对用户输入参数过滤不严,导致攻击者可以构造恶意SQL语句进行注入攻击。
二、漏洞影响版本
- 受影响版本:V9.SP1.E1001及之前版本
- 已修复版本:官方发布的最新修复版本
三、漏洞环境搭建
1. 环境要求
- 操作系统:Windows Server(测试使用Windows Server 2012)
- 软件包:SecManage.iso(可从官方下载:http://duba-011.duba.net/netversion/Package/SecManage.iso)
2. 安装步骤
- 解压SecManage.iso安装包
- 运行SecManage.exe进行管理中心安装
- 默认安装路径:
C:\SecManage - 安装完成后,系统会监听6868端口
四、漏洞定位与分析
1. 漏洞文件位置
C:\SecManage\Console\inter\update_software_info_v2.php
2. 漏洞代码分析
// 问题代码段
if ($postdata['type'] != null && $postdata['type'] != "") {
$id = $postdata['type'];
$where .= " and type=$id"; // 直接拼接用户输入到SQL语句中
}
// SQL语句构建
$sql = "SELECT * FROM table_name WHERE 1=1 $where";
3. 安全检测机制分析
系统在C:\SecManage\Console\inter\common\checksql.php中实现了参数检查:
function checkParam($postData, $keyData) {
// 检查参数完整性
if (!checkParamFull($postData, $keyData)) {
return array("nResult" => 1); // 参数不完整
}
// SQL注入检查
if (checksql($postData)) {
return array("nResult" => 25); // 检测到SQL注入
}
return true;
}
function checksql($param) {
// 递归检查数组或对象
if (is_array($param) || is_object($param)) {
foreach ($param as $value) {
if (checksql($value)) {
return true;
}
}
return false;
}
// 白名单检查
if (file_exists("checkWhiteList.php")) {
require_once("checkWhiteList.php");
if (in_array($param, $checkWhiteList)) {
// 执行一些安全处理
$param = addslashes($param);
$param = str_replace("%", "\%", $param);
$param = str_replace("_", "\_", $param);
$param = nl2br($param);
$param = htmlspecialchars($param);
return false;
}
}
// SQL注入正则检测
$pattern = "/(select|insert|update|delete|union|into|load_file|outfile|substr|ascii|declare|exec|count|master|drop|execute|truncate|char|or|and)/i";
if (preg_match($pattern, $param)) {
return true;
}
return false;
}
五、漏洞复现
1. 原始POC获取
通过抓包工具(如Burp Suite)捕获xpc扫描器的请求流量,可以获取漏洞验证的原始POC。
2. 漏洞验证步骤
- 访问系统管理界面(默认端口6868)
- 拦截
update_software_info_v2.php的请求 - 构造恶意type参数,如:
type=1 AND 1=CONVERT(int, (SELECT table_name FROM information_schema.tables)) - 观察系统响应
3. 绕过安全检测的方法
在受影响版本中,可以尝试以下方法绕过检测:
- 使用注释分割关键字:
/**/ - 使用URL编码
- 使用大小写变异
- 使用等价函数替换
六、漏洞修复方案
1. 官方修复方案
升级到官方发布的最新版本,修复方案包括:
- 加强输入参数过滤
- 使用参数化查询替代字符串拼接
- 完善SQL注入检测规则
2. 临时防护措施
如果无法立即升级,可采取以下措施:
- 修改
update_software_info_v2.php文件,对type参数进行强制类型转换:
$id = intval($postdata['type']);
- 加强WAF规则,拦截可疑的SQL注入尝试
- 限制访问IP,只允许可信网络访问管理系统
七、漏洞利用限制
- 需要有效的用户凭证(在某些配置下可能不需要)
- 受checksql.php检测机制限制(在受影响版本中检测可能不完善)
- 注入结果需要通过系统响应体现,可能存在信息回显限制
八、参考链接
九、学习要点总结
- SQL注入漏洞通常源于未过滤的用户输入直接拼接到SQL语句中
- 安全检测机制可能存在绕过可能,需要多层防御
- 漏洞复现需要搭建真实环境,注意版本匹配
- 参数化查询是预防SQL注入的最有效方法之一
- 正则表达式检测是常见的SQL注入防御手段,但需要不断更新规则