概述
本系列文章主旨在于介绍一些漏洞类型产生的基本原理,探索最基础的解决问题的措施,不排除有些语言或者系统提供的安全的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参数污染所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复