类型: 安全缺陷
HTTP参数污染(HPP)攻击根据HTTP协议中允许同名参数出现多次,如果程序没有正确地检查用户输入,攻击者可以在传输参数的时候传输key相同而value不同的参数,从而达到绕过某些防护与参数校验。
如果向Web应用程序提交参数,并且如果这些参数与现有参数的名称相同,Web应用程序可能会有下列一种反应:Web程序可能从第一个参数或最后一个参数提取数据,也可能从所有参数中获取数据并连接起来。
下面这个表格列举了一些常见的Web服务器对同样名称的参数出现多次的处理方式:
Web服务器 获取的参数
ASP.NET/IIS 所有参数组成用逗号分隔的字符串
ASP/IIS 所有参数组成用逗号分隔的字符串
PHP/Apache 最后一个参数
JSP Servlet/Apache Tomcat 第一个参数
JSP Servlet/Oracle Application Server 10g 第一个参数
IBM HTTP Server 第一个参数
mod_perl/Apache 所有参数成为数组
Spring 4 起,UriTemplate类可执行用于阻止请求参数注入的编码。
String lang = request.getParameter("lang");
GetMethod get = new GetMethod("http://www.codesafe.com");
get.setQueryString("lang=" + lang + "&id=" + id);
get.execute();
攻击者可能会提供一个lang(例如en&id=1),然后攻击者将可以随意更改该id。