CTFshow学习笔记---sql盲注:web-174
首先是使用这个靶场的踩坑的地方(搞了一两个小时,都怀疑人生了愣是没有发现,笑死.jpg),靶场调用的时候把174的查询指向了173,需要将跳转url中的select-no-waf-3.php改为select-no-waf-4.php。
环境回归正常,首当其冲的就是判断闭合,判断闭合的三板斧轮番上:
- 数字闭合 直接加注释符合就可以了。
- 字符类型的:a、单引号,b、双引号,c、a,b两者加括号。
本次测试中尽量模拟黑盒环境学习(题目给了sql语句的,手动狗头.jpg)测试闭合为 ’ 闭合。
其次来到判断有几个列,order by 直接二分法开测,得到结果2。
然后判断回显直接一键union select ,出现问题了,union select 1,2--+没有回显,百思不得其解(有些时候题目给的环境作为犟种的鄙人非得和出题人反着来),回到题目发现过滤了数字回显。
这里是由一些值得注意的,判断列数之前的步骤均没有问题,独独回显位置无法正常显示的时候可以考虑回显被过滤了。使用字符替代数字时记得将类型体现出来(也就是不能union select a,b需要union select ‘a’,’b’)。
接下来,查数据库:database()代替’a’。查表名使用union select table_name,'b' from information_schema.tables where table_schema=database()--+,发现哎,没回显了!回头想想可能是包含数字被过滤了。
进入到今天的正式环节-盲注。没有回显我第一时间想到的是延时注入。但是回过头来看之前判断闭合是否成功时我们使用了1’ and 1=1 和1’ and 1=2 发现后者是没有回显的,那我是不是可以将我and后的内容换为我们要的判断呢(先头铁的用延时慢慢使用burp跑,人傻了我)。使用最简单的语句判断是否可行,1' and length(database())=11发现有回显且ctfshow_web也的确是11个字符,得吃得吃,直接变为布尔盲注。
最后就是布尔盲注三板斧:判断表名长度,用ASCII挨个判断表名;判断列名长度,挨个判断列名,最后就是判断内容长度,挨个判断内容。
回到刚开始的设想----延时注入1' and if(length(database())=11,sleep(5),1),如果不是burp跑手测记得使用<或者>来进行缩小范围不然会很难受的。
细节:
1、使用limit 对返回的值进行按个处理例如:
第一个表名长度:'and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))=i--+
第二个表名长度 'and length((select table_name from information_schema.tables where table_schema='security' limit 1,1))=i--+
2、使用substr(”str”,i,1)来取第i个字符。例如:
'and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=117--+