知识点
- WEB-INF/web.xml泄露
WEB-INF/web.xml泄露
1. WEB-INF目录
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:数据库配置文件
2. 漏洞检测以及利用方法
通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。
3. 漏洞成因
通常一些web应用我们会使用多个web服务器搭配使用,解决其中的一个web服务器的性能缺陷以及做均衡负载的优点和完成一些分层结构的安全策略等。在使用这种架构的时候,由于对静态资源的目录或文件的映射配置不当,可能会引发一些的安全问题,导致web.xml
等文件能够被读取。漏洞检测以及利用方法:通过找到web.xml
文件,推断class
文件的路径,最后直接class
文件,在通过反编译class
文件,得到网站源码。一般情况,jsp引擎默认都是禁止访问WEB-INF
目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,问题原因其实很简单,Nginx不会去考虑配置其他类型引擎(Nginx不是jsp引擎)导致的安全问题而引入到自身的安全规范中来(这样耦合性太高了),修改Nginx配置文件禁止访问WEB-INF
目录就好了: location ~ ^/WEB-INF/* { deny all; }
或者 return 404;
或者其他!
启动靶机
1. 访问题目
看到登录按钮下面有一个help的链接,打开一看,发现输出一串
java.io.FileNotFoundException:{help.docx}
2. 修改请求方式为POST
修改为POST,成功下载下来help.docx文件,但是文件中并没有什么内容:
但是通过这个链接可以看出,我们可以通过这个链接修改为post请求来下载后台文件
3. 下载 WEB-INF/web.xml 文件
我们下载一下WEB-INF/web.xml
这个文件。这个文件是Java的WEB应用的安全目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
附:CTF中常见的源码泄露的情况:ctf/web源码泄露及利用办法
4. 得到java web配置信息
我们可以通过web.xml获取到java web的配置信息。
<?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>
5. 下载FlagController.class文件
我们可以在web.xml文件中看到com.wm.FlagController,我们下载FlagController.class文件
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
6. base64解密得到flag
得到文件,base64解密得到flag
flag{abaed481-e097-40a1-98dd-f9ae0a258abe}