Java 审计之XXE篇

Java审计之XXE篇0x00前言在以前XXE漏洞了解得并不多,只是有一个初步的认识和靶机里面遇到过。下面来深入了解一下该漏洞的产生和利用。0x01XXE漏洞当程序在解析XML输入时,

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java 审计之XXE篇

0x00 前言

在以前XXE漏洞了解得并不多,只是有一个初步的认识和靶机里面遇到过。下面来 深入了解一下该漏洞的产生和利用。

0x01 XXE漏洞

当程序在解析XML输入时,允许引用外部实体,导致能够引用一个外部恶意文件,可导致执行系统命令,内网端口检测,文件读取,攻击内网服务,dos攻击等。

在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。 外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。 但是,在处理外部实体时,可以针对应用程序启动许多攻击。 这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。 通过将这些攻击与其他实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。

具体利用方式参考: 一篇文章带你深入理解漏洞之 XXE 漏洞

0x02 Java中XXE的产生

其实说白了,也还是在web应用中接受并且解析xml的时候允许引用外部的实体。web应用中需要解析的xml,需要是可控的。

那么先来看看漏洞产生的代码,前面本来想着是自己去写一个XXE的漏洞代码,但是发现写的时候报各种错,参考其他文章的代码,调试半天还是报错。所以这里就借用JoyChou师傅开源的Java Sec Code项目上来做一个演示。

项目地址:https://github.com/JoyChou93/java-sec-code/

DocumentBuilder

DocumentBuilder类是JDK自带的类,在该类解析产生的XXE漏洞是有回显的。

public String DocumentBuilderVuln01(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            StringReader sr = new StringReader(body);
            InputSource is = new InputSource(sr);
            Document document = db.parse(is);  // parse xml

            // 遍历xml节点name和value
            StringBuilder buf = new StringBuilder();
            NodeList rootNodeList = document.getChildNodes();
            for (int i = 0; i < rootNodeList.getLength(); i++) {
                Node rootNode = rootNodeList.item(i);
                NodeList child = rootNode.getChildNodes();
                for (int j = 0; j < child.getLength(); j++) {
                    Node node = child.item(j);
                    buf.append(String.format("%s: %s\n", node.getNodeName(), node.getTextContent()));
                }
            }
            sr.close();
            return buf.toString();
        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;
        }

saxReader

saxReader是第三方的库,该类是无回显的

public String SAXReaderVuln(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);

            SAXReader reader = new SAXReader();
            // org.dom4j.Document document
            reader.read(new InputSource(new StringReader(body))); // cause xxe

        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;
        }

SAXBuilder

第三方库

  public String SAXBuilderVuln(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);

            SAXBuilder builder = new SAXBuilder();
            // org.jdom2.Document document
            builder.build(new InputSource(new StringReader(body)));  // cause xxe
            return "SAXBuilder xxe vuln code";
        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;

SAXParserFactory

该类也是JDK内置的类,但他不可回显内容,可借助dnslog平台

public String SAXParserVuln(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);

            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser parser = spf.newSAXParser();
            parser.parse(new InputSource(new StringReader(body)), new DefaultHandler());  // parse xml

            return "SAXParser xxe vuln code";
        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;
        }
    }

XMLReaderFactory

 public String xmlReaderVuln(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);
            XMLReader xmlReader = XMLReaderFactory.createXMLReader();
            xmlReader.parse(new InputSource(new StringReader(body)));  // parse xml
            return "xmlReader xxe vuln code";
        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;
        }

Digester

 public String DigesterVuln(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);

            Digester digester = new Digester();
            digester.parse(new StringReader(body));  // parse xml
        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;
        }
        return "Digester xxe vuln code";

XMLReader

public String XMLReaderVuln(HttpServletRequest request) {
        try {
            String body = WebUtils.getRequestBody(request);
            logger.info(body);

            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser saxParser = spf.newSAXParser();
            XMLReader xmlReader = saxParser.getXMLReader();
            xmlReader.parse(new InputSource(new StringReader(body)));

        } catch (Exception e) {
            logger.error(e.toString());
            return EXCEPT;
        }

        return "XMLReader xxe vuln code";
    }

修复方法

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);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

0x03 结尾

本文作为一个记录文,在Java中能解析XXE的类会比较多。因为在Java中配置文件会频繁的使用到XML文件或是数据传输。导致XXE漏洞可能会比其他语言的出现频率高(瞎说的)。在审计的时候可以这么查看有没有使用到那几个set方法被修复掉,如果没有那么就可以存在XXE。当然也要查看使用的是哪个类进行解析,有没有回显的情况。有回显的话,能不能出网,能出网的话就可以借助dnslog平台进行回显。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119913.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL的binlog日志详解

    binlog就是binarylog,二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。对于开发者可能对binlog并不怎么关注,但是对于运维或者架构人员来讲是非常重要的。MySQL5.7这个版本默认是不开启binlog日志的,具体的开启方式可以查看https://blog.csdn.net/king_kgh…

    2022年4月5日
  • Linux系统下载(超全镜像下载)

    Linux系统下载(超全镜像下载)1、Linux官方镜像Deepin镜像https://www.deepin.org/mirrors/releases/Mint镜像https://www.linuxmint.com/mirrors.phpkernel镜像站:http://mirrors.kernel.org/Fedora官方镜像站:http://mirrors.fedoraproject.org/public…

    2022年6月28日
  • java帝国时代_我的第一个java程序

    java帝国时代_我的第一个java程序1C语言帝国的统治现在是公元1995年,C语言帝国已经统治了我们20多年,实在是太久了。1972年,随着C语言的诞生和Unix的问世,帝国迅速建立统治,从北美到欧洲,从欧洲到亚洲,无数程序员臣服在他的脚下。帝国给我们提供了极好的福利:贴近硬件,运行极快,效率极高。使用这些福利,程序员们用C开发了很多系统级软件,操作系统,编译器,数据库,网络

    2022年9月24日
  • php本地环境搭建教程,用 phpstudy 搭建本地 php 环境及安装 wordpress 教程「建议收藏」

    php本地环境搭建教程,用 phpstudy 搭建本地 php 环境及安装 wordpress 教程「建议收藏」很多时候我们仅仅为了测试一个项目或者临时搭建网站,用不着去vps服务器上添加,在本地搭建php环境就够了。这样就需要一个能够在windows系统中搭建本地php环境的软件包,这类软件包蛮多的,目前用的比较多的比如phpstudy,今天魏艾斯博客来介绍用phpstudy搭建本地php环境及本地安装wordpress教程。一、phpstudy下载安装。老魏建议从官方网站下…

    2022年6月16日
  • Matlab GUI上位机界面实现串口通信

    Matlab GUI上位机界面实现串口通信MatlabGUI因项目需求,不得不学的又杂又浅,趁着还没彻底忘记,写下来一些关键注意点。命令行窗口输入guide→BlankGUI→确定根据自己的需求,拖动选择对应的工具,如下图所示双击每一个对象,就可以弹出其检查器,修改其属性,字体大小、粗细、位置等,其中最关键的是两个,一是String,二是Tag,String是用来修改对象中的文字,Tag是所调用的代码名,这个要好的…

    2022年5月15日
  • Http中GET和POST请求的区别

    Http中GET和POST请求的区别

    2021年10月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号