还是先贴一个参照的博客https://blog.csdn.net/xingyyn78/article/details/79747404
这次做的题目是实验吧中的认真一点吧 http://ctf5.shiyanbar.com/web/earnest/index.php
看到这种题目还是默默感觉到自己的菜。当我看到这道题目的时候,还算好,毕竟他肯定是一道SQL注入
当时当你开始的时候你会发现这玩意根本没那么简单,你稍微一放点东西就被显示说
这时候你通过fuzz测试一下,你会发现,你平常经常使用的sql语句都被过滤,并且一写出来就被显示 Sql injection detected!
但是当你发现奇怪的现象就是好像当你写入or的时候却不会出现这种提示,而且当你往输入框写空格或者逗号都会提示sql注入
这时候我们去看看or写进输入框的时候到底发生了什么?
注意看两个payload是不一样的,这样可以很明显看到这题目过滤了空格,但是当我们写入or却不会,
可现在问题是我们写的这第二个payload好像和我们预想的有点不一样,按理说他应该要返回真的页面啊!!!
这时候穷途末路的我果断去百度看看提示,就是博客最前面链接中所说的其实他这里猜测后端的没有屏蔽or关键字,应该是后台删去了or关键字。使用oorr进行替换,当后台删去or时,or左边的o与右边的r新形成一个or关键字。
所以接下来我们看到任何构造的payload中含有or的时候就需要去使用oorr替换。但是现在还有问题是他屏蔽了空格和逗号,一般这时候我会去使用/**/来代替空格,但是在这里却被他过滤,你可以去试试,并不行,所以现在我们可以使用()括号来将我们的语句分割,至于逗号是用于函数传参的时候才使用的所以我们大可以使用不用逗号传参的函数
接下来我们就来看看,这玩意到底怎么弄
首先,我们需要了解,这页面是有回显内容的,所以我们其实是不需要使用时间盲注的(其实这里也是把sleep屏蔽了,本身就不太行),就是一般的布尔盲注,按照我们盲注的一般流程,首先得到数据库长度,爆数据库名,得到表长度,爆表名,得到字段长度,爆字段
所以我们来构造一下我们的payload id=0'oorr(length(database())>1)oorr'1 这个payload的意思我就不解释了,这样我们确确实实得到了值为true的页面,根据二分法,我们可以接着猜其他的长度,具体的盲注过程我就不多到说,大家可以使用BurpSuite去爆破得到数据库名,可以参考我上一篇博客,看如何使用Burp爆破过程。https://blog.csdn.net/weixiaodegulang/article/details/85376219
其实盲注还是比较繁琐的,说说我盲注碰到的问题,主要就是我构造payload的时候总是会不成功,这时候你就要多看看是不是你的括号多打了还是少打了,甚至很多输出结果你是需要多一对括号才会显示正确,所以各位要冷静一点,那接下来我就把我爆数据库名和表名的payload列出
爆数据库名:id=0'oorr(ascii((mid((database())from(1)foorr(1))))=99)oorr'0
注意:这里由于屏蔽了substring函数所以我们需要使用mid代替,由于不能使用逗号,所以我们使用 from for语法,如果不懂大家可以参考我上一篇文章https://blog.csdn.net/weixiaodegulang/article/details/88982582
你可以发现这数据库长度为18
然后经过ascii 转换就可以知道数据库名称为ctf_sql_bool_blind(这名字有点长)
然后我们爆破表名:id=0'oorr(ascii(mid((select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)='ctf_sql_bool_blind')from(1)foorr(1)))=98)oorr'0
注意:这里你需要把每个以前构造payload的时候用到的空格使用()括号代替。还要把information改成infoorrmation,因为他碰到or会删除的 ,for也是同理改成foorr
按照上面的payload爆破我们就可以知道两个表,fiag表和users表
接着我们爆破列名:id=0'oorr(ascii(mid((select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name)='fiag')from(§1§)foorr(1)))=§120§)oorr'0
得到列名:fL$4G(这里我也不知道为什么我得到的列名和博客开头参考的链接里面提到的列名内容不一样,不知道读者你的是否和我得到的内容一样)
最后我们爆破flag:id=0'oorr(ascii(mid((select(fL$4G)from(fiag))from(1)foorr(1)))=120)oorr'0
值为:flag{haha~you win!}
最后:我想说一句虽然大家都可以看到结果,但是还是强烈建议大家自己去从第一步去爆破一下,你会发现自己的爆破和别人家的爆破完全不一样。祝你好运!