解决 org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误

20-Dec-2024 07:00:21.634 信息 [catalina-exec-98] org.apache.tomcat.util.http.parser.Cookie.logInvalidHeader 收到包含无效cookie的cookie头[expires=Fri, 19 Nov 2024 23:22:28 GMT\r\n]。将忽略该cookie。
 注意:此错误的进一步出现将记录在调试级别。
20-Dec-2024 07:21:46.655 信息 [catalina-exec-6] org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header  错误
 注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。
        java.lang.IllegalArgumentException: 在请求目标中找到无效字符[/index.php?lang=../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/&/<?echo(md5("hi"));?>+/tmp/index1.php ]。有效字符在RFC 7230和RFC 3986中定义
                at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:482)
                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261)
                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928)
                at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2165)
                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
                at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
                at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
                at java.base/java.lang.Thread.run(Thread.java:834)

 

tomcat9.x 处理

处理 HTTP 请求头解析错误问题
  • 理解问题根源
    • 这个问题是因为请求目标中包含了不符合 RFC 7230 和 RFC 3986 定义的无效字符。这可能是恶意请求(如路径遍历攻击等)或者错误的请求格式导致的。
  • 解决方案
    • 配置 Tomcat 的请求过滤(重要安全措施)
      • Tomcat 9 提供了allowEncodedSlash属性。在server.xml文件中,对于<Connector>元素,可以设置allowEncodedSlash="false"。这可以防止包含编码斜杠(%2F)的恶意路径遍历请求。例如:
      • <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443"
                   allowEncodedSlash="false"/>
        
      • 关于allowEncodedSlash="false"的作用
        • 路径编码斜杠问题
          • 设置allowEncodedSlash="false"是一个重要的安全措施。它可以防止包含编码斜杠(%2F)的恶意路径遍历请求。在你提供的错误信息中,请求目标包含了可疑的路径遍历尝试(/index.php?lang=../../../../../../../../usr/local/lib/php/pearcmd),这种配置可以在一定程度上阻止这种包含编码斜杠的恶意请求构造。
        • 局限性
          • 然而,它不能解决所有问题。它主要针对的是包含编码斜杠的路径问题,对于请求中其他不符合 RFC 7230 和 RFC 3986 定义的无效字符(如这个请求中的&+组合等不符合规范的部分),它无法直接解决。
posted @ 2024-12-20 08:27  锐洋智能  阅读(1128)  评论(0)    收藏  举报