HPP方法主要用于服务器两层架构,其基本结构情况如下图所示:

服务器端有两个部分:第一部分为 tomcat 为引擎的 jsp 型服务器,第二部分为 apache为引擎的 php 服务器,真正提供 web 服务的是 php 服务器。工作流程为:client 访问服务器,能直接访问到 tomcat 服务器,然后 tomcat 服务器再向 apache服务器请求数据。数据返回路径则相反。
所以重点:index.php?id=1&id=2,到底是显示 id=1 的数据还是显示 id=2 的?
Explain:apache(php)解析最后一个参数,即显示 id=2 的内容。Tomcat(jsp)解析第一个参数,即显示 id=1 的内容。
对于几个主要的服务器,其对多个参数的获取情况归纳如下:

所以对于第一张图中的服务器配置情况,如果发送index.jsp?id=1&id=2请求,客户端请求首先过 tomcat,tomcat 解析第一个参数,接下来 tomcat 去请求 apache(php)服务器,apache 解析最后一个参数。那最终返回客户端的应该是哪个参数?
Answer:此处应该是 id=2 的内容,应为时间上提供服务的是 apache(php)服务器,返回的数据也应该是 apache 处理的数据。而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在 tomcat 服务器处做数据过滤和处理,功能类似为一个 WAF(Web Application Firewall)。而正因为解析参数的不同,我们此处可以利用该原理绕过 WAF 的检测。该用法就是 HPP(HTTP Parameter Pollution),http 参数污染攻击的一个应用。HPP 可对服务器和客户端都能够造成一定的威胁。
下面我们来看下实战情况,首先我们发送两个参数,发现其接收的是最后一条信息,如图:

对于单个jsp/tomcat服务器来说多个参数应该是接收第一个,也就是id=1的,这里接收了第二个,因此可以得知其服务器架构不单是一个tomcat,通过代码也可发现其架构是apache+tomcat,所以我们直接以这种架构为基础开始注入攻击。因为接收的是第二个参数数据,第一个数据被过滤,所以我们可以在第二个参数中注入,如图:

剩下就可以愉快地自行注入了。
网友评论