从xxe到rce-记一道ctf中的java题

前言:

今天下午朋友在打比赛好像是什么数据安全的,闲着没事就要了道java题的源码,感觉挺有意思的。好像比赛结束了,就把wp写出来了

思路

给了个jar包,反编译看代码:
从xxe到rce-记一道ctf中的java题_第1张图片

先看object那个路由,就是拼接下我们传进去的文件名,然后读取文件,获取文件的内容,然后进行xml解析。这里用的是 SCXMLReader , 它这里有个rce,poc如下:

从xxe到rce-记一道ctf中的java题_第2张图片
从xxe到rce-记一道ctf中的java题_第3张图片

可以看到上面的poc是用的 ,但是在check方法中被ban掉了:

从xxe到rce-记一道ctf中的java题_第4张图片

去看文档,其实可以发现挺多的替代标签:

从xxe到rce-记一道ctf中的java题_第5张图片
构造一个没有srcipt标签的poc:


<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" initial="wa1ki0g">
    <state id="wa1ki0g">
        <onentry>
            <assign location="rce" expr="''.getClass().forName('java.lang.Runtime').getMethod('exec',''.getClass()).invoke(''.getClass().forName('java.lang.Runtime').getMethod('getRuntime').invoke(null),'open -a calculator')" />
        onentry>
    state>
scxml>

本地打一下,可以rce的是:

从xxe到rce-记一道ctf中的java题_第6张图片

现在poc有了,该如何将我们的poc写到目标环境里,因为代码里的file协议只能读自己本地的文件。

我们看xxe那个路由,传进去一个url,他会读取url页面的内容,然后当作xml进行解析,也没有过滤,妥妥的xml注入。但是这里读不到根目录的flag,并且根目录有个 /readflag 文件,估计作者的本意就是让rce吧。

java的xxe,可以利用jar协议写缓存文件到目标环境上,但是文件很快就会删除。这里可以用下别的师傅写的延长临时文件存在的一个脚本:

https://github.com/pwntester/BlockingServer

我们传到目标环境后,由于目标的缓存文件命名是无规范的,所以这里要用 xxe+ftp 去列目录,这个我要是没记错的话在小与等于java8的某个小版本下是可行的,在后续的版本是利用不了了,这有点忘了,感兴趣的师傅可以下去查下。

1. 开个http:

在这里插入图片描述

/tmp目录下的upload.txt文件:

从xxe到rce-记一道ctf中的java题_第7张图片

2.构造一个poc.zip,然后利用BlockingServer进行上传:

从xxe到rce-记一道ctf中的java题_第8张图片

从xxe到rce-记一道ctf中的java题_第9张图片

3.利用xxe+ftp 列目录找文件,这里可以利用xxer.py:

从xxe到rce-记一道ctf中的java题_第10张图片
从xxe到rce-记一道ctf中的java题_第11张图片

从xxe到rce-记一道ctf中的java题_第12张图片
4.成功找到文件

从xxe到rce-记一道ctf中的java题_第13张图片

5.我们可以本地读一下这个缓存文件:

从xxe到rce-记一道ctf中的java题_第14张图片
6. 最后利用objetc路由成功执行了我们的poc:

从xxe到rce-记一道ctf中的java题_第15张图片

你可能感兴趣的:(java)