欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HTTP/1.1 400 Bad Request 与 Tomcat

程序员文章站 2022-06-01 15:01:47
...

HTTP/1.1 400 Bad Request 概览

400 Bad Request
The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing)
–wikipedia

由于有明显的客户端错误,服务器不能或者不会处理请求(例如,异常的请求语法,请求的长度过大,无效的请求信息帧,或者欺骗性的路由)

问题

1、无效的请求信息帧

请求信息

  • HTTP/1.1 400 Bad Request 与 Tomcat
  • 请求类型:HTTP GET
  • 请求参数:有一个参数是JSON格式的数据(重点关注)

响应信息

  • Tomcat 的日志

    • Tomcat Catalina Log
      15-Aug-2018 10:42:47.424 信息 [http-nio-8080-exec-3] org.apache.coyote.http11.AbstractHttp11Processor.process Error parsing HTTP request header
      Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
      java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
      at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:287)
    • Tomcat Localhost Access Log
      192.168.1.149 - - [15/Aug/2018:10:42:57 +0800] “GET null null” 400 -
      192.168.1.149 - - [15/Aug/2018:10:43:28 +0800] “GET / HTTP/1.1” 200 31
    • 分析

      1. catalina 日志内容表示:解析 HTTP 请求头部错误,请求对象中发现非法字符。合法字符定义在 RFC 7230 和 RFC 3986
      2. localhost access 日志显示异常的访问日志:GET null null
      3. 结合上面两点,进一步分析:

        • 分析 RFC 3986

          2.2. Reserved Characters
          reserved = gen-delims / sub-delims
          gen-delims = “:” / “/” / “?” / “#” / “[” / “]” / “@”
          sub-delims = “!” / “$” / “&” / “’” / “(” / “)” / “*” / “+” / “,” / “;” / “=”
          2.3. Unreserved Characters
          unreserved = ALPHA / DIGIT / “-” / “.” / “_” / “˜”

          • 从 RFC 3986 的 2.2 章节查看 URL 中保留字符
          • 从RFC 3986 的 2.3 章节查看 URL 中未保留字符(希腊字母+数字+“-._~”)
          • 请求信息中的一个参数包含“{}”,也就是 HTTP GET 的 URL 中带有字符“{}”,这个字符没有包含在 RFC 3986 规定的合法字符集中,所以报错 HTTP 400 Bad Request。

    验证分析结论

  • Tomcat 添加配置,使“{}”作为合法字符处理
catalina.properties 中添加以下配置:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
  • 添加配置后:
    HTTP 请求成功
    存在问题:启用这个配置,可能有信息泄露 CVE-2016-6816 风险

HTTP/1.1 400 Bad Request 与 Tomcat

Tomcat 版本问题

  • Tomcat 7.0.73 之后的版本才遵循 RFC 7230 和 RFC 3986 。
  • Tomcat 7.0.73 之前的早期版本的Tomcat 没办法重现这个问题。