HTTP参数污染—绕过waf或其他目的

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

首先讲下HTTP的参数处理

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

[html]view plaincopy

GET /foo?par1=val1&par2=val2HTTP/1.1

User-Agent: Mozilla/5.0

Host: Host

Accept: */*

[html]view plaincopy

POST /foo HTTP/1.1

User-Agent: Mozilla/5.0

Host: Host

Accept: */*

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 plaincopy

Url : http://host/election.jsp?poll_id=4568

Link1:为张三投票

Link2:为李四投票

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

[html]view plaincopy

ID=Request.getParameter("pool_id")

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

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

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

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

[html]view plaincopy

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

Link1:为张三投票

Link2:为李四投票

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

Web服务器

参数获取函数

获取到的参数

JSP/Tomcat

Request.getParameter(“par”)

First

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

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

对服务器端的攻击

比如某网站的实现如下:

[html]view plaincopy

void private executeBackendRequest(HTTPRequest request){

Stringaction=request.getParameter("action");

Stringuser=request.getParameter("userid");

Stringtarget=request.getParameter("target");

HttpRequest("http://centralauthencationserver/checkpriviledge.jsp", "POST","action="+action+"&user="+user+"&target="+target);}

/* get feedback of whether this user has privilege to perform specified action. If no such privilege, return error, otherwise continue perform the action*/

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协议是允许同名的参数的,在整个应用的处理过程中要意识到这一点从而根据业务的特征对这样的情况作正确的处理。


ps:完整版HPP漏洞配图

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 六、HTTP 参数污染 作者:Peter Yaworski 译者:飞龙 协议:CC BY-NC-SA 4.0 描述...
    布客飞龙阅读 680评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,631评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,811评论 0 11
  • 又是一年一度的秀恩爱现场直播,打开手机,到处都是和情人节有关的,这是一个万物复苏的季节,这是一个全民都能来蹭的热点...
    小哧阅读 679评论 0 0