[RoarCTF 2019]Easy Java
前置知识
WEB-INF/web.xml泄露
WEB-INF 是 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
:数据库配置文件。
漏洞成因:
通常一些 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;
或者其他。
Java web 工程目录结构
servlet 访问 URL 映射配置
由于客户端是通过 URL 地址访问 web 服务器中的资源,所以 servlet程序若想被外界访问,必须把 servlet程序映射到一个 URL 地址上,这个工作在 web.xml 文件中使用
<servlet>
元素和<servlet-mapping>
元素完成。<servlet>
元素用于注册servlet,它包含有两个主要的子元素:<servlet-name>
和<servlet-class>
,分别用于设置 servlet 的注册名称和 servlet 的完整类名。一个<servlet-mapping>
元素用于映射一个已经注册的 servlet 的一个对外访问路径,它包含有两个子元素:<servlet-name>
和<url-pattern>
,分别用于指定 servlet 的注册名称和 servlet 的对外访问路径。例如:
<servlet>
<servlet-name>ServletDemo1</servlet-name>
<servlet-class>cn.itcast.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo1</servlet-name>
<url-pattern>/ServletDemo1</url-pattern>
</servlet-mapping>
解题
打开网页,是一个登录页面。正常尝试登录后返回,因为下方有一个help链接,打开看看,在 URL 上发现包含:
/Download?filename=help.docx
但是并没有得到文件,尝试 post 提交,得到文件,然后并没有什么,被耍了。
源码泄露
通过 post 访问 web.xml:
发现有 flag 的提示,去访问:
/WEB-INF/classes/com/wm/ctf/FlagController.class
由上知识得,通过 URL 访问 servlet 的方式是:
找到对应文件名,然后通过这个文件名找到对应的 servlet,再通过这个 servlet 的文件名,获取到其具体的 servlet 文件。因为这个是类中的文件,所以后缀要加.class
。
发现有一段 base64 编码的字符串,解码的flag。