幕后:HTTP 参数污染

  • A+
所属分类:安全闲碎

点击上方蓝字“Ots安全”一起玩耍

如今,来自 Web 应用程序的许多组件通常运行在用户的计算机上(例如 Javascript),而不仅仅是在应用程序的提供者服务器上(例如 Servlet)。随着时间的推移,Web 应用程序需要为其用户提供多种服务,同时与功能、交互性和易用性保持一致。因此,即使是最简单的 Web 应用程序也可能会获取和处理大量不同的 HTTP 参数。这可能会导致大量输入验证或注入漏洞的暴露,例如跨站点脚本、SQL 注入和命令注入,等待被操纵和利用。


这些 Web 漏洞现在很常见,并且围绕它们进行了大量研究,这有助于 Web 应用程序领域更加安全。然而,一个存在已久的漏洞现在才开始引起网络安全世界的警觉——HTTP 参数污染 (HPP)。该漏洞由 Stefano di Paola 和 Luca Carettoni 于 2009 年在 OWASP 波兰会议上首次提出。这个漏洞已经存在很长时间的事实意味着已经发现了许多影响或针对现实世界应用程序的漏洞。

HTTP 参数污染(HPP)详解

HTTP 参数污染,顾名思义,污染 Web 应用程序的 HTTP 参数,以执行或实现与 Web 应用程序预期行为不同的特定恶意任务/攻击。

这种黑客技术被认为是简单的,但非常有效。此外,可以实现这种攻击的主要原因是输入没有正确消毒。HPP 在现有或其他 HTTP 参数(即 GET/POST/Cookie)中注入编码的查询字符串分隔符,这使得取代已经存在的参数值以注入新参数或利用直接访问的变量变得可行。这种攻击会影响所有 Web 技术,无论是运行客户端还是服务器端。

通常,攻击者可以利用 HPP 漏洞:

  •  取代现有的硬编码 HTTP 参数。

  • 更改或修改预期/正常的应用程序行为。

  • 访问并可能利用未正确控制的变量。

  • 绕过 WAF 规则或输入验证机制。

因此,如果 Web 应用程序容易受到 HPP 攻击,Web 应用程序的安全性就会受到威胁,从而为攻击者提供了执行恶意或非法活动的简单方法。

网络技术

HTTP 允许多次提交相同的参数。对每个参数值的操作取决于每种 Web 技术如何解析这些参数。那么,如果多次提供相同的参数会发生什么?

一些 Web 技术解析参数的第一次或最后一次出现,一些连接所有输入,而另一些将创建参数数组。下表显示了每种 Web 技术如何在服务器端解析相同参数的不同值。

幕后:HTTP 参数污染

