在我们正在开发的网站中,经过安全检查,我们发现了安全问题。该报告也包含 HTTP 参数污染漏洞。在网上我可以找到什么是 HPP?它如何注入等;但是我找不到如何避免此类问题。服务器语言是php。&我知道相同的参数可以重复&当有许多相同的参数时,php只考虑最后一个参数。但是做一些事情来避免这种风险是没有任何意义的。那么任何人都可以通过示例指导我如何避免 HPP 漏洞吗?
提前致谢
请注意,我在这里描述的是“服务器端 HPP”,但是,存在漏洞的客户端版本。了解服务器端版本也将有助于客户端版本。
HPP 是指您的应用程序向另一个系统发出后端 HTTP 请求。
例如,如果您的网站使用以下前端 URL 进行汇款:
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 是指攻击者可以操纵页面上显示的链接,因此当它们在客户端被跟踪时,它们会做一些与应用程序开发人员意图不同的事情。例如,“污染”一个带有额外参数的转账按钮,该参数会更改直接从应用程序而不是后端服务执行的“到帐户”。