Tomcat AJP文件包含漏洞解析

漏洞背景

  • 安全公告编号:CNTA-2020-0004
  • 漏洞内容:攻击者可利用该高危漏洞读取或包含Tomcat上所有 webapp目录下的任意文件,如:webapp配置文件或源代码等。
  • 受影响的版本包括:Tomcat 6,Tomcat 7的7.0.100以下版本,Tomcat 8的8.5.51以下版本,Tomcat 9的9.0.31以下版本。
  • 漏洞综合评级:高危。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

详细内容:https://mp.weixin.qq.com/s/hvRD-0MqXHW8yJupbQt1ng

漏洞分析

AJP Connector

Apache Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector表示接收请求并返回响应的端点。即Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。在Apache Tomcat服务器中我们平时用的最多的8080端口,就是所谓的Http Connector,使用Http(HTTP/1.1)协议,在 conf/server.xml 文件里,它对应的配置为:

而 AJP Connector,它使用的是 AJP 协议(Apache Jserv Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本,它能降低 HTTP 请求的处理成本,因此主要在需要集群、反向代理的场景被使用。

Ajp协议对应的配置为:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

Tomcat服务器默认对外网开启该端口,Web客户访问Tomcat服务器的两种方式:

代码分析

漏洞产生的主要位置是在处理Ajp请求内容的地方org.apache.coyote.ajp.AbstractAjpProcessor.java#prepareRequest();

这里首先判断SC_A_REQ_ATTRIBUTE,意思是如果使用的Ajp属性并不在上述的列表中,那么就进入这个条件;如果此时Ajp13没有配置转发远程端口,那么就可以接受转发的数据作为远程端口。

于是这里我们可以进行对Ajp设置特定的属性,封装为request对象的Attribute属性,比如以下三个属性可以被设置:

  1. javax.servlet.include.request_uri
  2. javax.servlet.include.path_info
  3. javax.servlet.include.servlet_path

设置后可以形成两个漏洞:任务文件读取和远程代码执行。

 任意文件读取

当请求被分发到org.apache.catalina.servlets.DefaultServlet#serveResource()方法;

调用getRelativePath方法,需要获取到request_uri不为null,然后从request对象中获取并设置pathInfo属性值和servletPath属性值。

命令执行

当在处理jsp请求的uri时,会调用org.apache.jasper.servlet.JspServlet#service();

最后会将pathinfo交给serviceJspFile处理,以jsp解析该文件,所以当我们可以控制服务器上jsp文件的时候,比如上传jsp文件,这时就能够造成rce(远程命令/代码执行漏洞)。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值