SQL注入测试是Web应用安全评估的核心环节,合规性安全评估要求测试过程合法、流程规范、结果可溯源。Sqlmap是一款自动化的SQL注入检测工具,支持多种数据库类型的注入检测,能够大幅提升测试效率,是开展合规SQL注入测试的重要工具。

SQL注入测试前期准备
在开展测试前,需要完成以下准备工作,确保测试过程符合合规要求:
- 获得目标系统的书面授权,明确测试范围、测试时间、测试限制,禁止对未授权系统进行测试
- 搭建独立的测试环境,优先使用预发布环境或专门的靶场环境,避免对生产环境造成影响
- 安装最新版本的Sqlmap工具,同时准备目标系统的请求数据包、登录凭证等必要信息
使用Sqlmap开展基础注入检测
基础检测是SQL注入测试的第一步,主要目标是发现目标系统中存在的注入点。以下是基础检测的常见操作:
检测GET型注入点
如果目标URL存在GET参数,可以直接使用Sqlmap对参数进行检测,示例命令如下:
# 检测目标URL的id参数是否存在注入 python sqlmap.py -u "http://ipipp.com/test.php?id=1" --batch
命令中的--batch参数表示使用默认配置自动执行,无需手动交互,适合批量检测场景。
检测POST型注入点
对于POST请求的注入点,需要先抓取请求数据包保存为文件,再让Sqlmap读取数据包进行检测:
# 读取data.txt中的POST数据包检测注入 python sqlmap.py -r data.txt --batch
data.txt文件中需要包含完整的HTTP请求头和内容,Sqlmap会自动识别其中的参数进行注入测试。
进阶注入测试与漏洞验证
发现注入点后,需要开展进阶测试,进一步验证漏洞的危害程度,同时提取必要信息用于合规报告:
获取数据库基础信息
确认注入点存在后,可以先获取数据库的类型、版本、当前用户等信息:
# 获取数据库类型、版本、当前用户 python sqlmap.py -u "http://ipipp.com/test.php?id=1" --current-db --current-user --batch
枚举数据库结构
如果需要验证漏洞是否可获取敏感数据,可以在合规授权范围内枚举数据库表和字段:
# 枚举目标数据库的所有表 python sqlmap.py -u "http://ipipp.com/test.php?id=1" -D test_db --tables --batch # 枚举指定表的字段 python sqlmap.py -u "http://ipipp.com/test.php?id=1" -D test_db -T user --columns --batch
注意:合规测试中禁止获取、留存业务敏感数据,仅验证漏洞存在即可,测试完成后需及时清除测试产生的痕迹。
测试结果分析与合规报告输出
测试完成后,需要对Sqlmap的输出结果进行整理,形成符合合规要求的安全评估报告,报告需要包含以下内容:
- 测试目标的基本信息、授权范围、测试时间
- 发现的SQL注入漏洞位置、注入类型、危害等级
- 漏洞验证的截图、Sqlmap输出的关键日志
- 对应的修复建议,例如使用参数化查询、输入过滤、最小权限原则等
以下是常见的SQL注入修复方案示例,使用参数化查询避免注入:
<?php
// 错误示例:直接拼接SQL语句,存在注入风险
$sql = "SELECT * FROM user WHERE id = " . $_GET['id'];
// 正确示例:使用PDO参数化查询,避免注入
$dbh = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $dbh->prepare("SELECT * FROM user WHERE id = :id");
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll();
?>
合规测试注意事项
所有SQL注入测试必须获得目标系统所有者的书面授权,禁止对任何未授权的系统进行测试,测试过程需全程记录操作日志,确保可追溯。
测试过程中应避免使用可能造成业务中断的Payload,例如--os-shell等高风险操作,仅在必要且获得额外授权的情况下使用。测试完成后,需及时停止测试进程,清除测试过程中在目标系统留下的临时数据。