bool型盲注有区别与之前的基于时间的盲注,bool型盲注的页面输入会影响输出。
我们来看操作理解一下:
语句结构id=1 ,我们去做判断的时候是id=1 and 1=1,and 1=1的本质是返回一个true,true可以用1来代替,正常回显。我们很多时候就会去接and=0,0类似于1=2返回是false, false类似于0的作用。
最后会影响到查询结果的是后面的0和1。
比如说触发查询数据,if触达的sleep执行成功返回SLEEP,执行失败返回0,
如果映射到bool型盲注这里不再是sleep,返回的结果变成1和0,如果if语句成功执行,它返回结果就是1和1,它不能成功执行返回的就是1和0。可以根据页面的返回内容来判断出到底语句查询是成功还是失败。bool型盲注的逻辑和基于时间的盲注是类似的,只不过判断的方法上是略微有点区别。理解了基于时间的盲注后再回过头来理解bool型盲注其实还应该是比较容易的。
先分享一些场景下截取相关的函数作为知识补充,然后分享一道题。
(说起截取函数在第三节内容中提到过SUBSTRING函数,它是支持这种结构的,)
mid函数 、ORD()函数 、ASCII()函数
题目分享:
连接数据库操作,查询user id是否存在,如果存在这个值,查询出数据是一条就会进入到下面的一个逻辑中去。我们刚才返回的是“ error password”,出现这个结果是因为下面逻辑没有满足:
针对bool型注入,是不是只要你能够有一个true and fasle,就可以了,可以针对下面这个语句进行注入:
如果数据中存在id就会走到上面的if else 逻辑里面去,因为我们不知道密码,最终返回的是error password。如果id是不存在的,它返回来就不会是一条是零条,所以它返回的就是一个error user id。
验证一下,我们将user id 改成0
返回的是 error userid,说明,当userid 是0或1的时候对输出产生了影响,基于这里,我们就已经可以对它做一个盲注。我们来写一下脚本,和之前的逻辑一样引入一个库:
写脚本思路:
对它做一个分割和分离,分离的时候我们要看他的过滤机制到底是哪一些。
*- 空格不能用,但可以用内联注释
- 不能引号就用阿斯克码来代替
*
小于127,返回error password,
大于127,返回 error userid。
做盲注的时候可以将大于号变成等号,用二分法更快一点。
再举一个放字母的栗子:
直接复制下链接:
请求发出去之后对它做一个判断,定义一个变量,操作如图:
可以随便设time,out,但不能设太低,会直接报错。这个请求发出去后会有一个response返回来,如果我们去检测response中的内容,
我们想要的是error password
(content就是response中的页面的信息),针对页面信息我们去做个匹配,使用find进行匹配,找不到就返回-1,找到了就要做个添加,操作如图:
找到后对返回值做添加:
继续等待返回结果:
以上内容参考安全牛课堂《CTF从入门到提升》