前言:

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

思路

给了个jar包,反编译看代码:

ctr模式 java实现aes java ctf_ctr模式 java实现aes

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

ctr模式 java实现aes java ctf_缓存文件_02


ctr模式 java实现aes java ctf_缓存文件_03

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

ctr模式 java实现aes java ctf_ctr模式 java实现aes_04

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

ctr模式 java实现aes java ctf_java_05


构造一个没有srcipt标签的poc:

<?xml version="1.0"?>
<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的是:

ctr模式 java实现aes java ctf_缓存文件_06

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

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

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

https://github.com/pwntester/BlockingServer

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

1. 开个http:

ctr模式 java实现aes java ctf_ctr模式 java实现aes_07

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

ctr模式 java实现aes java ctf_java_08

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

ctr模式 java实现aes java ctf_缓存文件_09

ctr模式 java实现aes java ctf_java_10

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

ctr模式 java实现aes java ctf_缓存文件_11


ctr模式 java实现aes java ctf_xml_12

ctr模式 java实现aes java ctf_缓存文件_13


4.成功找到文件

ctr模式 java实现aes java ctf_缓存文件_14

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

ctr模式 java实现aes java ctf_xml_15


6. 最后利用objetc路由成功执行了我们的poc:

ctr模式 java实现aes java ctf_xml_16