某物流软件存在sql注入漏洞分析
字数 1276 2025-08-22 18:37:22
SQL注入漏洞分析与防御教学文档
1. 漏洞概述
本物流系统存在多处SQL注入漏洞,攻击者可通过构造恶意SQL查询语句插入到Web表单或查询字符串中,欺骗服务器执行恶意SQL命令。这些漏洞可能导致:
- 数据库信息泄露(包括账号密码)
- 通过xp_cmdshell执行系统命令
- 服务器被完全控制
2. 漏洞原理
SQL注入的核心原理是:应用程序未对用户输入进行充分验证和过滤,直接将用户输入拼接到SQL语句中执行。
2.1 危险函数和操作
QueryString:获取URL参数ToString():将输入转换为字符串- 直接拼接SQL语句(如
"SELECT ... WHERE LINKID = '" + strLINKID + "'") xp_cmdshell:SQL Server扩展存储过程,可执行系统命令
3. 漏洞代码分析
3.1 第一处SQL注入漏洞
位置:CompanysSysDeptGridSource.aspx页面
漏洞代码:
if (base.Request.QueryString["LINKID"] != null) {
this.strLINKID = base.Request.QueryString["LINKID"].ToString();
}
// 在GetCells方法中
string text = "SELECT GID,LINKID,DEPTNO,DEPTNAME,MANAGE1,MANAGE2,FINANCESOFTCODE,REMARK,CREATEUSER,CREATETIME,MODIFIEDUSER,MODIFIEDTIME FROM sys_dept WHERE LINKID = '" + this.strLINKID + "' ORDER BY DEPTNO ASC";
问题:
LINKID参数直接从请求中获取,未经任何过滤或参数化处理- 直接拼接到SQL语句中
利用方式:
构造恶意LINKID参数值:
';WAITFOR DELAY '0:0:5'--
拼接后的SQL语句:
SELECT ... FROM sys_dept WHERE LINKID = '';WAITFOR DELAY '0:0:5'--' ORDER BY DEPTNO ASC
POC:
GET /Shipping/CompanysSysDeptGridSource.aspx?read=exist&showcount=10&LINKID=%27;WAITFOR%20DELAY%20%270:0:5%27-- HTTP/1.1
3.2 第二处SQL注入漏洞
位置:AttributeAdapter.aspx页面
漏洞代码:
if (base.Request.QueryString["attrid"] != null) {
this.strAttributeID = base.Request.QueryString["attrid"].ToString().Trim();
}
string text = "";
if (this.strAttributeID != null) {
text = " AND A.GID = '" + this.strAttributeID + "'";
}
string text2 = string.Format("SELECT A.GID,A.NAME,A.DESCRIPTION,A.DEFAULTVALUE,B.NAME AS TYPENAME,A.TYPEID from attribute as A INNER JOIN attribute_type as B ON A.TYPEID = B.GID WHERE 1 > 0 AND ISNULL(A.ISDELETE,0) <> 1 AND ISNULL(B.ISDELETE,0) <> 1 {0} ORDER BY A.DESCRIPTION ASC", text);
问题:
attrid参数未经处理直接拼接到SQL语句- 使用
string.Format拼接SQL语句,同样不安全
POC:
GET /FeeCodes/AttributeAdapter.aspx?handle=attrinfo&attrid=1%27;WAITFOR%20DELAY%20%270:0:5%27-- HTTP/1.1
4. 漏洞危害
- 数据泄露:可获取数据库中的所有数据
- 权限提升:通过
xp_cmdshell执行系统命令 - 服务器控制:上传木马,完全控制服务器
- 数据篡改:修改、删除数据库内容
5. 修复方案
5.1 参数化查询
使用参数化查询代替字符串拼接:
// 使用SqlParameter
string sql = "SELECT * FROM sys_dept WHERE LINKID = @linkid";
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.Parameters.AddWithValue("@linkid", strLINKID);
5.2 输入验证
对所有输入参数进行严格验证:
// 验证LINKID是否为预期格式(如数字或特定格式的字符串)
if (!Regex.IsMatch(strLINKID, @"^[a-zA-Z0-9\-]+$")) {
throw new ArgumentException("Invalid LINKID format");
}
5.3 最小权限原则
- 数据库连接使用最小必要权限的账户
- 禁用
xp_cmdshell等危险存储过程
5.4 使用ORM框架
考虑使用Entity Framework等ORM框架,避免直接编写SQL语句。
5.5 错误处理
- 不要将详细错误信息返回给客户端
- 使用自定义错误页面
6. 防御措施
-
代码层面:
- 所有数据库操作使用参数化查询
- 实施严格的输入验证
- 使用安全的API和框架
-
架构层面:
- 部署WAF(Web应用防火墙)
- 定期进行安全审计和代码审查
- 实施安全开发生命周期(SDL)
-
运维层面:
- 定期更新和打补丁
- 数据库配置安全加固
- 监控和日志分析
7. 测试验证
修复后应进行以下测试:
- 尝试使用原有POC测试,应返回错误或无效结果
- 使用SQL注入测试工具扫描
- 进行全面的安全测试
8. 总结
SQL注入是最常见且危险的Web漏洞之一。通过本案例可以看出,简单的字符串拼接就能导致严重的安全问题。开发人员必须:
- 永远不要信任用户输入
- 始终使用参数化查询
- 实施深度防御策略
- 保持安全意识教育
通过综合应用上述修复方案和防御措施,可有效防止SQL注入攻击,保障系统安全。