当前位置: 首页 > 科技观察

SQLInjectionGeneralFuzz全录

时间:2023-03-12 04:55:06 科技观察

前言本文在ctfbugku的一道sql盲注题(题名地址:注入题)中使用了fuzz的思想,完整记录了整个fuzz过程,并作为攻略大师小吃,让大家加深对websqlinjectionfuzz的理解。进入主题1.进入主题,就是一个典型的登录框2.尝试输入admin/123456,提示密码错误,所以可以确认有用户admin,可能有高手要爆到这里,不过这里的题目需要sql注入,我们会按照预期的解决方案来。3、自己写了一个简单的fuzzburp插件。首先,我将登录请求包发送给插件进行扫描。可以看到有盲注。payload的形式为:4.Fuzz(1)从payload的形式可以猜出主题应该是过滤评论字符(-+和#)(2)Fuzz特殊字符,看过滤了什么.当有过滤字符的时候,响应包是这样的,所以可以作为fuzz判断(当然有的waf是silentwaf,就是照常接收你的数据但是自己处理然后返回普通页面,有时候需要针对这种fuzz判断设计你的payload,以后的文章会讲)Fuzz特殊字符,结果如下,可以看到长度为370的是wa,a过滤了很多字符,尤其是行内注释空间%0a%0b%0d%a0,比较常用来绕过关键组件,尤其要注意逗号的过滤(3)再次fuzz关键字,过滤和or顺序unionfor等,所以不能使用常用的数据检索的mid(xxfromxxforxx),并且在mid(xx,1,1)之前也过滤掉了逗号。(4)fuzz函数名和运算符(因为插件扫描结果没有过滤sleep,直观上,函数没有过滤)不出意外,只有包含or和是wa等关键字的函数,其他基本没有。其实这里我们也可以认为跑表经常用到的information_schema表有or关键字,所以后面构造语句的时候不能直接用information_schema(5)去尝试时间盲注入跑数据if(11=1,sleep(5),0)需要改成CASEWHEN(11=1)THEN(sleep(5))ELSE(2)END因为不能用逗号,但是也过滤了空格,需要加上括号用于代替空格(/*!*/空格选项卡%a0%0d%0a全部被过滤)(CASEWHEN(11=1)THEN(sleep(1))ELSE(1)END);最后在本地测试的时候,发现casewhen之间不能用括号,做字符fuzz,从%00到%ff,可以看出结果真的不行,不能产生延迟(有的直接wa了,有的不wa但是sql语句不能生效),所以基本可以确认时间盲注不能用跑数据,所以只能考虑布尔盲注(6)试试布尔盲注因为if或者case/when都不能用,我们只能用标题自带的bool盲注来做逻辑判断(=)比如一开始我们注意到有一个admin用户,修改插件的有效载荷:'+sleep(5)+'(注意+被%2b代替)admin'+1+'(false,注意+被%2b代替)admin'+0+'(true,注意将+替换为%2b)select*fromuserwherename='admin'+1+''andpasswd='123456';(forfalse)==>提示用户名错误select*fromuserwherename='admin'+0+''andpasswd='123456';(fortrue)==>提示密码错误这是mysql的一个特性,可能有高手不懂,可以做下实验select'admin'='admin'+0unionselect'admin'='admin'+1;前者为1,后者为0。首先对右边的等式进行运算,发生强制转换,结果为数字。然后和左边的admin字符比较,发生强制转换,所以1和0不同。这样我们就可以解决布尔盲注的判断了。(7)解决运行数据问题。这里我们不能使用mid(xxx,1,1)或者mid(xxxfrom1for1),但是可以查看手册发现可以使用mid(xxxfrom1),意思是把from中剩下的所有字符都取出来第一个字符,取ascii函数时会被截断,所以用ascii(mid(xxxfrom1))得到第一个字符的ascii码,ascii(mid(xxxfrom2))可以取第二个ascii,等等(8)Burp运行数据a.判断passwd字段长度:passwd字段长度为32(这里可以猜字段,根据post请求包中的passwd猜测数据库的字段也应该是passwd,这样就可以得到passwd直接在login查询语句中,不运行information_schema)b.这里运行第一个payload不是上面那个,从最后面往回抓取数据,然后再Reverse一遍。当时我做题的时候并没有转弯。事实上,它们都是一样的。使用下面的payload的好处是如果ascii不支持截断不会报错(在其他数据库中使用时)=admin'-(ascii(mid(REVERSE(MID((passwd)from(-1)))from(-1)))=48)-'你也可以用这个=admin'-(ascii(mid(passwd)from(1))=48)-'重复以上操作修改偏移量,可以得到32位密码005b81fd960f61505237dbb7a3202910并解码得到admin123,登录得到flag,解题过程到此结束。小结1、上面用到的fuzz字典可以在sqlmap字典和mysql官方手册中收集到。2.这只是一个常规的fuzz,但是大部分的fuzz其实都是相通的,主要是fuzz的判断,fuzz的位置,fuzzpayload的构建技巧等等,欢迎各位高手一起交流探讨!