1. 布尔盲注
1)例题#布尔盲注案例
- 布尔盲注定义
- 布尔盲注: 布尔盲注是SQL注入的一种,通过页面返回的True或False来获取数据库中的相关信息。
- 靶场案例
- 源代码分析
- 数据返回与显示
- 数据返回: 查询语句执行后,数据会返回到前端页面。
- 显示逻辑: 如果有数据返回,页面显示“You are in...”;如果没有数据,则不显示任何内容。
- 布尔盲注的应用
- 无回显情况: 当页面没有直接显示查询数据时,可以使用布尔盲注来推断数据库信息。
- 布尔盲注原理: 通过构造特定的SQL语句,观察页面返回的是True还是False,从而推断出数据库中的某些信息。
2)
- 二分法拆解数据库名字
二分法拆解数据库名字是通过“二分查找”的策略来逐步推断数据库的名称的一种方法,常用于布尔盲注攻击中。它是一种优化的 SQL 注入攻击方式,攻击者通过不断缩小猜测范围来快速推测出数据库名称或其他敏感信息。
1. 二分法的概念:
二分法的核心思想是将问题的可能解区间逐渐缩小,每次都选取中间值进行判断,从而快速找到目标值。对于数据库名的拆解,攻击者会通过构造不同的SQL查询来验证中间字符是否符合某种条件,从而逐步缩小数据库名的可能范围。
2. 如何使用二分法拆解数据库名:
假设攻击者想要知道数据库的名字,并且假设数据库名的长度是已知的。攻击者可以按以下步骤操作:
步骤 1: 确定字符集范围
攻击者首先需要确定数据库名的字符集范围,通常是可打印字符,如字母(大小写)、数字、符号等。
步骤 2: 逐字符猜测
假设数据库的名称是
testdb
,攻击者会通过构造SQL语句来猜测数据库名的每个字符。例如,如果数据库名的长度是 7,攻击者将从第一个字符开始猜测,逐个字符尝试。步骤 3: 使用布尔盲注验证字符
攻击者通过SQL注入向应用程序发送查询,构造一个包含布尔条件的语句,通过该条件判断字符是否符合某个值。例如,攻击者可以用以下方式测试第一个字符:
' AND SUBSTRING(database(), 1, 1) = 'a' --
其中
database()
是返回当前数据库名的 SQL 函数,SUBSTRING()
函数用来获取数据库名的某个字符(这里是第一个字符),'a'
则是我们猜测的字符。根据应用程序的响应(页面内容是否变化、错误信息等),攻击者可以判断当前字符是否正确。步骤 4: 利用二分法优化查询
假设攻击者已经猜到数据库名的第一个字符并验证了正确性,接下来可以使用“二分法”进一步缩小字符集范围。例如,针对第二个字符,攻击者可以根据布尔条件的结果缩小范围。假设猜测的字符集范围是字母(
a
到z
),可以通过将范围分为两半,尝试以下条件:' AND SUBSTRING(database(), 2, 1) > 'm' --
如果返回为
TRUE
,则说明数据库名的第二个字符大于m
,攻击者就可以进一步缩小字符集范围,继续猜测。如果返回为FALSE
,则说明字符小于或等于m
,攻击者可以继续在前半部分猜测。步骤 5: 逐步推测所有字符
重复上述过程,攻击者会逐个字符地猜出数据库名称的所有字符。每次查询后,通过布尔条件判断当前字符是否符合,利用二分法缩小猜测范围,从而快速拆解出完整的数据库名。
3. 示例:
假设目标数据库名的长度是 7,并且攻击者正在尝试通过二分法拆解它。具体的猜测可能如下:
-
数据库名的第一个字符:
' AND ASCII(SUBSTRING(database(), 1, 1)) > 77 --
如果响应为
TRUE
,说明第一个字符的 ASCII 值大于 77,那么字符应该是字母n
到z
之间。接着,攻击者可以继续调整条件,缩小范围,最终猜出第一个字符。 -
数据库名的第二个字符:
' AND ASCII(SUBSTRING(database(), 2, 1)) > 115 --
通过逐步优化查询条件,攻击者最终能够获得数据库名的第二个字符。
- 应用案例
- 例题#猜解数据库名字
-
- 判断注入点和数据类型: 通过and 1=1和or 1=1判断注入点,观察页面返回状态确定数据类型和闭合方式。
- 确定数据库名字长度: 使用length(database())函数判断数据库名字的长度。
- 二分法逐位猜解:
- - 从第一位开始,使用ascii(mid(database(),1,1))结合二分法猜解ASCII码值。
- - 根据页面返回状态(True或False),不断调整猜测的ASCII码值范围,直到确定正确的ASCII码值。
- - 将ASCII码值解码为字符,得到数据库名字的第一位。
- - 重复上述步骤,逐位猜解数据库名字的每一位字符。
-
-
- 答案: 最终得到数据库名字为“security”。
- 易错点:
- 在使用二分法猜解ASCII码值时,要注意范围的选择和调整,避免范围过大导致猜解效率低下。
- 要确保每次猜解后都根据页面返回状态进行正确判断,避免误判导致猜解结果错误。
-
- 总结归纳
- 盲注类型: 盲注分为三种类型:布尔型盲注、时间型盲注和报错型盲注。
- 布尔型盲注: 根据页面返回的真假来判断。
- 时间型盲注: 根据页面返回的时间长短来判断。
- 报错型盲注: 根据页面返回的对错(即是否报错)来判断。
- 注意事项:
- 在进行布尔盲注时,首先要判断注入点和数据类型,确保后续操作的有效性。
- 二分法是一种高效的猜解方法,但需要注意范围的选择和调整,以及每次猜解后的正确判断。
- 盲注攻击通常用于没有回显的情况,通过不断尝试和判断来获取数据库信息,因此需要有耐心和细心。
- 盲注类型: 盲注分为三种类型:布尔型盲注、时间型盲注和报错型盲注。
二、知识小结
知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
布尔盲注 | 逻辑判断,基于页面返回数据(true/false)进行注入 | 布尔盲注定义及原理 | 🌟🌟🌟 |
注入流程 | 判断注入点、数据类型、提交方式 | 注入点判断、数据类型识别 | 🌟🌟 |
二分法拆解 | 通过二分法减少拆解数量,提高效率 | 二分法原理及应用 | 🌟🌟🌟🌟 |
数据库名拆解 | 使用哈希函数对照ASCII值,逐位拆解 | 哈希函数使用、ASCII对照表 | 🌟🌟🌟🌟 |
表名拆解 | 结合LIMIT函数,逐位拆解表名 | LIMIT函数使用、表名拆解逻辑 | 🌟🌟🌟🌟 |
版本号判断 | 通过布尔盲注判断数据库版本号 | 版本号判断方法 | 🌟🌟🌟 |
盲注类型 | 基于页面状态、时间长短、强制性报错 | 三种盲注方式的理解与区分 | 🌟🌟🌟 |