我是靠谱客的博主 顺心草丛,最近开发中收集的这篇文章主要介绍应用安全系列之九:HTTP参数污染,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本系列文章主旨在于介绍一些漏洞类型产生的基本原理,探索最基础的解决问题的措施,不排除有些语言或者系统提供的安全的API可以更好地更直接地解决问题,也不排除可以严格地输入验证来解决。

URL参数注入,也称为HPP(HTTP Parameter Pollution),主要是指通过URL中的特殊字符“&”注入一些额外的参数。

HPP发生在查询参数中,查询参数通常是指URI中“?”和URI结尾之间的部分,是一系列的域值对,可以参考RFC 3986查看其具体定义,这些域值对是通过“&”分开的,例如:name=admin&password=Test@123。如果用户输入的name的值为:admin&password=123,数据没有经过任何处理用于提交请求,那么这个URL就会被篡改为:name=admin&password=123&password=Test@123。

当一个请求中输入两个同样的名字的参数,web服务器会怎么处理呢? 不同的web服务器和技术,对于这种情况的解析一般也不一样。具体信息入以下表格:

技术/HTTP后台整体解析结果例    
ASP.NET/IIS所有的值Para1=val1,val2
ASP/IIS所有的值Para1=val1,val2
PHP/Apache最后一个值Para1=val2
JSP,Servlet/Apache,Tomcat第一个值Para1= val1
JSP,Servlet/Oracle Application Server 10g第一个值Para1= val1
JSP,Servlet/Jetty第一个值Para1= val1
IBM Lotus Domino最后一个值Para1=val2
IBM HTTP Server第一个值Para1= val1
Perl CGI/Apache第一个值Para1= val1
Python/Zope变成一个数组Para1= [‘val1’, ‘valu2’]

HPP的危害可能会被用于绕过一些防火墙的规则,因为防火墙获取的参数如果和应用获取的参数不一致,就可以绕过一些WAF的规则。当然,如果参数中有action有关的操作,也可能用于越权。

HPP的预防方法也比较简单,在组装URL之前,将输入的值做URL编码即可,也就是使用%+字符的16进制数值即可。需要处理的典型字符以及编码如下:

字符编码方式编码结果
&URL编码%26
%%25
"%22
NUL%00
#%23
空格%20
/%2F
=%3D

有些语言也提供URL编码的API,建议使用系统提供的API,例如,Java的 java.net.URLEncoder,PHP的urlencode ( string $str ) : string,c#的HttpUtility.UrlEncode。不过,不同的语言可能得到的结果不一样,例如,大小写。

如果有不妥之处,希望可以留言指出。谢谢!

最后

以上就是顺心草丛为你收集整理的应用安全系列之九:HTTP参数污染的全部内容,希望文章能够帮你解决应用安全系列之九:HTTP参数污染所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部