Web应用里的HTTP参数污染(HPP)漏洞

学习 专栏收录该内容
28 篇文章 0 订阅
 

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

 

首先讲下HTTP的参数处理

 

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

 

[html] view plain copy
  1. GET /foo?<span style="color:#ff0000;">par1=val1&par2=val2</span> HTTP/1.1  
  2. User-Agent: Mozilla/5.0  
  3. Host: Host  
  4. Accept: */*  

 

[html] view plain copy
  1. POST /foo HTTP/1.1  
  2. User-Agent: Mozilla/5.0  
  3. Host: Host  
  4. Accept: */*  
  5. Content-Length: 19  


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

http://www.w3schools.com/html/tryit.asp?filename=tryhtml_form_checkbox

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

http://www.google.com/search?q=italy&q=china


 

 

http://search.yahoo.com/search?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和代码是这样的:

[html] view plain copy
  1. Url : http://host/election.jsp?poll_id=4568  
  2.   
  3. Link1: <a href="vote.jsp?poll_id=4568&candidate=zhang">为张三投票</a>  
  4.   
  5. Link2: <a href="vote.jsp?poll_id=4568&candidate=li">为李四投票</a>  
  6.    

 

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

[html] view plain copy
  1. ID = Request.getParameter("pool_id")  
  2.   
  3. href_link = "vote.jsp?poll_id=" + ID + "&candidate=xyz"  
  4.    


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

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

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

[html] view plain copy
  1. Url : http://host/election.jsp?poll_id=4568%26candidate%3Dzhang  
  2.   
  3. Link1: <a href="vote.jsp?poll_id=4568&candidate=zhang&candidate=zhang">为张三投票</a>  
  4.   
  5. Link2: <a href="vote.jsp?poll_id=4568&candidate=zhang&candidate=li">为李四投票</a>  
  6.    

 

前面我们有知道对于JSP来说在有2个相同的名称的参数的时候,会取第一个值:

Web服务器

参数获取函数

获取到的参数

JSP/Tomcat

Request.getParameter(“par”)

First

所以不管投票人选择的是谁,始终都是张三得票。

 

一般来说,对客户端的攻击一般会是如下流程,导致用户选择不期望的选项:


 

对服务器端的攻击

 

比如某网站的实现如下:

[html] view plain copy
  1. void private executeBackendRequest(HTTPRequest request){  
  2.   
  3.    
  4.   
  5. String action=request.getParameter("action");  
  6.   
  7. String user=request.getParameter("userid");  
  8.   
  9. String target=request.getParameter("target");  
  10.   
  11.    
  12.   
  13. HttpRequest("http://centralauthencationserver/checkpriviledge.jsp", "POST","action="+action+"&user="+user+"&target="+target);}  
  14.   
  15.    
  16.   
  17.     /* get feedback of whether this user has privilege to perform specified action. If no such privilege, return error, otherwise continue perform the action*/  
  18.   
  19.    
  20.   
  21. HttpRequest("http://businessserver/performaction.php", "POST","action="+action+"&user="+user+"&target="+target);}  

 

它有个独立的集中认证服务器用来做用户权限方面的认证,另外的业务服务器专门用来处理业务,对外的门户实际上紧紧只是用来做请求的转发。这里不会有SQL注入之类的漏洞,因为不管是集中认证服务器还是业务处理服务器都会对传入的参数的格式做检查,确保不会存在SQL注入。那么哪儿有问题?因为集中认证服务器和业务处理服务器分别由2个团队开发,使用了不同的脚本语言,又没有考虑到HPP的情况。那么看看一个本来紧紧只是具有只读权限的用户,如果发送如下请求给服务器:

http_://frontHost/page?action=view&userid=zhangsan&target=bizreport%26action%3dedit

那么根据我们知道的Web服务器参数处理的方式,这个用户可以通过认证做一些本来没有权限做的事情。

Web服务器

参数获取函数

获取到的参数

PHP/Apache

$_GET(“par”)

Last

JSP/Tomcat

Request.getParameter(“par”)

First

 

除此以外,HPP还可以被攻击者用来绕过一些Web应用防火墙(WAF, WebApp Firewall),比如对某页面的SQL注入攻击如下:

show_user.aspx?id=5;select+1,2,3+from+users+where+id=1--

这个攻击因为在参数id里面存在明显的SQL注入的模板:select…from…而会被WAF成功拦截。但是如果换成HPP的方式:

show_user.aspx?id=5;select+1&id=2&id=3+from+users+where+id=1--

这时候没有任何参数具备select…from…的特征,可能就可以绕过WAF的拦截了。

 

总的来说,HPP是一种新的注入型漏洞。要防止这种漏洞,除了要做好对输入参数的格式验证外,另外还需要意识到HTTP协议是允许同名的参数的,在整个应用的处理过程中要意识到这一点从而根据业务的特征对这样的情况作正确的处理。
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值