WAF是什么东西?!--- 3 waf的绕过

想法: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&colon;alert(1)">clickme</a>

<input/onmouseover="javascript&colon;confirm&lpar;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&Tab;vas&#xA;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的机会。

**

小结:

**

说实话到这里我就开始蒙蔽了,很多知识看多听过,自己上手几乎没有,哎,每天凑被自己菜醒!!!

参考链接:https://mp.weixin.qq.com/s/3nuzMBqBoTwZCHsnEGIjeA

猜你喜欢

转载自blog.csdn.net/WM_NNXX/article/details/98968950