将[System.Web.Configuration.HttpRuntimeSection.EnableHeaderChecking](http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.enableheaderchecking(VS.85).aspx)设置为true(默认)足以完全阻止Http Header Injection攻击(例如响应拆分等)吗?

我问是因为白盒渗透测试工具(fortify)报告了HttpResponse.Redirect和cookie的可利用的http header 注入(inject)问题,但是我还没有找到成功进行攻击的方法。 (编辑:..,我们已启用EnableHeaderChecking。)

最佳答案

我已经研究了一段时间了,得出的结论是,将EnableHeaderChecking设置为true实际上足以阻止HTTP header 注入(inject)攻击。

查看“反射的” ASP.NET代码,我发现:

  • 只有一种方法可以向HTTP响应中添加自定义HTTP header ,即使用HttpResponse.AppendHeader方法
  • HttpResponse.AppendHeader
  • 创建HttpResponseHeader(内部)实例
  • 或调用HttpResponseHeader.MaybeEncodeHeader(对于IIS7WorkerRequests)
  • 或分配其各自的属性(对于已知的 header ,例如RedirectLocationContentType)
  • HttpResponseHeader实例是在发送已知的 header (如RedirectLocationContentType)之前创建的(HttpResponse.GenerateResponseHeaders)
  • HttpResponseHeader构造函数检查EnableheaderChecking设置,并在设置为HttpResponseHeader.MaybeEncodeHeader时调用true
  • HttpResponseHeader.MaybeEncodeHeader正确编码换行符,这使得HTTP header 注入(inject)攻击无法实现

  • 这是一个大致演示我如何测试的代码段:
    // 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无效),因此始终报告此类问题。

    09-25 22:13