Security http头的安全性
在发送http头之前,我们要仔细检查它们的安全性。显然,我们不能允许出现'\r'或'\n',因为这将允许内容注入 我在这里只看到两个选项:Security http头的安全性,security,http,http-headers,escaping,base64,Security,Http,Http Headers,Escaping,Base64,在发送http头之前,我们要仔细检查它们的安全性。显然,我们不能允许出现'\r'或'\n',因为这将允许内容注入 我在这里只看到两个选项: 截断换行符处的值 从标题值中删除无效字符 另外,从阅读来看,似乎只有ascii可打印字符对http头值有效,我是否也应该对其他154个可能的无效字节遵循相同的策略 或者,在这个主题上是否有任何权威的现有技术?简单地删除新行\n将阻止。即使CRLF在RFC中用作分隔符,所有浏览器都可以识别新行 您仍然需要担心集cookie或内容类型中的用户内容。这些元素中的属
或者,在这个主题上是否有任何权威的现有技术?简单地删除新行
\n
将阻止。即使CRLF在RFC中用作分隔符,所有浏览器都可以识别新行
您仍然需要担心
集cookie
或内容类型
中的用户内容。这些元素中的属性使用分隔代码>,攻击者可能会将内容类型更改为UTF-7并绕过IE用户(且仅限于IE用户)的XSS保护。攻击者还可能创建新的cookie,从而引入会话固定的可能性 头字段中允许使用非ASCII字符,尽管规范没有明确说明它们的含义;因此,发送者和接收者需要在语义上达成一致
是什么让你产生了相反的想法?这种攻击被称为“头拆分”或
OWASP链接指出,仅删除CRLF是不够的<代码>\n
可能同样危险
若要成功利用此漏洞,应用程序必须允许在标头中输入包含CR(回车,也由0x0D或\r给出)和LF(换行,也由0x0A或\n给出)字符的输入
(我不知道为什么OWASP(和其他页面)将\n
列为漏洞,或者这是否只适用于预解码的查询片段。)
在任何试图设置头键或值中包含规范不允许的字符的头时提供500是完全合理的,并且允许您在日志中识别攻击性请求。当您知道过滤器出现故障时,快速故障是一个很好的策略
如果您使用的语言允许,您可以将HTTP响应对象包装成一个在看到错误头时引发异常的对象,或者您可以更改响应对象以进入无效状态,将响应代码设置为500,然后关闭响应体流
编辑:
我应该去掉非ASCII输入吗
我更喜欢在接收可信输入的层中进行这种规范化,除非有明确的类型转换,就像实体转义将纯文本转换为HTML转义一样。如果是类型转换,我会在需要输出类型时进行转换,但如果不是类型转换,我会尽早进行转换,以便该类型数据的所有使用者都能看到一致的值。我发现这种方法使调试和文档编制变得更容易,因为输入处理下面的层不必担心非规范化的输入
在实现HTTP响应包装器时,我会使它在所有非ascii字符上失败(包括非ascii换行符,如U+85、U+2028、U+2029)然后确保我的应用程序测试包括对每个第三方URL输入的测试,以确保在位置到达setHeader
之前,对任何位置
头进行了正确的编码,以及类似地,对可能到达请求头的其他输入进行编码
如果您的cookie包含用户id或电子邮件地址之类的内容,我会确保测试的虚拟帐户包含一个虚拟帐户,该帐户的用户id或电子邮件地址包含非ASCII字母。标题定义为文本,文本为“除CTL外的任何八位字节,但包括LWS”。CTL是“(八位字节0-31)和DEL(127)”。这似乎允许八位字符>127,但我怀疑这是有意的。我看到一些允许通过“编码字”进行非iso-8859-1编码,但它接着说,“只有可打印和空白字符数据应使用此方案进行编码”,在这种情况下,我宁愿使用ascii。bukzor:我认为这是有意的,我知道它偶尔会被使用。还需要中间产物让所有8位通过,否则将来某个时候就不可能使用UTF-8作为头字段编码。我认为utf8已经过时了,因为明确禁止使用八位字节0-31和127。bukzor:不,这只是意味着不能使用CTL或DEL。这不会影响其他字符集。你能进一步扩展与UTF7相关的XSS吗,或者给出一个参考吗?@Rook,我相信如果你控制
内容类型
头,你可以在IE之外的浏览器上进行UTF-7攻击。只有IE在没有指定编码时才会猜测UTF-7,但其他浏览器仍应遵守UTF-7标头。ha.ckers.org在自动检测并强烈暗示其他浏览器尊重标题的浏览器中包括“IE渲染引擎模式下的Netscape 8.1”。@bukzor,请参阅:+ADw脚本+AD4警报('XSS')中标题为“UTF-7编码”的部分+ADw-/SCRIPT+AD4-
@Mike Samuel好极了,你试过在firefox或chrome上执行这段代码吗?UTF-7用于SMTP,而不是HTTP,IE是唯一支持它的,他们在IE9中放弃了UTF-7内容嗅探。xss备忘单已经有5年历史了,几乎没用了。@Rook。我还没有在非微软浏览器的最新版本上尝试过。我同意UTF-7的目的。我的理解是,浏览器在某些时候使用字节[]->UTF-16[]编码的标准库,而UTF-7在许多库中都可用。如果较新的浏览器对编码持怀疑态度,那就太好了,但是我们这些在框架上工作的人需要支持那些想要支持IE 6和Safari较早版本的应用程序开发人员。我们应该去掉非ascii可打印字符吗?谢谢你提供的详细信息