首页 > 代码库 > "永哥和你聊安全"系列之——谈HTTP参数污染

"永哥和你聊安全"系列之——谈HTTP参数污染

这期内容永哥想和大家聊聊HTTP参数污染及其防御方法。首先,永哥需要指出,HTTP参数污染不是一个漏洞,而是服务器端根据配置的不同所显示出的不同特性。如果网站存在SQL注入或者是XSS等漏洞,并且有相应的防护措施,那么HTTP参数污染可能会帮助攻击者绕过这些防御措施。

 

HTTP参数污染,简单地讲就是给一个参数赋上两个或两个以上的值。现行的HTTP标准没有提及在遇到多个输入值给相同的参数赋值时应该怎样处理。因此web程序组件在遇到这类问题时采取的方法也不完全相同。

 

首先,先来看一下,不同的网站在处理这类情况时所显示出的不同个性。当输入URL为www.baidu.com/s?tn=baidusite&word=usa&word=china时,此时给需要搜索的关键字,即参数word赋了两个值,分别为usa和china,可见百度会接受第一个参数(即usa)而放弃第二个参数(即china)

 

技术分享

 

同样的例子用于Yahoo,如URL为search.yahoo.com/search?p=usa&p=china时,搜索关键字在URL中的变量为p,分别两次赋值为usa和china,从结果中可见,yahoo会接受最后一个参数(即china),而放弃第一个参数(即usa)

 

技术分享

 

最后一个例子来自Google,URL为www.google.com.hk/search?q=usa&q=china,可见搜索关键字在URL中对应的变量为q,我们分别给它赋值usa和china,从搜索结果可知,Google会将两个值都采纳,并且通过一个空格将两个参数连接起来,组成一个参数。

 

技术分享

 

下面的表格简单列举了一些常见的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)

 

以HTTP参数污染作为辅助手段,曾成功帮助攻击者绕过了防御,接下来永哥和大家分享几个真实案例:

 

案例一

2009年,ModSecurity过滤器会将类似于select1,2,3 from table这类的语句归类为黑名单。当web服务器遇到类似/index.aspx?page=select 1,2,3 from table这样的语句时,会阻断请求。但是这个web服务器在遇到为同一个参数赋值不同数值时,会将它们连接起来,攻击者可以通过这个方法来绕过黑名单。例如提交如下的URL:

/index.aspx?page=select 1&page=2,3from table

 

首先,这不是黑名单中的模式,不会触发黑名单的拦截功能。其次,由于web程序会采取连接操作,即将&符号前后的内容连接,因此SQL注入行为能够被执行。

 

案例二

这个案例是关于Apple Cups的,它是被许多UNIX系统利用的打印系统。利用如下的方式触发一个XSS攻击:

http://127.0.0.1:631/admin/?kerberos=onmouseover=alert(1)&kerberos

 

利用这个方法可以绕过系统的验证机制,原因是这个验证系统只采纳了第二个kerberos的值,这个值为空,因此不会触发。而第一个kerberos直到被用于构建动态HTML内容前都没有被验证。最终在web站点的上下文中javascript语句被执行。

 

如何防御,永哥建议:

 

概括地讲,防范这类攻击的方法有两种:第一种方法是让WAF或其他网关设备(比如IPS)在检查URL时,对同一个参数被多次赋值的情况进行特殊处理。由于HTTP协议允许相同参数在URL中多次出现,因此这种特殊处理需要注意避免误杀的情况;第二种方法是在代码层面,编写WEB程序时,要通过合理的$_GET方法获取URL中的参数值,而尝试获取web服务器返回给程序的其他值时要慎重处理。

 

针对上面的案例,对于第一种情况,由于服务器特性,攻击特征虽然可以避开部分安全产品,但特征最终会被重组,因此代码层面的检查可以有效的防护此类攻击。而对于第二种情况,由于HTTP参数污染的作用是配合其他web攻击方法来绕过防护,因此防止黑客利用HPP进行攻击的最有效方法,是通过严谨的编码使得web程序中不存在安全漏洞。例如,上述案例二的情况,是通过HTTP参数污染帮助攻击者绕过防护进行XSS攻击,假如web程序对从URL中取下的变量都进行了安全转义,那么XSS漏洞便不存在,HTTP参数污染的绕过方法也就没有了意义。对于第二种攻击场景,由于攻击特征赋值给特定的变量,攻击特征相对完整,对于IPS和WAF产品,其WEB防护功能也可以有效的防护此类攻击。

那么什么是HPP参数污染呢?


假设这个URL:http://www.xxxx.com/search.php?id=110&id=911

百度会理解成让百度搜索:110                 #选择了第一个参数,放弃了第二个参数。

雅虎会理解成让雅虎搜索:911            #选择了第二个参数,放弃了第一个参数。

谷歌会理解成让谷歌搜索:110 911         #两个参数同时选择。

主要的就是这三种情况了。

这主要是源于,不同的网站对处理参数的处理方式不同。PS:跟米哥一起学习的,总结米哥的,感觉我总结的还是欠妥当。

 

那么注入是怎么跟HTTP污染产生关系的呢?


倘若是第三种情况,也就是第一个参数取第二个参数也取。那么大家请看下面的URL

http://www.xishaonian.com/hello.php?id=select 1&id=2,3,3 from admin

该种情况还可用于Bypass WAF.

当然还可以与XSS结合。

 

 

具体服务端处理方式如下:

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)

"永哥和你聊安全"系列之——谈HTTP参数污染