参考资料:
web代码安全:WEB-INF/web.xml泄露 - 知乎 (zhihu.com)
(1条消息) (详解)[RoarCTF 2019]Easy Java_FPointzero的博客-CSDN博客
[RoarCTF 2019]Easy Java_浑水摸鱼的咸鱼的博客-CSDN博客
考点:
WEB-INF/web.xml泄露
WEB-INF是JAVA的WEB应用安全目录
危害
读取WEB-INF目录中的内容,从而造成源码泄露。
漏洞成因及利用
WEB-INF是JAVA的WEB应用安全目录,如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
/WEB-INF/web.xml #WEB应用程序配置文件,描述了servlet和其它应用组件配置及命名规则。
/WEB-INF/classes/ #含站点所有的class文件
/WEB-INF/lib/ #存放WEB应用需要的各种JAR文件
/WEB-INF/src/ #源码目录
/WEB-INF/database.properties #数据库配置文件
一般情况,isp引擎默认都是禁止访问WEB-INF目录的,在一些特定的场合(Nginx配合Tomcat做均衡负载或集群等情况时,Nginx不会去考虑配置其他类型引擎导致的安全问题而引入到自身的安全规范中来),从而造成源码泄露。
题目复现
打开是一个登录框
发现有一个help,点进去看看
这个错误提示表明Java在打开文件"{help.docx}"时发现文件不存在。此错误通常与文件路径有关。可能是提供的路径不正确,或者文件实际上不存在。
尝试直接用get方式构造payload无法下载文件
可以通过bp工具进行修改POST传参获取web-inf/web.xml配置文件,观察映射及各容器状况
直接传入,filename=/WEB-INF/web.xml
可以看到flag文件
<servlet>
<servlet-name>FlagController</servlet-name>
<servlet-class>com.wm.ctf.FlagController</servlet-class>
</servlet>
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容
其实说明了这个就是JAVA源代码进行编译后所产生的后缀带有.class的东西。于是我们可以下载这个.class文件再利用反编译手段来获得flag
得到最终payload:
filename=/WEB-INF/classes/com/wm/ctf/FlagController.class
里面看到有一串base64,解码即可
防御思路
修改Nginx配置文件禁止访问WEB-INF目录
location ~ ^/WEB-INF/* { deny all; }或者return 404