什么是盲注?
盲注就是在 sql 注入过程中,sql 语句执行的选择后,选择的数据不能回显
到前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
从background-1 中,我们可以知道盲注分为三类 基于布尔SQL盲注、基于时间的SQL盲注、基于报错的SQL盲注。
基于布尔SQL盲注——构造逻辑判断
mid()函数
此函数为截取字符串一部分。MID(column_name,start[,length])
参数 | 描述 |
---|---|
column_name | 必需。要提取字符的字段 |
start | 必需。规定开始位置(起始值是 1) |
length | 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本 |
示例:
1 | MID(DATABASE(),1,1)>’a’ //数据库名第一位 |
查看数据库名第一位的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 | string substring(string, start, length) |
参数描述同mid()函数,第一个参数为要处理的字符串,start为开始位置,length为截取的长度。
示例:
1 | substr(DATABASE(),1,1)>’a’ //数据库名第一位 |
查看数据库名第一位的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 | ORD(MID(DATABASE(),1,1))>114 |
意为检测database() 的第一位ASCII码是否大于114,也即是‘r’
regexp()函数
正则注入此处不做详解可参考文章
https://www.cnblogs.com/lcamry/articles/5717442.html
基于报错的SQL盲注——构造payload让信息通过错误提示回显出来
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 之间找版本号的第一位。但是在我们实际渗透过程中,这种用法是不可取的,因为时间会有网速等其他因素的影响,所以会影响结果的判断。