【问题标题】:Transfer encoding: chunked causing problems for html response (using Modsecurity)传输编码:分块导致 html 响应出现问题(使用 Modsecurity)
【发布时间】:2017-07-12 07:15:24
【问题描述】:

我有一个使用 spring saml 和 Modsecurity 的基于 Java-Servlet 的 Web 应用程序。

对于其中一个 GET 请求(URL - /saml/login),响应是一个 HTML 页面,返回为 text/html(我可以在浏览器网络工具中读取 html 文件)以及 Content-Length 标头。这是 Modsecurity 被禁用的时候。

当我在应用程序中启用 ModSecurity 时,会返回相同的响应,并带有标头 Transfer-encoding: chunked。这次 html 响应由于分块而被编码。例如<html 显示为10<60h104t116m109l108。我不确定浏览器是否应该对此进行解码,但这破坏了我的应用程序的流程。由于响应以编码形式显示在浏览器上。

我尝试在 ModSecurity 中注释掉规则,以找出导致响应被分块但没有成功的原因。由于另一位开发人员实施了 ModSecurity,目前我不确定如何通过更改 ModSecurity 来解决这个问题。

因此,我想尝试在 Java 代码或浏览器中解码响应。如果 Html 文件渲染正常,后续的请求就会开始工作。

编辑1:

web.xml中的ModsecurityFilter配置:

<filter>
        <filter-name>ModSecurityFilter</filter-name>
        <filter-class>org.modsecurity.ModSecurityFilter</filter-class>
        <init-param>
            <param-name>conf</param-name>
            <param-value>/opt/ModSecurityFilter/modsecurity.conf</param-value>
        </init-param>
        <init-param>
            <param-name>libxml2</param-name>
            <param-value>/usr/lib/x86_64-linux-gnu/libxml2.so.2</param-value>
        </init-param>
        <init-param>
            <param-name>libpcre</param-name>
            <param-value>/lib/x86_64-linux-gnu/libpcre.so.3</param-value>
        </init-param>
        <init-param>
            <param-name>libaprutil-1</param-name>
            <param-value>/usr/lib/x86_64-linux-gnu/libaprutil-1.so.0</param-value>
        </init-param>

        <init-param>
            <param-name>libapr-1</param-name>
            <param-value>/usr/lib/x86_64-linux-gnu/libapr-1.so.0</param-value>
        </init-param>

        <init-param>
            <param-name>libModSecurityJNI</param-name>
            <param-value>/opt/ModSecurityFilter/java/.libs/libModSecurityJNI.so</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>ModSecurityFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

【问题讨论】:

  • 以前从未听说过。您使用什么 Web 服务器和 ModSecurity(Apache?Nginx?IIS?),什么平台(Linux?Windows?)以及什么版本的 ModSecurity?
  • 我正在使用 apache tomcat v8 Web 服务器和带有 ModSecurity 2.7 版的 Ubuntu 操作系统。
  • ModSecurity 在 Tomcat 上不受支持,所以你在它前面运行 Apache 吗?您可以尝试设置“SecDisableBackendCompression On”,看看是否有帮助?
  • BazzaDP - 我试过了,但在我的情况下不起作用。
  • 就我而言,只有一个 apache tomcat 服务器。我不确定 Modsecurity 是如何在此服务器上构建的。我正在使用 web.xml 中的 ModSecurityFilter 配置编辑我的答案。

标签: servlets mod-security transfer-encoding


【解决方案1】:

您似乎正在发回 ASCII 代码以及文本。以前从未见过,也不知道为什么 ModSecurity 会这样做。 Transfer-Encoding: chunked 是一个标准的 HTTP 响应,服务器和客户端都应该能够处理这个,它不应该改变返回的格式。

看起来您正在使用一些旧的 ModSecurity for Java,详见此处:https://www.trustwave.com/Resources/SpiderLabs-Blog/ModSecurity-for-Java---BETA-Testers-Needed/

我不知道它的存在,而且它已经超过 4 年没有得到维护,所以说实话不确定它有多稳定。

您可以尝试在上面的页面添加评论,或在 ModSecurity 用户邮件列表中寻求帮助:https://sourceforge.net/projects/mod-security/lists/mod-security-users

另一件可能值得尝试的事情是通过更改您的 modsecurity.conf 文件中的这一行来关闭响应正文处理:

SecResponseBodyAccess On

到这里:

SecResponseBodyAccess Off

然后重启Tomcat。这应该在 ModSecurity 不对其进行处理的情况下将响应传回。

响应正文通常用于信息泄漏,例如,详细的调试日志,以及应用程序内部工作的潜在详细信息不会发送回客户端。然而,虽然这很有用,但像 ModSecurity 这样的 WAF 主要是为了防止入站攻击。处理响应主体也会对性能产生影响,因为请求通常很小,因此更容易处理,而响应可能非常大(完整的 HTML 页面)。因此,我认为关闭此功能不会造成太大损失,甚至可能会获得保护。

【讨论】:

  • BazzaDP :感谢您的详细回复。我很感激!我试过这个选项(SecResponseBodyAccess Off),但它对我不起作用。有没有办法关闭特定 URL 请求或特定响应标头的 modsecurity?如果是,请指出所需的配置。
  • 你是从哪里得到 thar option() 语法的?不承认这一点。请参阅此处了解如何编写规则以关闭 ModSecurity:stackoverflow.com/questions/42829492/…
  • 即使在全局级别上转换规则后,我也无法解决此问题。我认为问题是由于 ModSecurity 过滤器或 ModSecurity 依赖项中的库之一。
  • 老实说,我只是将其关闭。如果您需要,请将 Apache 放在前面,并在其中添加最新的 ModSecurity。感谢您的设置更麻烦,但在应用服务器前面有一个网络服务器有好处。
猜你喜欢
  • 2014-04-12
  • 2018-07-12
  • 2016-06-11
  • 2011-05-19
  • 1970-01-01
  • 2023-03-16
  • 2013-09-28
  • 1970-01-01
  • 2014-04-28
相关资源
最近更新 更多