跳到主要内容

HTTP头注入

概要

HTTP头注入是指攻击者利用外部传入的参数值等动态生成HTTP响应头的字段值的情况下产生的漏洞。当HTTP响应头输出处理存在问题时,攻击者可能会发起攻击,例如向响应内容中添加任意头字段,创建任意主体,或者发起制造多个响应的攻击。这种问题称为“HTTP头注入漏洞”,而利用该问题的攻击方法称为“HTTP头注入攻击”。

可能存在的威胁

攻击者可以利用此漏洞发起的攻击包括:

  • 跨站脚本攻击:如果注入了任意响应主体,则攻击者可能会在用户的浏览器上显示虚假信息或嵌入任意脚本。
  • 发行任意Cookie:如果注入了Set-Cookie头,则可能会发行任意Cookie,并在用户的浏览器中保存。
  • 缓存服务器的缓存污染:通过将响应分成多个部分并将任意响应主体缓存到反向代理等中,可以引起缓存污染(替换网页)。这会导致与网页篡改相同的威胁。

根本的解决方案

以下是根本的解决方案:

  • 不要自己拼字符串输出响应头,而是使用Web应用程序的执行环境或语言中提供的头输出API。这些API通常会对字段值中的换行符做妥善处理,可以避免外部输入中夹带的换行符被原样写进响应头。但要注意,有些API的实现可能存在处理换行符不当的漏洞,应确认所用API的行为或使用已修复漏洞的版本。
  • 如果无法使用合适的头输出API,则由开发人员自行对字段值中的换行符做适当处理,例如:删除换行符及其后的字符,或在检测到字段值包含换行符时直接中止处理并报错。(早期做法还有“在换行后插入空格作为续行”,但HTTP头的续行(折叠)机制已被 RFC 7230 废弃,不建议采用。)

保险措施

以下是保险措施:

  • 对于来自外部的所有输入,删除换行符。或者,不仅删除换行符,还可以删除控制代码。但是,如果Web应用程序需要接受可能包含换行符的字符串(例如TEXTAREA的输入数据),则需要注意,如果像此对策一样对所有输入进行统一处理,则采取措施的Web应用程序可能无法正常工作。

通过以上措施,可以提高对HTTP头注入攻击的安全性。