:一两年前的文章了,供没注意到的参考

HPP是HTTP Parameter Pollution的缩写。这个漏洞由S. di Paola 与L. Caret Toni在2009年的OWASP上首次公布。这也是一种注入型的漏洞,攻击者通过在HTTP请求中插入特定的参数来发起攻击。如果Web应用中存在这样的漏洞,可以被攻击者利用来进行客户端或者服务器端的攻击。下面对这个漏洞的原理做一下详细解释。

首先讲下HTTP的参数处理

在跟服务器进行交互的过程中,客户端往往会在GET/POST请求里面带上参数:

GET /foo?<SPAN style="COLOR: #ff0000">par1=val1&par2=val2</SPAN> HTTP/1.1  

User-Agent: Mozilla/5.0  

Host: Host  

Accept: */*  

GET /foo?par1=val1&par2=val2 HTTP/1.1 User-Agent: Mozilla/5.0 Host: Host Accept: */*

POST /foo HTTP/1.1  

User-Agent: Mozilla/5.0  

Host: Host  

Accept: */*  

Content-Length: 19  

POST /foo HTTP/1.1 User-Agent: Mozilla/5.0 Host: Host Accept: */* Content-Length: 19


如上面的例子所示,这些参数会以名称-值对的形势出现,通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的。大家可以在下面给出的W3School链接上试试看:

?filename=tryhtml_form_checkbox

但是针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样,比如看下面的2个例子:

?q=italy&q=china

?p=italy&p=china

如果同时提供2个搜索的关键字参数给Google,那么Google会对2个参数都进行查询;但是Yahoo则不一样,它只会处理后面一个参数。下面这个表简单列举了一些常见的Web服务器对同样名称的参数出现多次的处理方式:

Web服务器

参数获取函数

获取到的参数

PHP/Apache

$_GET(“par”)

Last

JSP/Tomcat

Request.getParameter(“par”)

First

Perl(CGI)/Apache

Param(“par”)

First

Python/Apache

getvalue(“par”)

All (List)

ASP/IIS

Request.QueryString(“par”)

All (comma-delimited string)

那么这会有什么问题吗?实际上这本身并没有什么问题,但是前提是Web应用程序的开发者知道这个事情并且有正确的进行处理。否则的话那么难免会对攻击者造成可乘之机。如果对同样名称的参数出现多次的情况没有进行正确处理的话,那么可能会导致漏洞使得攻击者能够利用来发起对服务器端或客户端的攻击。下面举一些例子来详细说明。

对客户端的攻击

比如有这样一个网站,用来给其他人在2个候选人之间投票,这个网站的URL和代码是这样的:

Url : ?poll_id=4568  

  

Link1: <a href="vote.jsp?poll_id=4568&candidate=zhang">为张三投票</a>  

  

Link2: <a href="vote.jsp?poll_id=4568&candidate=li">为李四投票</a>  

   

Url : ?poll_id=4568 Link1: <a href="vote.jsp?poll_id=4568&candidate=zhang">为张三投票</a> Link2: <a href="vote.jsp?poll_id=4568&candidate=li">为李四投票</a>

因为种种原因,这个页面里面用于投票的链接实现的方式如下:

ID = Request.getParameter("pool_id")  

  

href_link = "vote.jsp?poll_id=" + ID + "&candidate=xyz"  

   

ID = Request.getParameter("pool_id") href_link = "vote.jsp?poll_id=" + ID + "&candidate=xyz"


如果这时候恶意攻击者生成了如下的一个URL发给投票人:

http_://host/election.jsp?poll_id=4568%26candidate%3Dzhang

那么最终在页面的内容会是:

Url : ?poll_id=4568%26candidate%3Dzhang  

  

Link1: <a href="vote.jsp?poll_id=4568&candidate=zhang&candidate=zhang">为张三投票</a>