想法:waf的绕过是门学问,记得sqlmap的使用有提到绕过waf的概念,输入数据的时候也要考虑到waf的影响,尤其是写一句话木马的时候,有的时候需要多次的嵌套来绕过waf的正则检测。听安全大佬们说,waf这东西对于渗透高手来说没啥卵用,形同虚设,但咱也不知道啊,咱也不敢问啊,可咱可以学啊,哈哈哈哈!!!
**
思想
**
基本思想:是转换我们需要的请求,这样它对web应用程序仍然有效,但对WAF无效。
对于这种类型的WAF,能够为许多不同类型的服务器提供服务是很重要的,包括“外来的”服务器,如Unicorn、Tornado、Weblogic、Lighttpd等。
每个服务器可能以不同的方式对HTTP请求进行解析,WAF也应该考虑这一点。
核心:因此,攻击者可以使用服务器的HTTP请求解析细节来找到绕过WAF的方法。
很难通过WAF安全机制或使用领域对所有可能的绕过WAF的方法进行分类,相同的绕过方式可以相互作用,并同时影响WAF的不同组件。
总的来说就是打破waf处理的逻辑,趁它虚,要它命。
**
方法
**
#################1 添加特殊符号
添加的各种特殊符号可能违反WAF的分析逻辑,同时又被服务器有效地解释。这些符号的变化可能是不同的,它们可能被转换成urlencode(尽管大多数WAF可以处理这个问题)或其他编码。也可以在没有任何编码的情况下,以原始格式将特殊符号插入到请求中,这对于WAF来说可能是个意外。例如,在本文的示例中,\r\n\r\n可能被认为是HTTP请求对象的结尾,而空字节可能完全违反正则表达式和数据解析器的分析逻辑。此外,还可以使用来自ASCII表的前20个符号的其他特殊符号。
**
**示例**
**
0x00:空字节;
0x0D:回车;
0x0A:换行;
0x0B:垂直制表符;
0x09:水平制表符;
0x0C :新建页面。
在搜索绕过时,在请求对象的不同位置插入特殊符号是非常有用的,而不仅仅是插入参数值。例如,如果请求是一个JSON格式的,我们可以在参数中插入null字节,也可以在参数之间插入null字节,包括JSON的开头和结尾。这同样适用于POST请求主体的其他格式,总的来说,我们建议寻找可以被WAF监控和解析的位置,并尝试在那里使用不同的特殊符号。
例如:
{"id":1337,"string0x00":"test' or sleep(9)#"}
{"id":1337,"string":"test'/*0x00*/ or sleep(9)#"}
{"id":1337,"string"0x0A0x0D:"test' or sleep(9)#"}
<a href="ja0x09vas0x0A0x0Dcript:alert(1)">clickme</a>
<a 0x00 href="javascript:alert(1)">clickme</a>
<svg/0x00/onload="alert(1)">
id=1337/*0x0C*/1 UNION SELECT version(), user() --
为清楚起见,我们用十六进制表示替换了的特殊符号。
#################2 替换空间符号
在大多数语法中,关键字和操作符必须分开,但由于没有指定的空格符号。因此,可以使用0x0B(垂直制表符)或0x09(水平制表符)代替普通的0x20(空格)。在SQL中,分隔结构的空间是/ ** /(多行SQL注释),#\ r \ n(单行SQL注释,以换行符结尾), - \ r \ n(代替单行SQL注释,用换行结束)。下面是一些具体示例:
http://test.com/test?id=1%09union/**/select/**/1,2,3
http://test.com/test?id=1%09union%23%0A%0Dselect%2D%2D%0A%0D1,2,3
此外,我们还可以使用该语言的语法转换表达式,以消除空格。例如,在SQL中,我们可以使用括号:
UNION(SELECT(1),2,3,4,5,(6)FROM(Users)WHERE(login='admin'))
在JS中,使用/:
<svg/onload=confirm(1)>
个人理解:sql注入中用/**/的方式替换空格,我试过一次,真好用哈。替换空间符号这个操作是真秀。
###########3 更改编码
这种方法是基于使用不同的编码来防止WAF在某些地方解码数据,例如,如果用其url代码替换符号,WAF将无法理解它必须解码数据并传递请求。同时,web应用程序将接受相同的参数并成功解码。
HTML符号的十进制形式为&#106或&#0000106.WAF可能知道短版本而不知道具有附加零的版本(总共应该不超过7个符号)。同样,HTML符号的十六进制形式为&#x6A或&#x000006A。
还有一个使用反斜杠\转义字符的技巧,如下所示:
<svg/on\load=a\lert(1)>
不过,这取决于web应用程序如何处理这些输入数据。因此,序列\l将被处理为l并转换为单个符号,WAF可以单独处理每个符号,它可以中断正则表达式或另一个WAF逻辑。因此,WAF会漏掉关键字。使用这种技术,我们不能转义字符 \n, \r, \t,因为它们将被转换成不同的字符:换行符,回车符和制表符。
HTML编码可以在标签属性中使用,例如:
<a href="javascript:alert(1)">clickme</a>
<input/onmouseover="javascript:confirm(1rpar;">
这些字符可以很容易地替换为目标字符的另一种HTML表示形式,你可以在这里https://dev.w3.org/html5/html-author/charref查找不同的字符转换。
除了HTML编码,我们还可以插入\u字符:
<a href="javascript:\u0061lert(1)">Clickme</a>
<svg onload=confir\u006d(1)>
我们还来看看与插入特殊字符相关的向量,让我们用HTML编码破解有效负载:
<a href="ja	vas
cript:alert(1)">clickme</a>
在本文的示例中,我们还可以放置其他分隔字符。
因此,我们建议将不同的编码与其他方法结合使用,例如,对特殊字符进行编码。
###################4 搜索非典型的等效句法结构
这种方法的目的是找到一种WAF开发人员没有考虑到的利用方式,或者在机器学习训练样本中没有出现的攻击向量。简单的例子是JavaScrIPt函数:this, top self, parent, frame;标签属性: data-bind,ontoggle,onfilterchange,onbeforescriptexecute,onpointerover,srcdoc;SQL运算符:lpad,field,bit_count。
下面是一些例子:
<script>window['alert'](0)</script>
<script>parent['alert'](1)</script>
<script>self['alert'](2)</script>
SELECT if(LPAD(' ',4,version())='5.7',sleep(5),null);
你也可以使用JavaScrIPt表达式的非符号表示:
JSFuck;
Jjencode;
Xchars.js。
其中,一个明显的问题是长有效载荷。
采用这种技术的WAF绕过依赖于攻击和被利用的技术栈,著名的ImageTragick漏洞就是一个很好的例子。大多数保护免受此攻击的WAF都将url、容量和标签等关键字列入黑名单。另外,大多数论文和描述此漏洞的PoC可能还会使用其他关键字,例如ephemeral和pango。因此,可以使用这些关键字绕过WAF。
###############5 HTTP参数污染(HPP)和HTTP参数碎片(HPF)
HPP攻击基于服务器如何解释具有相同名称的参数,以下是一些可能的绕过参数:
服务器使用最后接收到的参数,而WAF只检查第一个参数;
服务器将类似参数的值合并,而WAF只会单独检查它们。
你可以在下表中比较不同的服务器如何处理相同的参数:
而HPF的攻击则基于不同的原则,如果一个web应用程序的逻辑将请求中的两个或多个参数联合起来,则攻击者可以将请求分开以绕过某些WAF检查。
下面的SQL注入就是这种攻击的一个例子:
http://test.com/url?a=1+select&b=1+from&c=base
HPF和HPP非常相似,但是前者针对的是web应用程序,后者针对的是它所运行的环境。结合这些技术可以增加绕过WAF的机会。
**
小结:
**
说实话到这里我就开始蒙蔽了,很多知识看多听过,自己上手几乎没有,哎,每天凑被自己菜醒!!!