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