hpp参数污染了解
HPP是HTTP Parameter Pollution的缩写。
这个漏洞由S. di Paola 与L. Caret Toni在2009年的OWASP上首次公布。这也是一种注入型的漏洞,攻击者通过在HTTP请求中插入特定的参数来发起攻击。如果Web应用中存在这样的漏洞,可以被攻击者利用来进行客户端或者服务器端的攻击。
通过hpp参数污染可以达到绕过sqlwaf,上传waf来进行攻击。
hpp参数污染原理
在跟服务器交互的过程中,http允许 get 或者post多次传同一参数值,造成覆盖达到一些绕过waf的效果。
GET /foo?par1=val1&par2=val2 HTTP/1.1
User-Agent: Mozilla/5.0
Host: Host
Accept: */*
如上面的http请求,一般同一参数名字只能传参一次,但是http协议中允许同样名称的参数出现多次。
但是不同的服务器处理方式会不一样,比如:
必应
我们输入了两次q参数,第一次为aa第二次为bb被覆盖了,
谷歌
输入两个q参数可以看到都被加载到了浏览器搜索中。没有覆盖
如果同时提供2个搜索的关键字参数给Google,那么Google会对2个参数都进行查询;但是必应则不一样,它只会处理后面一个参数。下面这个表简单列举了一些常见的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)
参数污染实例
waf绕过
这种服务器的解析方式本身没有什么缺陷,但是如果配合一些waf规则以及其他规则,则有可能造成一些危害,根据waf解析的先后规则则有可能绕过waf设置的原意。
$sql = "select * from admin where id=1";
$sql=$sql."".$_POST['bbs'];
echo $sql;
$pattern='/^.*union.*$/';
if(preg_match($pattern, $sql))
{echo "注入测试 ";}
在特定情况下 bbs=u&bbs=n&bbs=i&bbs=o&bbs=n&bbs=select 1,user(),3
可以绕过一些waf,在CTF中也有出现。
将参数分离写入,waf在输入之后就开始拦截,在后端又拼接成完整的union,根据一些特定服务器就可以绕过waf进行注入。
文件上传
先看一个上传数据包。
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
Phpinfo();
?>
-----------------------------440470572354
Content-Disposition: form-data; name="submit"
Submit
-----------------------------440470572354--
Content-Type:multipart/form-data; 指代的是这个数据是来自表单提交的
某些WAF是通过Content-Type识别是否是文件上传数据包。假设我们将Content-Type更改,数据包也是正常提交过去的。这个就完成了一次bypass。
还有的时候就是Content-Disposition: form-data;,也有某些WAF是根据Content-Disposition匹配filename的,用于验证黑名单。我们经过混淆大小写也是可以bypass的。(http://www.secpulse.com/archives/56523.html)
拦截:
在HPP中最典型的的例子就是“双文件上传”。
就是在协议中,提交两个相同的值,达到欺骗WAF一次匹配的目的。在这里提点一下http协议中参数名与参数值的结构。
可以看到filename参数写了两次,可能绕过一些上传限制。
xss
当然这种特性有时候也可以测试xss漏洞,原理一样。暂不测试。