sqli-labs:Less-5

Less 5实验主要是:字符型、单引号、报错注入、双注入

首先输入:http://localhost/Less-5/?id=1' 报错:

输入: http://localhost/Less-5/?id=1' and 1=1 %23 和 http://localhost/Less-5/?id=1' and 1=2 %23,返回正常页面:

这里基本可以确定是字符型注入,但和Less1不一样的是没有正常页面的回显,只有错误页面的报错信息,这是一种字符型、报错注入。所以这是一个一种新的情况。

我们首先要了解一下什么是报错注入。我们在源码中看到报错回显的函数是 mysql_error()

mysql_error() 函数返回上一个 MySQL操作产生的文本错误信息,上一个操作可以推测出是字符型的查询:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

接下来我们介绍一下报错注入。我们用函数floor()和函数rand()来进行学习,其中:
floor函数的作用是返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分。
rand()函数可以用来生成0或1,但是rand(0)和rand()还是有本质区别的,rand(0)相当于给rand()函数传递了一个参数,然后rand()函数会根据0这个参数进行随机数成成。rand()生成的数字是完全随机的,而rand(0)是有规律的生成,我们可以在数据库中尝试一下。首先测试rand()

具体我们登录到sqli-labs的数据库命令行下,看一下这两个函数的使用和演示:
select floor(rand()*2) from mysql.user;

select floor(rand(0)*2) from mysql.user;

这里我们多次执行上面两个语句,会发现rand(0)其实是一个伪随机,每次结果都是一样。

接下来我们执行语句:
select count() , concat((floor(rand()2)),';',(select version()))name from mysql.user group by name;

这条语句一直是正确的输出

扫描二维码关注公众号,回复: 10315624 查看本文章

select count() , concat((floor(rand(0)2)),';',(select version()))name from mysql.user group by name;

而这条语句会出现报错信息,这个报错的原因是:
意思是说group_key条目重复。我们使用group by进行分组查询的时候,数据库会生成一张虚拟表,在这张虚拟表中,group by后面的字段作为主键,所以这张表中主键是name,这样我们就基本弄清报错的原因了,其原因主要是因为虚拟表的主键重复。按照MySQL的官方说法,group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。
同时我们在这里看到了报错信息中有了敏感信息,就是select version()数据库版本显示出来了。

我们把这个语句放到页面上来操作:
http://localhost/Less-5/?id=1' union select count(),1,concat((floor(rand(0)2)),';',(select version()))name from mysql.user group by name; %23

这里我们看到把数据库版本号暴出来了。

我们还可以暴一下user表里的密码
http://localhost/Less-5/?id=1' union select count(),1,concat((floor(rand(0)2)),';',(select password from users limit 1,1))name from mysql.user group by name; %23

猜你喜欢

转载自www.cnblogs.com/tangjf10/p/12600173.html