将[System.Web.Configuration.HttpRuntimeSection.EnableHeaderChecking
](http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.enableheaderchecking(VS.85).aspx)设置为true
(默认值)是否足以完全阻止Http Header Injection攻击,例如Response Splitting等。
我问,因为白盒渗透测试工具(强化)报告了HttpResponse.Redirect
和Cookie可利用的http标头注入问题,但我还没有找到成功执行攻击的方法。 (编辑:..我们已启用EnableHeaderChecking ..)
答案 0 :(得分:7)
我已经看了一段时间了,并得出结论,将EnableHeaderChecking设置为true
实际上足以阻止http标头注入攻击。
查看'反映'的ASP.NET代码,我发现:
HttpResponseHeader
(内部)HttpResponseHeader.MaybeEncodeHeader
(针对IIS7WorkerRequests
)HttpResponseHeader
个实例是在发送RedirectLocation或ContentType等已知标头之前创建的(HttpResponse.GenerateResponseHeaders
)HttpResponseHeader
构造函数检查EnableheaderChecking设置,并在设置为HttpResponseHeader.MaybeEncodeHeader
时调用true
HttpResponseHeader.MaybeEncodeHeader
正确编码换行符,这使得无法进行HTTP标头注入攻击这是一个大致演示我如何测试的片段:
// simple http response splitting attack
Response.AddHeader("foo", "bar\n" +
// injected http response, bad if user provided
"HTTP/1.1 200 OK\n" +
"Content-Length: 19\n" +
"Content-Type: text/html\n\n" +
"<html>danger</html>"
);
只有在明确关闭EnableHeaderChecking时才能使用上述内容:
<httpRuntime enableHeaderChecking="false"/>
Fortify不会考虑配置(明确设置EnableHeaderChecking没有效果),因此总是报告这些类型的问题。
答案 1 :(得分:1)
AFAIK就足够了,默认情况下应该打开它。
我认为Fortify只是考虑深度防御,就好像你改变了部署中的配置等。
我认为你没有在你的配置中严格设置它,如果你有可能Fortify不是那么聪明的想法我们。
最佳确认方法是利用它:)
答案 2 :(得分:0)
EnableHeaderChecking仅适用于不受信任的数据。如果您将数据直接从cookie传递到重定向,则可能会将生成的标头视为可信标题,并且\ r \ n值不会被转义。
答案 3 :(得分:0)
Josef,HttpResponse.AppendHeader()不是唯一不受信任的数据可以进入HTTP响应标头的地方。
如果数据包含回车符(或任何被解释为回车符),攻击者以Cookie或HTTP重定向结束的任何数据都可以写入新的标题。
通常,您可以更好地利用时间来验证数据,而不是坐下来尝试解决漏洞。很可能,黑客在这方面会比你或我更好。