0%

sqli-labs-Background-2 盲注

什么是盲注?

盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显
到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

从background-1 中,我们可以知道盲注分为三类 基于布尔SQL盲注、基于时间的SQL盲注、基于报错的SQL盲注

基于布尔SQL盲注——构造逻辑判断

mid()函数

此函数为截取字符串一部分。MID(column_name,start[,length])

参数 描述
column_name 必需。要提取字符的字段
start 必需。规定开始位置(起始值是 1)
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本

示例:

1
2
MID(DATABASE(),1,1)>’a’     //数据库名第一位
MID(DATABASE(),2,1) //数据库名第二位

查看数据库名第一位的ASCII值是否大于a。返回true或flase

1
MID((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’

此处column_name参数可以为sql语句,可自行构造sql语句进行注入。

substr()函数和substring()函数

Substr()substring() 函数实现的功能是一样的,均为截取字符串。

1
2
string substring(string, start, length)
string substr(string, start, length)

参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。

示例:

1
2
substr(DATABASE(),1,1)>’a’  //数据库名第一位
substr(DATABASE(),2,1) //数据库名第二位

查看数据库名第一位的ASCII值是否大于a。返回true或flase

1
substr((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’

此处string参数可以为sql语句,可自行构造sql语句进行注入。

left()函数

Left() 得到字符串左部指定个数的字符

1
left(string,n)        //string为要截取的字符串,n为长度。

示例:

1
left(database(),1)>'a'

查看数据库名第一位的ASCII值是否大于a。返回true或flase

同样的,string可以为自行构造的SQL语句

ORD()函数和ascii()函数

返回第一个字符的ASCII码,经常与上面的函数进行组合使用。

示例:

1
2
ORD(MID(DATABASE(),1,1))>114
ascii(MID(DATABASE(),1,1))>114

意为检测database() 的第一位ASCII码是否大于114,也即是‘r’

regexp()函数

正则注入此处不做详解可参考文章
https://www.cnblogs.com/lcamry/articles/5717442.html

基于报错的SQL盲注——构造payload让信息通过错误提示回显出来

mysql-bug #8652

BUG #8652的主要内容就是在同时使用RAND()**函数,聚集函数COUNT()GROUP BY**子句进行操作时会返回duplicate key 错误,而这个错误将会披露关键信息

详细原理可以参考这篇文章:https://blog.csdn.net/weixin_43249758/article/details/104168777

基于时间的SQL盲注——延时注入

使用sleep()函数
示例:

1
If(ascii(substr(database(),1,1))>115,0,sleep(5))%23

if判断语句,条件为假,执行sleep

1
select sleep(find_in_set(mid(@@version, 1, 1),'0,1,2,3,4,5,6,7,8,9,.'));

该语句意思是在 0-9 之间找版本号的第一位。但是在我们实际渗透过程中,这种用法是不可取的,因为时间会有网速等其他因素的影响,所以会影响结果的判断。