hpp參數(shù)污染了解
HPP是HTTP Parameter Pollution的縮寫(xiě)。
這個(gè)漏洞由S. di Paola 與L. Caret Toni在2009年的OWASP上首次公布。這也是一種注入型的漏洞,攻擊者通過(guò)在HTTP請(qǐng)求中插入特定的參數(shù)來(lái)發(fā)起攻擊。如果Web應(yīng)用中存在這樣的漏洞,可以被攻擊者利用來(lái)進(jìn)行客戶端或者服務(wù)器端的攻擊。
通過(guò)hpp參數(shù)污染可以達(dá)到繞過(guò)sqlwaf,上傳waf來(lái)進(jìn)行攻擊。
hpp參數(shù)污染原理
在跟服務(wù)器交互的過(guò)程中,http允許 get 或者post多次傳同一參數(shù)值,造成覆蓋達(dá)到一些繞過(guò)waf的效果。
????GET /foo?par1=val1&par2=val2 HTTP/1.1
????User-Agent: Mozilla/5.0
????Host: Host
????Accept: */*
如上面的http請(qǐng)求,一般同一參數(shù)名字只能傳參一次,但是http協(xié)議中允許同樣名稱(chēng)的參數(shù)出現(xiàn)多次。
但是不同的服務(wù)器處理方式會(huì)不一樣,比如:
必應(yīng)
我們輸入了兩次q參數(shù),第一次為aa第二次為bb被覆蓋了,
谷歌
輸入兩個(gè)q參數(shù)可以看到都被加載到了瀏覽器搜索中。沒(méi)有覆蓋
如果同時(shí)提供2個(gè)搜索的關(guān)鍵字參數(shù)給Google,那么Google會(huì)對(duì)2個(gè)參數(shù)都進(jìn)行查詢(xún);但是必應(yīng)則不一樣,它只會(huì)處理后面一個(gè)參數(shù)。下面這個(gè)表簡(jiǎn)單列舉了一些常見(jiàn)的Web服務(wù)器對(duì)同樣名稱(chēng)的參數(shù)出現(xiàn)多次的處理方式:
????Web服務(wù)器? ? ? ? ? ? ? ? 參數(shù)獲取函數(shù)???????????????????????????????????獲取到的參數(shù)
????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)
參數(shù)污染實(shí)例
waf繞過(guò)
這種服務(wù)器的解析方式本身沒(méi)有什么缺陷,但是如果配合一些waf規(guī)則以及其他規(guī)則,則有可能造成一些危害,根據(jù)waf解析的先后規(guī)則則有可能繞過(guò)waf設(shè)置的原意。
????$sql = "select * from admin where id=1";
????$sql=$sql."".$_POST['bbs'];
????echo $sql;
????$pattern='/^.*union.*$/';
????if(preg_match($pattern, $sql))
????{echo "注入測(cè)試???";}
在特定情況下 bbs=u&bbs=n&bbs=i&bbs=o&bbs=n&bbs=select 1,user(),3
可以繞過(guò)一些waf,在CTF中也有出現(xiàn)。
將參數(shù)分離寫(xiě)入,waf在輸入之后就開(kāi)始攔截,在后端又拼接成完整的union,根據(jù)一些特定服務(wù)器就可以繞過(guò)waf進(jìn)行注入。
文件上傳
先看一個(gè)上傳數(shù)據(jù)包。
????POST /upload.php HTTP/1.1
????Host: 192.168.1.100
????User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0
????Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
????Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
????Accept-Encoding: gzip, deflate
????Referer: http://192.168.1.100/
????Cookie:yunsuo_session_verify=1a9c7117538a7a9bce39a4695ff3f0cc; safedog-flow-item=
????X-Forwarded-For: 1.1.1.1
????CLIENT_IP: 2.2.2.2
????Connection: keep-alive
????Upgrade-Insecure-Requests: 1
????Content-Type:multipart/form-data; boundary=---------------------------440470572354
????Content-Length: 1089
-----------------------------440470572354
????Content-Disposition: form-data; name="file"; filename="n.php"
????Content-Type: application/octet-stream
????<?php
????Phpinfo();
?????>
-----------------------------440470572354
????Content-Disposition: form-data; name="submit"
????Submit
-----------------------------440470572354--
Content-Type:multipart/form-data; 指代的是這個(gè)數(shù)據(jù)是來(lái)自表單提交的
某些WAF是通過(guò)Content-Type識(shí)別是否是文件上傳數(shù)據(jù)包。假設(shè)我們將Content-Type更改,數(shù)據(jù)包也是正常提交過(guò)去的。這個(gè)就完成了一次bypass。
還有的時(shí)候就是Content-Disposition: form-data;,也有某些WAF是根據(jù)Content-Disposition匹配filename的,用于驗(yàn)證黑名單。我們經(jīng)過(guò)混淆大小寫(xiě)也是可以bypass的。(http://www.secpulse.com/archives/56523.html)
攔截:


在HPP中最典型的的例子就是“雙文件上傳”。
就是在協(xié)議中,提交兩個(gè)相同的值,達(dá)到欺騙WAF一次匹配的目的。在這里提點(diǎn)一下http協(xié)議中參數(shù)名與參數(shù)值的結(jié)構(gòu)。
可以看到filename參數(shù)寫(xiě)了兩次,可能繞過(guò)一些上傳限制。

xss
當(dāng)然這種特性有時(shí)候也可以測(cè)試xss漏洞,原理一樣。暫不測(cè)試。