相关文章推荐
俊逸的热带鱼  ·  CASE (Transact-SQL) - ...·  4 月前    · 

本片文章是对tomcat 400 错误造成信息泄露,如何进行修复进行描述,希望可以对非安全专业的互联网工作人员提供一点帮助,本片文章内容确实也是笔者最近遇到的一些问题。

tomcat 发生400 错误,暴露出中间件版本、以及程序抛出的一些异常。

异常内容为

    org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:503)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:502)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1627)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:745)

和图片有点不一样,因为这个是我从网上粘贴写来的,不过出现异常的一样的,

虽然实际危害也就那么回事,但是这个毕竟是项目上遇到的问题,打码还是最基本的职业道德。
在这里插入图片描述

其中图片中这些异常都不是重点,重点是

在请求目标中无法找到有效字符,有效字符在RFC 7203和 RFC 3986 中定义

这个报错的英文版是

Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

就是说我们传递了无效字符,tomcat 无法处理导致报错,这个问题在高版本tomcat 中均存在,从7.0.88开始,大多数tomcat版本都会出现此问题。

截图中测试者直接使用burp Suit 传递了一个 XSS payload去测试 autoCode 参数,由于是burp 直接输入的payload, “<”、">",等特殊字符未进行url 编码,tomcat 处理不了了,而tomcat没有报500的服务器端错误,而是报的400错误(请求报文存在语法错误),这是因为,这个错误被认为是客户端的错误(tomcat 是这样认为的)。

Tomcat增强了其安全性,并且不再允许在查询字符串中使用原始方括号。在请求中,我们有{,} 或其他符号("<",">","[","}"等),因此服务器未处理该请求。

在tomcat conf路径下的server.xml文件里面的 Connector 标签下添加属性 relaxedQueryChars:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxHttpHeaderSize ="10240" relaxedQueryChars="{,}"/>

一般直接添加这个

<Connector port="8084" protocol="HTTP/1.1" relaxedPathChars="[]|" relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;" useBodyEncodingForURI="true" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

多符号可以用"," 隔开,上面那些奇怪的编码是html 实体编码,内容是<、>等符号,直接输入这些符号有些会导致tomcat报错,无法启动服务的,这也是跟实施人员沟通过后才了解到的。

至于中间件版本好的隐藏,大家去百度的,懒得写了。。。。

tomca 400 错误在请求目标中无法找到有效字符,有效字符在RFC 7203和 RFC 3986中定义 Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:503) org
Tomcat 400报错显示tomcat信息,这就存在着很大的安全隐患。 根据官网给出的方案需要重写ErrorReportValve处理400错误跳转到自定义页面,首先需要更改tomcat中的server.xml文件,在host中添加Valve,页面将不显示错误的详细信息。 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className...
在代码中打印各种日志来排查,比如方法的入参,出参,及在方法体中打印日志判断走哪行代码 还有你觉得代码没问题,可是运行出现却是以前的bug,感觉代码没修改,或者别人把你修改好之前的代码部署上去了,你想要看线上部署的是不是你修改的最新代码,把包从服务器上下载下来然后再反编译查看 有些接口请求很慢,你想知道这个接口的方法调用链中耗时时间,你以前是不是通过切面去打印每个方法的耗时时间,修改代码,重新部署 当进程CPU飙高或者占用内存较大,你用top命令查看,然后top -
1.server.xml 原来没有配置 maxHttpHeaderSize,默认值只有 4096 个字节(4k) 修改tomcat请求头长度限制 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" maxHttpHeaderSize="500000"/> 重启一下tomcat 2.修改application,yml 或者减少请求头报文
Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 新版本的tomcat对url的参数做了比较规范的限制,必须按照RFC 7230 and RFC 3986规范,对于非保留字字符,如果不做转义处理,一律都会报The valid characters are defined in RFC 7230 and RFC 3986 错误。 org.apache