java xxe漏洞利用_关于Java 中 XXE 的利用限制探究

本文深入探讨了在Java中遇到无回显的XXE漏洞时如何构造通道传递数据。由于XML解析器的限制,直接使用HTTP协议无法读取含有换行的文件,而FTP协议在某些JDK版本中因URL换行检查导致问题。文章提到了使用CDATA段在有回显场景下读取特殊字符文件的方法,但指出对于有换行的特殊字符文件目前尚无理想解决方案。
摘要由CSDN通过智能技术生成

一般而言,在Java里碰到XXE,如果是有回显的,那自然很好办,如果是没有回显,那就需要我们构造通道来把数据带出,过去在XXE利用中,如果单纯使用HTTP协议(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符),是无法读取具有换行的文件的。比如常用作验证的win.ini文件就有换行

72d321a7f315c0b334b8e92414b44c09.png

如果想把该文件传送出去,将会报错 Illegal character in URL

0b12af02500e011bf2f4a0254ae4fea9.png

在rt.jar!\sun\net\www\http\HttpClient.class中的420行,存在对换行的判断

a68bace925030a2cba856d195c705762.png

这个时候如果是PHP环境,那很好办,给数据编码一下就可以顺利带出,比如base64

%dtd;

%send;

]>

这样,即使文件存在Illegal character也可以带出,但是Java又没有相关编码的协议啊,这时候我们往往会利用FTP协议来向外传递数据,这些数据本身可能包含\r、\n等字符

67571953b16719c44bbee2e4a199d8fb.png

看起来似乎很美好,问题得到了解决,但是,我们往往会碰到一些意外情况,如果文件中有下面这些字符呢

dfb50e3f8ff13ec7afabfcc641540205.png

那将会得到以下报错,实体XXX的声明必须以>结尾

62dcf1f3283ba652572581b319ecefff.png

dtd文件如下:

9de2b0a074d153867975d12f51caa391.png

这是因为xml在解析的时候,会把实体进行替换,带有单引号的文件内容在拼接进字符串之后,单引号与send实体的单引号进行了闭合,然后后面的数据就变成了无效数据

86af83085744185ef965b72fd4b4cdbd.png

如果文件中单引号后面是除了右尖括号>以外的字符,那么就会报实体XXX的声明必须以>结尾的错误

如果单引号后恰巧是右尖括号,那也不行,你后面还是有垃圾数据,顶多报错换一下

5ef89b99065b8c2947dbe9388796b58d.png

那这个时候还有什么办法读取这类的特殊文件呢?

xml在设计的时候就考虑到了这种情况,虽然一般情况下xml要求要使用这些符号最好是把相应字符用对应实体引用来代替,但是如果是不得不用的情况下,可以使用CDATA方法来读取。

CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data),CDATA 部分中的所有内容都会被解析器忽略。CDATA 部分由结束

让我们对payload进行一下修改:

dtd

">

">

payload

b6761b9bf991af906cc26d0bde51f97f.png

但是其实这种方法是没办法的,因为它还是需要拼接到url里去,依旧会和外部的单引号闭合,如

6011e828157b47c4f80b947c8ce8a52e.png

但是,CDATA方法可以用于xxe有回显的情况,也算是一种不错的方法了。

正常读取无法读取

f2a6b384b6d87466ce4f6a186175cf40.png

使用CDATA方法读取,但是请注意,这种情况还是不够完美,至少对于单独的 & 符号还是没办法

22e5900af91c43357124396f74001dfb.png

除非构成了完整的实体引用格式

4389c36cd337865b7d185257d50b8870.png

另外JDK的版本更迭对使用FTP作为信息传送通道这一个技巧有影响,这也是为什么高版本无法用FTP来读取多行文件,因为FtpURLConnection.class中的static方法checkURL里的var0.toExternalForm().indexOf(10) > -1,此处解析URL并检查URL中是否存在换行符(ascii为10),如果存在则抛出异常

具体checkURL在哪一个版本开始检查换行,笔者没有一个一个去看,有兴趣的读者可以找找看

rt.jar!\sun\net\www\protocol\ftp\FtpURLConnection.class

static URL checkURL(URL var0) throws IllegalArgumentException {

if (var0 != null && var0.toExternalForm().indexOf(10) > -1) {

MalformedURLException var3 = new MalformedURLException("Illegal character in URL");

throw new IllegalArgumentException(var3.getMessage(), var3);

} else {

String var1 = IPAddressUtil.checkAuthority(var0);

if (var1 != null) {

MalformedURLException var2 = new MalformedURLException(var1);

throw new IllegalArgumentException(var2.getMessage(), var2);

} else {

return var0;

}

}

}

总结

总的来说,如果是php环境,那自然是万事大吉,但是在java环境中,如果

有回显(不需要通过URL外带):

1. 普通文件 -> 直接读取回显

2. 带换行文件 -> 直接读取回显

含特殊字符文件 -> CDATA回显3. 含特殊字符且有换行文件 -> CDATA 回显无回显:

1. 普通文件 -> HTTP或者FTP都可以带出

带换行文件 -> FTP带出 3. 含特殊字符文件 -> 。。暂时没好的办法 4. 含特殊字符且有换行的文件 -> 。。暂时没好的办法另外,需要注意JDK版本的影响

合天网安实验室相关实验推荐--XXE漏洞分析与实践

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值