“我正在参加「掘金·启航计划」”
- 漏洞库中查询漏洞avd.aliyun.com/detail?id=A… ,查看漏洞原因:Apache Tomcat AJP协议的实现上有漏洞,默认开启AJP,所以会导致此漏洞 涉及版本
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
1.1 漏洞传参
javax.servlet.include.request_uri设置为根路径/、javax.servlet.include.path_info设置为请求的文件、javax.servlet.include.servlet_path
2. 解决方案
2.1 升级版本
2.1.1 首先查看目前Tomcat的版本号,命令行进入bin目录输入version,得到版本号为8.0.43
2.2 关闭AJP
找到AJP所在行,找到文件conf\server.xml,其中AJP行
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
附录
a. Tomcat重要组件,从server.xml
- Service
- Connector
- http协议
访问tomcat
- ajp协议
http协议访问apache,再由apache通过ajp协议访问tomcat
apache是多进程的,一个请求一个进程,处理静态文件比较有优势,比tomcat快。如果是静态文件由apache处理,如果是servlet由tomcat处理、
tomcat处理servlet比较有优势
- Engine
b. 源码调用【8.5.x】主要关注AjpProcessor和DefaultServlet
- 调用Processor处理
org/apache/coyote/AbstractProtocol.java:8852. Ajp开始处理请求org.apache.coyote.ajp.AjpProcessor#prepareRequest3. AjpProcessor中org/apache/coyote/ajp/AjpProcessor.java:834如果正常请求,在Constants中 ```
// Integer codes for common (optional) request attribute names
public static final byte SC_A_CONTEXT = 1; // XXX Unused
public static final byte SC_A_SERVLET_PATH = 2; // XXX Unused
public static final byte SC_A_REMOTE_USER = 3;
public static final byte SC_A_AUTH_TYPE = 4;
public static final byte SC_A_QUERY_STRING = 5;
public static final byte SC_A_JVM_ROUTE = 6;
public static final byte SC_A_SSL_CERT = 7;
public static final byte SC_A_SSL_CIPHER = 8;
public static final byte SC_A_SSL_SESSION = 9;
public static final byte SC_A_SSL_KEY_SIZE = 11;
public static final byte SC_A_SECRET = 12;
public static final byte SC_A_STORED_METHOD = 13;
但如果非正常请求则
// Used for attributes which are not in the list above
public static final byte SC_A_REQ_ATTRIBUTE = 10;
4.根据请求参数值javax.servlet.include.request_uri根目录,这里得出值/
org.apache.tomcat.util.buf.MessageBytes#toString
判断是否是ajp正常请求
/**
* AJP private request attributes
*/
public static final String SC_A_REQ_LOCAL_ADDR = "AJP_LOCAL_ADDR";
public static final String SC_A_REQ_REMOTE_PORT = "AJP_REMOTE_PORT";
public static final String SC_A_SSL_PROTOCOL = "AJP_SSL_PROTOCOL";
- 三个自定义request都会进行设置
org/apache/coyote/ajp/AjpProcessor.java:873 - DefaultServlet中serveResource方法
org.apache.catalina.servlets.DefaultServlet#serveResource
查看INCLUDE_REQUEST_URI值,javax.servlet.RequestDispatcher#INCLUDE_REQUEST_URI中就是产生漏洞时设置的值\
String requestUri = (String) request.getAttribute(
RequestDispatcher.INCLUDE_REQUEST_URI);
static final String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri";