一般情况下AJP协议不会发生非常频繁的通信协议错误问题, 当尝试从外网连接Tomcat的Ajp端口8009,telnet连接成功,说明端口被暴露给了外网 根据The AJP Connector中的介绍说明(address部分):如果没有指定IP地址,默认是绑定任意地址,这样就导致外网可以通过8009端口访问主机。出于安全考虑,需要增加这个address的设置(如下图),并且绑定到127.0.0.1。最终结果如下:
HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine (Http11InputBuffer.java:426) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java :687) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) at :66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790
#以下四种Connector实现都是直接处理来自客户端Http请求 org.apache.coyote.http11.Http11Protocol : 支持HTTP/1.1 协议的连接器。 org.apache.coyote.http11.Http11NioProtocol : 支持HTTP/1.1 协议+New IO的连接器。 org.apache.coyote.http11.Http11Nio2Protocol : 支持HTTP/1.1 协议+New IO2的连接器。 web server打交道 org.apache.coyote.ajp.AjpProtocol:使用AJP协议的连接器,实现与web server(如Apache httpd)之间的通信 org.apache.coyote.ajp.AjpNioProtocol :SJP协议+ New IO org.apache.coyote.ajp.AjpNio2Protocol:SJP协议+ New IO2 org.apache.coyote.ajp.AjpAprProtocol
07-Jan-2020 22:34:30.342 SEVERE [ajp-nio-8009-exec-2] org.apache.coyote.ajp.AjpMessage.processHeader message received with signature [32926] 07-Jan-2020 22:34:30.400 INFO [http-nio-80-exec-10] org.apache.coyote.http11 java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol at org.apache.coyote.http11 (Http11Processor.java:684) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java :66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806
org.apache.coyote.RequestInfo:setStage() #802 +---[0.005641ms] org.apache.coyote.http11.Http11Processor +---[0.002382ms] org.apache.coyote.Response:getStatus() #809 +---[0.002476ms] org.apache.coyote.http11 org.apache.coyote.RequestInfo:setStage() #845 +---[0.002112ms] org.apache.coyote.http11.Http11Processor ] org.apache.coyote.http11.Http11InputBuffer:nextRequest() #856 +---[0.010065ms] org.apache.coyote.http11 +---[0.001979ms] org.apache.coyote.RequestInfo:setStage() #875 +---[0.001981ms] org.apache.coyote.http11
org.apache.coyote.RequestInfo:setStage() #802 +---[0.005641ms] org.apache.coyote.http11.Http11Processor +---[0.002382ms] org.apache.coyote.Response:getStatus() #809 +---[0.002476ms] org.apache.coyote.http11 org.apache.coyote.RequestInfo:setStage() #845 +---[0.002112ms] org.apache.coyote.http11.Http11Processor ] org.apache.coyote.http11.Http11InputBuffer:nextRequest() #856 +---[0.010065ms] org.apache.coyote.http11 +---[0.001979ms] org.apache.coyote.RequestInfo:setStage() #875 +---[0.001981ms] org.apache.coyote.http11
org.apache.coyote.RequestInfo:setStage() #802 +---[0.005641ms] org.apache.coyote.http11.Http11Processor +---[0.002382ms] org.apache.coyote.Response:getStatus() #809 +---[0.002476ms] org.apache.coyote.http11 org.apache.coyote.RequestInfo:setStage() #845 +---[0.002112ms] org.apache.coyote.http11.Http11Processor ] org.apache.coyote.http11.Http11InputBuffer:nextRequest() #856 +---[0.010065ms] org.apache.coyote.http11 +---[0.001979ms] org.apache.coyote.RequestInfo:setStage() #875 +---[0.001981ms] org.apache.coyote.http11
header is too large java.lang.IllegalArgumentException: Request header is too large at org.apache.coyote.http11 .Http11InputBuffer.fill(Http11InputBuffer.java:701) at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine (Http11InputBuffer.java:455) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java :667) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.http11.AbstractHttp11Protocol 原因分析: 在tomcat的org.apache.coyote.http11.AbstractHttp11Protocol
org.apache.coyote.RequestInfo:setStage() #802 +---[0.005641ms] org.apache.coyote.http11.Http11Processor +---[0.002382ms] org.apache.coyote.Response:getStatus() #809 +---[0.002476ms] org.apache.coyote.http11 org.apache.coyote.RequestInfo:setStage() #845 +---[0.002112ms] org.apache.coyote.http11.Http11Processor ] org.apache.coyote.http11.Http11InputBuffer:nextRequest() #856 +---[0.010065ms] org.apache.coyote.http11 +---[0.001979ms] org.apache.coyote.RequestInfo:setStage() #875 +---[0.001981ms] org.apache.coyote.http11
org.apache.coyote.RequestInfo:setStage() #802 +---[0.005641ms] org.apache.coyote.http11.Http11Processor +---[0.002382ms] org.apache.coyote.Response:getStatus() #809 +---[0.002476ms] org.apache.coyote.http11 org.apache.coyote.RequestInfo:setStage() #845 +---[0.002112ms] org.apache.coyote.http11.Http11Processor ] org.apache.coyote.http11.Http11InputBuffer:nextRequest() #856 +---[0.010065ms] org.apache.coyote.http11 +---[0.001979ms] org.apache.coyote.RequestInfo:setStage() #875 +---[0.001981ms] org.apache.coyote.http11
header is too large java.lang.IllegalArgumentException: Request header is too large at org.apache.coyote.http11 .Http11InputBuffer.fill(Http11InputBuffer.java:701) at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine (Http11InputBuffer.java:455) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java :667) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.http11.AbstractHttp11Protocol 原因分析: 在tomcat的org.apache.coyote.http11.AbstractHttp11Protocol
Request在tomcat中是一个非常核心的的实例,下面以NIO为例来解读一下在各个时期下的状态(其实在Tomcat的几种模式中到了这里之后的处理都是差不多的) 1.1 创建coyote/Request 1.2 Coyote/Request的执行与结束 Coyote/Request的执行与结束主要是在Processor. process在这个过程中会获取RequestInfo这个句柄其是一个 } rp.setStage(org.apache.coyote.Constants.STAGE_ENDINPUT); if (!isAsync() && ! rp.setStage(org.apache.coyote.Constants.STAGE_KEEPALIVE); } rp.setStage(org.apache.coyote.Constants.STAGE_ENDED ,这是因为Coyote和Coonnector中相关实例是一一对应,只不过Coyote主要是负责和http打交道而Coonnector是和程序员打交道,但是请注意我们并不是直接使用的Coonnector中
org.apache.coyote.RequestInfo:setStage() #802 +---[0.005641ms] org.apache.coyote.http11.Http11Processor +---[0.002382ms] org.apache.coyote.Response:getStatus() #809 +---[0.002476ms] org.apache.coyote.http11 org.apache.coyote.RequestInfo:setStage() #845 +---[0.002112ms] org.apache.coyote.http11.Http11Processor ] org.apache.coyote.http11.Http11InputBuffer:nextRequest() #856 +---[0.010065ms] org.apache.coyote.http11 +---[0.001979ms] org.apache.coyote.RequestInfo:setStage() #875 +---[0.001981ms] org.apache.coyote.http11
Tomcat 8.5 以上版本支持 SNI ( 同IP可以安装多个证书 ), 至少 jre 7 以上版本 <Connector port="8443" protocol="org.apache.<em>coyote</em>.http11 // 其他站点复制多个 SSLHostConfig </Connector> 使用Apache证书安装SSL <Connector port="8443" protocol="org.apache.<em>coyote</em>.http11 type="RSA" /> </SSLHostConfig> </Connector> protocol 可选: org.apache.coyote.http11 .Http11NioProtocol - non blocking Java NIO connector org.apache.coyote.http11.Http11Nio2Protocol - non blocking Java NIO2 connector org.apache.coyote.http11.Http11AprProtocol - the APR/native connector.
request; protected final Response response; 两个属性都是final的,赋值玩一次就不能改了 这里的request和response都隶属于org.apache.coyote 在org.apache.coyote.Request 类中有一个方法返回org.apache.catalina.connector.Request 类 也就是只要获取到了Http11Processor ; import org.apache.coyote.Request; import org.apache.coyote.RequestInfo; import org.apache.tomcat.util.net.AbstractEndpoint req = (org.apache.coyote.Request) getField(next, "req"); Object serverPort = getField requestInfo : processors1) { org.apache.coyote.Request request1 = (org.apache.coyote.Request
1、Coyote 简介 Coyote 是Tomcat 中连接器的组件名称 , 是对外的接口。 客户端通过Coyote与服务器建立连接、发送请 求并接受响应 。 Coyote 封装了底层的网络通信(Socket请求及响应处理); Coyote 使Catalina 容器(容器组件)与具体的请求协议及IO操作方式完全解耦; Coyote 将Socket 输入转换封装为 Request 对象,进一步封装后交由Catalina 容器进行处理,处理请求完成后, Catalina 通过Coyote 提供的Response 对象将结果写入输出流; Coyote 负责的是具体协议 2、Coyote 的内部组件及流程 Coyote 组件及作用: 组件 作用描述 EndPoint EndPoint 是 Coyote 通信端点,即通信监听的接口,是具体Socket接收和发 送处理器,是对传输层的抽象
$NioSocketWrapper.read(NioEndpoint.java:1184) ~[tomcat-embed-core-10.1.16.jar:10.1.16]at org.apache.coyote.http11 Http11InputBuffer.fill(Http11InputBuffer.java:785) ~[tomcat-embed-core-10.1.16.jar:10.1.16]at org.apache.coyote.http11 (AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.16.jar:10.1.16]at org.apache.coyote.AbstractProtocol $NioSocketWrapper.read(NioEndpoint.java:1184) ~[tomcat-embed-core-10.1.16.jar:10.1.16]at org.apache.coyote.http11 (AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.16.jar:10.1.16]at org.apache.coyote.AbstractProtocol
ErrorReportValve.java:103) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11 .Http11Processor.process(Http11Processor.java:861) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process ErrorReportValve.java:103) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11 .Http11Processor.process(Http11Processor.java:861) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process
.Http11Processor.service(Http11Processor.java:408) org.apache.coyote.AbstractProcessorLight.process .Http11Processor.service(Http11Processor.java:408) org.apache.coyote.AbstractProcessorLight.process (Http11InputBuffer.java:352) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java :294) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol :294) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol
正文 如何获取的回显 师傅通过这种方式关注到了org.apache.coyote.AbstractProcessor类中,存在有两个属性值名为request / response分别是使用final修饰的 org.apache.coyote.Request / org.apache.coyote.Response类型的变量。 对于Servlet内存马,我们需要获取到对应ServletContext,但是在org.apache.coyote.Request类中,并没有直接可以获取的方法存在,我们可以关注到该类的setNote方法的实现 req = (org.apache.coyote.Request) getField(requestInfo, Class.forName("org.apache.coyote.RequestInfo req = (org.apache.coyote.Request) getField(requestInfo, Class.forName("org.apache.coyote.RequestInfo