[参考:HTTP Parameter Pollution OWASP EU09 波兰演讲;https://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf]

以下示例显示了 Web 应用程序的 Web 技术如何在一个查询中触发或解析相同的参数。下面可以使用 Google 搜索引擎显示有关如何触发参数的第一个示例。在 Google 中,您可以进行以下查询:

http://www.google.com/search?q=web&q=application&q=security

幕后:HTTP 参数污染

如上面的屏幕截图所示,相同的参数 'q' 被使用了 3 次。在这种情况下,谷歌将三个值连接起来,中间有一个空格,因此最终结果将是“网络应用程序安全”。

第二个例子是搜索引擎 Yahoo!。使用了以下查询:

http://search.yahoo.com/search;_ylt=Ajxtx6DKiSkS1pjEfg6zSMWbvZx4?p=web&p=application&p=security

具有与前一个示例相同的三个参数,显示 Yahoo! 仅解析最后一个参数,因此最终结果将是“安全”。

幕后:HTTP 参数污染

这清楚地显示了每种技术如何不同地解析值参数。每种技术解析参数的方式都没有错,只要开发者知道。如果开发人员不知道这种行为或参数触发,那么这对 Web 应用程序来说可能是危险的。此外,网络技术/语言具有多种安全功能,允许它们通过能够控制和操纵这些类型的输入参数来保护自己。

客户端和服务器端

HTTP 参数污染可以分为两类——客户端或服务器端。每种技术解析参数的方式不同,从而可以实现不同的攻击。这取决于它被触发的方式,启用客户端或服务器端攻击。此外,在每种情况下,相应地操纵参数以在 Web 应用程序的前端(客户端)或后端(服务器)执行黑客活动。

客户端HTTP参数污染漏洞

HTTP 参数污染 (HPP) 客户端攻击与客户端或用户环境有关,这意味着用户的操作(即访问浏览器中的链接)会受到影响,并会在用户不知情的情况下触发恶意或意外操作。HPP 客户端攻击可以体现为 HPP(例如向 URL 链接和/或其他 src 属性注入附加参数)、存储的 HPP(可以对具有数据、src 和 href 属性的所有标签起作用)和操作表单使用 POST 方法。另一种 HPP 客户端攻击是基于 DOM 的攻击,主要与解析意外参数和使用 JavaScript 实现客户端 HPP 相关。

显然,注入的能力或容量取决于链接的属性及其功能。然而,主要目的是在客户端产生 HPP 攻击。

典型的 HPP 客户端攻击的示例包括易受 HPP 攻击的网站和将与易受攻击的网站进行交互的一组受害者。攻击者在识别出易受攻击的网站后,将创建一个其 HTTP 参数受到污染的易受攻击的链接,然后将此链接发送或通过电子邮件或社交网络公开供天真和毫无戒心的受害者点击。受害者点击后,将执行预期的恶意行为,影响用户和 Web 应用程序(应用程序提供商)。

以下场景是一个 webmail 服务网站,用户可以从中查看和删除他/她的电子邮件。webmail 网站的 URL 是:

http://host/viewemail.jsp?client_id=79643215

查看电子邮件的链接是

<a href=”viewemail.jsp?client_id=79643215&action=view”>View </a>

删除电子邮件的链接是:

<a href=”viewemail.jsp?client_id=79643215&action=delete”> Delete</a>

当用户单击上述任一链接时,将执行相应的操作。这两个链接是从 URL 构建的。将请求 ID 并将其与相应的操作一起嵌入/添加到 href 链接中。因此:

ID = Request.getParameter(“client_id”)href_link = “viewemail.jsp?client_id=” + ID + “&action=abc”

这个 Web 应用程序,更准确地说是 client_id,容易受到 HPP 的攻击。如下所示,攻击者创建一个 URL 并在 client_id 参数之后注入另一个参数“action”,前面是一个编码的查询字符串分隔符(例如 %26)。此参数包含值“删除”:

http://host/viewemailn.jsp?client_id=79643215%26action%3Ddelete

创建恶意链接后,该页面现在包含两个注入了额外操作参数的链接。因此:

<a href=viewemail.jsp?client_id=79643215&action=delete&action=view > View </a><a href=viewemail.jsp?client_id=79643215&action=delete&action=delete > Delete</a>

如上表所示,JSP 会解析两个相同的参数(action)并返回第一个值。JSP 查询 Request.getParameter(“action”) 在这两种情况下都将返回 'delete'。因此,用户将单击两个链接(查看或删除)中的任何一个,但将始终执行删除操作。

这是一个简单的示例,攻击者如何利用 HTTP 参数污染易受攻击的网站并导致恶意代码在不被检测到的情况下运行或执行。

服务器端HTTP参数污染漏洞

在 HPP Server 端,Web 应用程序的后端环境会受到影响。使用 HPP 攻击的攻击者将尝试通过发送触发或污染的 URL 来利用易受攻击的 Web 应用程序的逻辑,例如访问 Web 应用程序的数据库。

HPP 服务器端还可用于绕过多个 Web 应用程序防火墙 (WAF) 规则。某些 WAF 仅验证单个参数出现,例如第一个或最后一个。在Web技术将多个相同参数的值串联起来的情况下,例如ASP.NET/IIS,攻击者可以将恶意代码拆分成这些事件,从而绕过Web应用程序防火墙的安全机制或规则。

此外,可以使用 HPP 进行 URL 重写。例如,攻击者可以注入编码的查询字符串以导致 URL 被重写。一个例子可以在下面看到:

编码字符串:
http://host/xyz%26page%3dedit

重写网址:
http://host/page.php?page=view&page=xyz&action=edit&id=0

如前所述,注入的能力取决于链接的属性及其公开的功能。

HPP 服务器端攻击也可用于跨渠道污染和绕过 CSRF 令牌。

为了更好地理解服务器端 HPP 攻击,下面的示例将尝试解释这种攻击如何使用具有相同值的参数串联来绕过 Web 应用程序防火墙规则或基于签名的过滤器。以下 URL/请求被发送到服务器:

http://testaspnet.vulnweb.com/test/vuln.cgi?par1=val1&par2=val2

Web 服务器将解析上述查询并将其拆分成对(名称/值),以便由 Web 应用程序操作或使用。因此,Web 应用程序将分别采用值 val1 和 val2 的 par1 和 par2。如果 Web 应用程序容易受到 HPP 攻击,攻击者就可以利用它并提交恶意负载。以下面的案例为例:

http://testaspnet.vulnweb.com/test/vuln.cgi?par1=val1&par1=val2

您可以看到有两个 par1 参数,每个参数包含两个不同的值。在这种情况下,应用程序将如何触发它?这取决于 Web 技术,如上面的 Web 技术部分所示。由于参数的处理方式不同,黑客可以对其进行控制,从而规避安全机制,攻击Web应用程序。

在另一个例子中,Web技术是ASP.NET/IIS,黑客可以向服务器发送以下请求:

http://testaspnet.vulnweb.com/test/vuln.cgi?par1=<script&par1=prompt.”…”> …

由于 ASP.NET/IIS 连接相同参数的值,因此最终结果将是 <script prompt”...”>。因此,攻击者可以将其扩展为完整的跨站点脚本攻击。

如果在此应用程序前面安装了 Web 应用程序防火墙,那么它会根据注入攻击的规则分别检查每个参数的出现。因此,Web 应用程序防火墙将检查第一个参数 par1=<script,它不会匹配任何注入攻击规则,因为这不是恶意负载。然后它将对等于 par2=src="..." 的第二个参数进行相同的检查。同样,这不被视为危险的有效载荷,也不会发出任何警报。尽管如此,如前所述,ASP.NET/IIS 将根据技术如何解析这些事件来连接这些值,从而导致执行 XSS 攻击(如果它在完整的 XSS 负载中扩展)。

这是攻击者如何使用 HPP 绕过某些 Web 应用程序防火墙规则,从而实现进一步攻击的示例。

对策/预防

为了防止这些类型的漏洞,应该执行广泛和适当的输入验证。有符合每种网络技术/语言的安全方法。此外,应该提高对客户/用户可以提供多个参数这一事实的认识。

结论

一种已经存在多年但从未引起任何警觉性且并未引起安全界特别关注的注入攻击,已经让 Web 安全行业认识到这样一个事实:永远不应低估此类注入攻击,并且每种 Web 技术所包含的不同解析方法缺乏标准化,加上复杂性,可能会导致漏洞。HTTP 参数污染利用了这样一个事实,即 HTTP 允许使用多个相同的参数,这会导致某些基于 Web 技术以及这些触发 HTTP 参数的 Web 应用程序暴露并被恶意用户利用. HPP 是一种简单但非常有效的黑客技术,它会影响客户端和服务器端环境。被利用时,

很明显,这个漏洞尽管很简单,但可能非常危险,并可能危及您网站的安全系统。应执行适当的检查以确定您的站点是否容易受到 HPP 攻击,以限制可能性并减少黑客可以利用的机会,从而破坏您站点的机密性、完整性和可用性。

使用 Acunetix Web Vulnerability Scanner 扫描 HTTP 参数污染!

Acunetix Web Vulnerability Scanner Version 8 扫描任何网站或 Web 应用程序中的 HTTP 参数污染漏洞,为用户揭示相关信息,例如漏洞位置并建议修复技术。扫描 HPP 通常是一个快速的过程(取决于网站的大小)。

下图展示了 Acunetix Web Vulnerability Scanner 如何抓取、扫描和检测易受 HTTP 参数污染的站点。

幕后:HTTP 参数污染


幕后:HTTP 参数污染


Acunetix Web Vulnerability Scanner Version 8 扫描 HPP 漏洞,报告漏洞的位置、HTTP 标头和 HTML 响应以及有关 HPP 漏洞的信息以及如何修复此漏洞。

幕后:HTTP 参数污染

本文始发于微信公众号(Ots安全):幕后:HTTP 参数污染

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: