HTTP 参数污染


HTTP Parameter Pollution

在我们正在开发的网站上,在进行安全检查后,我们发现了安全问题。此报告还包含 HTTP 参数污染漏洞。在网络上,我可以找到什么是HPP?它如何注射等;然而,我找不到避免此类问题的方法。服务器语言是php。我知道相同的参数可以复制,PHP只是在有很多相同的参数时考虑最后一个参数。但是,做点什么来避免这种风险是没有任何意义的。那么任何人都可以指导我如何通过示例避免HPP漏洞吗?

提前致谢

请注意,我在这里描述的是"服务器端HPP",但是,该漏洞有一个客户端版本。了解服务器端版本也有助于客户端版本。

HPP 是指您的应用程序向另一个系统发出后端 HTTP 请求。

例如,如果您的网站使用以下前端网址进行汇款:

https://www.example.com/transferMoney.php

这只能通过 POST 方法访问,并采用以下参数:

amount=1000&fromAccount=12345

当您的应用程序处理此页面时,它会向后端系统发出以下 POST 请求,以使用固定toAccount实际处理事务:

https://backend.example/doTransfer.php
toAccount=9876&amount=1000&fromAccount=12345

现在你说 PHP 只在重复的情况下采用最后一个参数。

假设有人将您网站的 POST 更改为以下内容:

amount=1000&fromAccount=12345&toAccount=99999

如果您的transferMoney.php页面容易受到HPP的攻击,那么它现在可能会向后端系统发出以下请求

https://backend.example/doTransfer.php
    
toAccount=9876&amount=1000&fromAccount=12345&toAccount=99999

用户注入的第二个toAccount将覆盖此后端请求并将资金转入他们自己的账户(99999),而不是系统设置的预期账户(9876)。这对于攻击者修改自己对系统的请求非常有用。但是,如果攻击者可以从自己的网站生成此链接并诱使其他用户在不知不觉中跟踪该链接而不知道额外参数,则对攻击者也很有用。

要解决此问题,您应该确保任何后端 HTTP 请求都应用了正确的 URL 编码并验证所有输入,例如,fromAccount是实际有效的帐号。同样在我的示例中,即使这未经验证,后端请求也应该编码为 fromAccount=12345%26toAccount%3D99999这将阻止第二个toAccount被解释为单独的 POST 参数。

客户端

客户端 HPP 是指攻击者可以操纵页面上显示的链接,因此当客户端跟踪这些链接时,他们会执行与应用程序开发人员意图不同的操作。例如,使用额外的参数"污染"转账资金按钮,该参数更改直接从应用程序而不是后端服务操作的"收件人帐户"。

HPI

还有一种类似的攻击,HTTP参数注入(HPI),它不依赖于同名的第二个参数覆盖第一个参数,额外的参数只是注入到后续URL中。

Ctrl+F HPI此处