环境
IntelliJ IDEA 2020.1 x64
tomcat-8.5.46
JRE1.8
配置
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.apache.tomcat</groupId> <artifactId>Tomcat8.5.46</artifactId> <name>Tomcat8.5.46</name> <version>8.5</version> <build> <finalName>Tomcat8.0</finalName> <sourceDirectory>java</sourceDirectory> <!-- <testSourceDirectory>test</testSourceDirectory> --> <resources> <resource> <directory>java</directory> </resource> </resources> <!-- <testResources> --> <!-- <testResource> --> <!-- <directory>test</directory> --> <!-- </testResource> --> <!-- </testResources> --> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.5</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>ant</groupId> <artifactId>ant</artifactId> <version>1.7.0</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>javax.xml</groupId> <artifactId>jaxrpc</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>org.eclipse.jdt.core.compiler</groupId> <artifactId>ecj</artifactId> <version>4.6.1</version> </dependency> </dependencies> </project>
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>gxf</groupId> <artifactId>apache-tomcat-8</artifactId> <name>apache-tomcat-8-source</name> <version>1.0</version> <packaging>pom</packaging> <modules> <module>apache-tomcat-8.5.46-src</module> </modules> </project>
pom.xml -> Maven -> Reimport
Main class
org.apache.catalina.startup.Bootstrap
VM options
-Dcatalina.home=catalina-home -Dcatalina.base=catalina-home -Djava.endorsed.dirs=catalina-home/endorsed -Djava.io.tmpdir=catalina-home/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=catalina-home/conf/logging.properties
将JSP解析器初始化:
context.addServletContainerInitializer(new JasperInitializer(),null);
IDEA 快捷键 功能描述
F8 单步调试,不进入函数内部 F7 单步调试,进入函数内部 Shift+F7 选择要进入的函数 Shift+F8 跳出函数 Alt+F9 运行到断点 Alt+F8 执行表达式查看结果 F9 继续执行,进入下一个断点或执行完程序 Ctrl+F8 设置/取消当前行断点 Ctrl+Shift+F8 查看断点
Tomcat中Servlet的配置是在conf/web.xml
。Tomcat默认配置定义了两个servlet,分别为DefaultServlet
和JspServlet
:
当请求.*.jsp *.jspx 会以JspServlet 执行 (文件包含漏洞利用)
当请求 xxxx 会以 DefaultServlet 执行 (文件读取漏洞利用)
POC:
通过 prepareRequest 解析请求
经过3次循环,依次将 javax.servlet.include.request_uri javax.servlet.include.path_info javax.servlet.include.servlet_path 放入request对象
执行
不能读取除了webapps 目录下文件的原因
如果含有./ ../ 就会返回为null
POC中还有个关键参数req_uri
,这个参数的设置决定了我们可以读取webapps下其他目录的文件。设置其值为一个随意字符串'asdf',一来是无法匹配到webapps下的路径,走tomcat默认的ROOT目录;
二来是为了让tomcat将请求流到DefaultServlet
,从而触发漏洞。当请求读取WEB-INF/web.xml
文件,则读取的就是webapps/ROOT/WEB-INF/
目录下的web.xml。
修改POC req_uri 请求,为 /manager/0xdd javax.servlet.include.path_info 为要读取的文件名
文件包含漏洞 req_uri 请求为 xxx.jsp 即可,就可以走Jspservlet
<% String []cmdArray = new String[]{ "/bin/sh", "-c", "echo `whoami`" + " > ./webapps/ROOT/ok.txt"}; Runtime.getRuntime().exec(cmdArray); %>