欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

本文从现代WAF的基本原理讲起,涵盖WAF指纹识别、多种WAF绕过技术(下)

来源:本站整理 作者:佚名 时间:2019-07-30 TAG: 我要投稿


今天我们来接着上一篇,讲讲WAF绕过技术的其他几个方面。
Unicode标准化
让Unicode标准化是Unicode的一个功能,用于比较看起来相似的Unicode符号。例如,符号“ª”和“ᵃ”有不同的代码,但肉眼看起来非常相似。标准化之后他们都将看起来像一个简单的'a',并且被认为是相同的。标准化允许将一些复杂的unicode符号转换为更简单的代替符号。有一个Unicode规范化表,其中包含所有Unicode符号及其可能的规范化。使用它,你可以制作不同的有效载荷,并将它们与其他方法结合起来。尽管如此,它并不适用于所有web应用程序,并且非常依赖于运行环境。
例如,在上表中,我们可以看到符号,可以转化为XSS攻击。 WAF可能无法理解Unicode符号,它可能根本没有理解这些技巧的规则,机器学习也可能没用,在使用Unicode规范化的Web应用程序中找到绕过方法时,我们不仅可以替换,还可以替换有效载荷中的其他符号。
例如:
<img src﹦x onerror=alert︵1)>
最近,在HackerOne的Rockstar BugBounty程序中发现了这个漏洞。没有WAF,只有严格的用户输入过滤:
hackerone.com/reports/231444
hackerone.com/reports/231389
令牌破坏程序(Token breaker)
对令牌程序的攻击试图在所谓的令牌破坏程序的帮助下,攻击将请求拆分为令牌的逻辑。令牌破坏程序是允许影响字符串元素和特定令牌之间的通信的符号,因此可以通过签名绕过搜索。但是当使用令牌破坏程序时,请求必须保持有效。下面的请求是使用令牌破坏程序进行攻击的一个示例。
SELECT-@1,version()
其中-@是令牌破坏程序,其中有一个chear表,是通过mysql模糊测试并在libinjection中检查结果获得的。
使用RFC的功能
在HTTP/1.1协议的规范和各种请求类型(例如multIPart/form-data)中,我们可以找到一些与处理标头有关的有趣的东西。由于WAF开发人员通常不考虑这些问题,因此WAF可能会错误地解析请求,并丢失隐藏攻击向量的部分数据。WAF中的大多数问题都与多部件/表单数据的处理和边界参数的特定值有关,边界参数在这些请求中指定了参数边界。除此之外,服务器开发人员可能也会犯错误,并且不完全支持规范,所以服务器的HTTP解析器中可能存在未被记录的功能。
在具有multipart / form-data的HTTP请求中,参数边界负责请求对象中的不同参数隔离。根据RFC的规则,必须在每个新POST参数前面放置一个前面指定的带有前缀“——”的边界,以便服务器能够区分请求的不同参数。
POST /vuln.php HTTP/1.1
Host: test.com
Connection: close
Content-Type: multipart/form-data; boundary=1049989664
Content-Length: 192
--1049989664
Content-Disposition: form-data; name="id"
287356
--1049989664--
攻击还可以基于以下情况:服务器和WAF以不同的方式处理边界为空的情况。根据RFC的规则,在本例中,“——”是参数之间的边界。然而,WAF可能使用不考虑这一点的解析器,因此,WAF将传递请求,因为来自POST请求参数的数据不会出现在解析器中。web服务器可以很轻松地解析这样的请求,并将数据移交给后续处理。
请看以下示例:
POST /vuln.php HTTP/1.1
Host: test.com
Connection: close
Content-Type: multipart/form-data; boundary=
Content-Length: 192
--
Content-Disposition: form-data; name="id"
123' or sleep(20)#
----
以下是一个更有趣的示例:
POST /vuln.php HTTP/1.1
Host: test.com
Content-Type: multipart/form-data; boundary=FIRST;
Content-Type: multipart/form-data; boundary=SECOND;
Content-Type: multipart/form-data; boundary=THIRD;
--THIRD
Content-Disposition: form-data; name=param
UNION SELECT version()
--THIRD--
在上图的攻击中,我们试图定义哪些边界参数将被WAF接受,哪些参数将被web服务器接受。因此,如果它们接受不同的参数,则可以通过指定WAF看不到的边界来执行攻击。这种攻击有点像HPP。
POST /vuln.php HTTP/1.1
Host: test.com
Content-Type: multipart/form-data; xxxboundaryxxx=FIRST; boundary=SECOND;
--FIRST
Content-Disposition: form-data; name=param
UNION SELECT version()
--FIRST--
此攻击基于这样的假设:WAF和web服务器对HTTP请求的解析是不同的,也就是说,web服务器的解析器查找第一个“boundary”条目,然后查找“=”符号,之后才定义边界的值。反过来,WAF解析器只查找“boundary=”条目,然后定义边界的值。如果满足这些条件,WAF将无法在请求中找到边界,因此它将无法找到并分析参数。相反,web服务器将获取请求并处理参数。这种攻击也将以另一种方式工作,即web服务器

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载