tomcat 400错误

本文介绍了Tomcat服务器在处理请求时出现400错误,导致中间件版本和异常信息泄露的问题。问题源于传递了无效字符,特别是未正确编码的特殊字符。修复方法是在`server.xml`中配置`relaxedQueryChars`属性,允许特定的特殊字符。此问题在高版本Tomcat中普遍存在,修复后能增强服务器的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本片文章是对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报错,无法启动服务的,这也是跟实施人员沟通过后才了解到的。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值