Java代码审计安全篇-XXE(XML外部实体注入)漏洞

news2024/12/29 9:24:01

前言:

 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油

注意:

本文章参考qax的网络安全java代码审计,记录自己的学习过程,还希望各位博主 师傅 大佬 勿喷,还希望大家指出错误

XXE 漏洞:

原理:当应用程序解析XML输入时,再没有禁用外部实体的加载而导致加载 了外部文件及代码时,就会造成XXE漏洞

利用方式:攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件),导致可加载恶意外部文件,利用file协议造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

危害:任意文件读取,内网探测,攻击内网站点(结合SSRF),命令执行 ,dos攻击

XML (参考webgoat)

什么是 XML 实体?

XML 实体允许定义标记,在分析 XML 文档时,这些标记将被内容替换。通常有三种类型的实体:

  • 内部实体

  • 外部实体

  • 参数实体。

必须在文档类型定义 (DTD) 中创建一个实体,让我们从一个示例开始:

  正如你所看到的,一旦XML文档被解析器处理,它就会用定义的常量“Jo Smith”替换定义的实体。正如你所看到的,这有很多优点,因为你可以在一个地方更改为例如“约翰史密斯”。js js

在 Java 应用程序中,XML 可用于将数据从客户端获取到服务器,我们都熟悉 JSON API,我们也可以使用 xml 来获取信息。大多数情况下,框架会根据 xml 结构自动填充 Java 对象,例如:

例子:

让我们看一个 XXE 注入的例子,在上一节中我们看到 XML 实体可以按如下方式使用:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#efefef"><code><span style="color:#557799"><?xml version="1.0" standalone="yes" ?></span>
<span style="color:#3344bb"><!DOCTYPE author [
  <!ELEMENT author (#PCDATA)></span>
  <span style="color:#3344bb"><!ENTITY js "Jo Smith"></span>
<span style="color:#3344bb">]></span>
<span style="color:#007700"><author></span><span style="color:#880000"><strong>&js;</strong></span><span style="color:#007700"></author></span></code></span></span></span></span>
外部 DTD 声明

定义这些实体还可以在外部文件中定义另一个 DTD,例如:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#efefef"><code><span style="color:#557799"><?xml version="1.0"?></span>
<span style="color:#3344bb"><!DOCTYPE note SYSTEM "email.dtd"></span>
<span style="color:#007700"><email></span>
  <span style="color:#007700"><to></span>webgoat@webgoat.org<span style="color:#007700"></to></span>
  <span style="color:#007700"><from></span>webwolf@webwolf.org<span style="color:#007700"></from></span>
  <span style="color:#007700"><subject></span>Your app is great, but contains flaws<span style="color:#007700"></subject></span>
  <span style="color:#007700"><body></span>Hi, your application contains some SQL injections<span style="color:#007700"></body></span>
<span style="color:#007700"></email></span></code></span></span></span></span>

可以定义如下:email.dtd

<span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#efefef"><code><!ELEMENT email (to,from,title,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT body (#PCDATA)></code></span></span></span></span>

如果 XML 解析器配置为允许外部 DTD 或实体,则可以使用以下命令更改以下 XML 代码片段:

<span style="color:#333333"><span style="background-color:#ffffff"><span style="color:#000000"><span style="background-color:#efefef"><code><span style="color:#557799"><?xml version="1.0" encoding="utf-8"?></span>
<span style="color:#3344bb"><!DOCTYPE author [
  <!ENTITY js SYSTEM "file:///etc/passwd"></span>
<span style="color:#3344bb">]></span>
<span style="color:#007700"><author></span><span style="color:#880000"><strong>&js;</strong></span><span style="color:#007700"></author></span></code></span></span></span></span>

现在会发生什么?我们从本地文件系统定义了一个包含,XML 解析器将加载文件,并将在引用实体的任何位置添加内容。假设 XML 消息返回给用户,该消息将是:

额外的文档类型定义 (DOCTYPE) 是您始终可以添加到 xml 文档中的内容,如果启用了解析器设置以允许处理外部实体,则查找 XXE 注入的良好开端。

靶场训练 

我们直接进入靶场环境

1. 参考Drunkbaby师傅审计思路

我们随便输入一个评论然后抓包得到:

它会直接会被处理为XML数据,并且经过测试发现没有进行任何的检查或者过滤,reponse返回sorry,意思就是失败那根据这个,我们可以将xml数据中添加XML entity,并采用file:///的方式获取根目录的文件(linux系统就可以读取/etc/passwd等)

paylaod:

<?xml version="1.0"?><!DOCTYPE root [<!ENTITY root SYSTEM "file:///C:/">]><comment><text>&root;</text></comment>

 其中root可以换成其他字符串,但是不要违反XML的命名要求。得到下面就说明成功

这时候c盘文件目录全部被读取泄露 

我们审计一下源代码 

@PostMapping(path = "xxe/simple", consumes = ALL_VALUE, produces = APPLICATION_JSON_VALUE)
  @ResponseBody
  public AttackResult createNewComment(HttpServletRequest request, @RequestBody String commentStr) {
    String error = "";
    try {
      var comment = comments.parseXml(commentStr);
      comments.addComment(comment, false);
      if (checkSolution(comment)) {
        return success(this).build();
      }
    } catch (Exception e) {
      error = ExceptionUtils.getStackTrace(e);
    }
    return failed(this).output(error).build();
  }

我们主要看下面代码

 var comment = comments.parseXml(commentStr);
//var comment = comments.parseXml(commentStr);: 解析传入的XML字符串commentStr,并将结果存储在名为comment的变量中。这里使用了一个名为comments的对象(类型未知)的parseXml方法来执行解析操作。

跳转到 Comments.parseXml 去,主要描述了 parseXml 如何处理 commentStr。 

关注下面两行

var jc = JAXBContext.newInstance(Comment.class);  
var xif = XMLInputFactory.newInstance();
  • 前置知识:JAXB 作为 JDK 的一部分,能便捷地将 Java 对象与 XML 进行相互转换。
  • JAXBContext 是整个 JAXB API 的入口。主要用来构建 JAXB 实例newInstance()
  • Marshaller接口,将Java对象序列化为XML数据。
  • Unmarshaller接口,将XML数据反序列化为Java对象。

接下来要讲的是产生 XXE 的代码块原因

var unmarshaller = jc.createUnmarshaller();  
return (Comment) unmarshaller.unmarshal(xsr);

此处创建一个 Unmarshaller 对象。返回的值是 XML 经过unmarshal 方法处理的值。由于 unmarshal 在执行过程中解析了 XML(这里类似于反序列化的意思),导致 XXE 注入。

当把 XML 格式的字符串传递给 Unmarshaller 接口转变成 Java 对象时,会解析一遍 XML,如果传入的值可控就会导致 XXE 注入攻击。

将接受的XML格式评论解析为评论的对象

 comments.addComment(comment, false);//将解析后的评论对象comment添加到名为comments的对象(类型未知)中,以便将其保存到评论列表中。第二个参数false表示该评论不是管理员评论。

      if (checkSolution(comment)) {
        return success(this).build();
      }

就是这里就没对接受的参数进行过滤或者禁用 就直接开始进行check,然后攻击者就可以构造恶意的代码进行攻击

2. REST框架XXE

我们也继续输入1得到

抓包发现 发送的请求不是xml格式 而是json格式 

我们修改为json格式得到报错 

根据XML解析器的不同,您可能会得到更好的错误消息,在这种情况下,消息有点神秘,这意味着我们没有发送有效的xml。

 我们使用上一关的paylaod继续读取C盘

成功读取C盘内容 

审计:

ContentTypeAssignment.java

public AttackResult createNewUser(
      HttpServletRequest request,
      @RequestBody String commentStr,
      @RequestHeader("Content-Type") String contentType) {
    AttackResult attackResult = failed(this).build();

    if (APPLICATION_JSON_VALUE.equals(contentType)) {
      comments.parseJson(commentStr).ifPresent(c -> comments.addComment(c, true));
      attackResult = failed(this).feedback("xxe.content.type.feedback.json").build();
    }

    if (null != contentType && contentType.contains(MediaType.APPLICATION_XML_VALUE)) {
      String error = "";
      try {
        Comment comment = comments.parseXml(commentStr);
        comments.addComment(comment, false);
        if (checkSolution(comment)) {
          attackResult = success(this).build();
        }
      } catch (Exception e) {
        error = ExceptionUtils.getStackTrace(e);
        attackResult = failed(this).feedback("xxe.content.type.feedback.xml").output(error).build();
      }
    }

    return attackResult;

并没有对Content-Type 进行严格的过滤。 然后也是使用了parsexml函数 跟上提一样

3.XXE DOS攻击

使用相同的 XXE 攻击,我们可以对服务器执行 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;”字符串都是一个定义的实体,可扩展为十个“&lol7;”字符串,依此类推。在处理完所有实体扩展后,这个小的(< 1 KB)的 XML 块实际上将占用近 3 GB 的内存。

修复(参考百度开发者中心):

  1. 验证输入数据:对所有输入数据进行严格的验证和过滤,确保没有恶意的内容被注入到应用程序中。对所有用户输入进行适当的验证和清理,可以有效地防止攻击者利用XXE漏洞进行攻击。
  2. 禁用外部实体引用:在处理XML数据时,禁用或限制对外部实体的引用。这可以通过配置XML解析器来实现,确保应用程序不会加载外部实体,从而减少被攻击的风险。
  3. 使用安全的XML解析器:选择经过安全加固的XML解析器,并遵循最佳实践来使用它们。这些解析器通常具有内置的安全功能,能够检测和防范XXE攻击。
  4. 限制实体大小:设置合理的实体大小限制,防止攻击者通过大量数据来耗尽资源或触发拒绝服务攻击。
  5. 日志记录和监控:启用详细的日志记录和监控机制,以便及时发现和响应任何可疑的活动。通过监控应用程序的行为和异常模式,可以快速检测并应对潜在的XXE攻击。
  6. 定期更新和维护:保持系统和应用程序的最新状态,及时修复已知的安全漏洞。定期更新和维护可以确保您的系统不受最新的XXE攻击威胁。
  7. 安全培训和意识提升:对开发人员和运维人员进行安全培训,提高他们对XXE漏洞的认识和防范意识。只有当整个团队都意识到安全问题并采取相应的防护措施时,才能更有效地防止XXE攻击。
  8. 使用Web应用防火墙(WAF):部署一个有效的Web应用防火墙可以提供额外的防护层,监测并阻止恶意请求和已知的攻击模式。WAF可以帮助识别并拦截包含XXE漏洞的恶意请求,保护应用程序免受攻击。
  9. 代码审查和安全测试:实施严格的代码审查和安全测试流程,确保应用程序在开发阶段就避免了潜在的安全风险。通过专业的安全测试工具和团队,可以检测出应用程序中存在的XXE漏洞以及其他安全问题。
  10. 数据加密和保护:对敏感数据进行加密存储和传输,降低数据泄露的风险。即使攻击者能够利用XXE漏洞获取敏感信息,加密措施也可以使数据难以被利用。

源码地址

 https://github.com/WebGoat/WebGoat/tree/main/src/main/java/org/owasp/webgoat/lessons/xxe

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

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

相关文章

HTML5+CSS3小实例:衣服颜色选择器

实例:衣服颜色选择器 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数&#xff1a;2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

262:vue+openlayers 移动地图获取中心点经纬度信息

第262个 点击查看专栏目录 本示例介绍演示如何在vue+openlayers中移动地图并获取中心点经纬度信息。这里主要用到了是view的getCenter方法,这一功能在实际项目中很有用,能给出一个清晰的定位。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示…

解决后端传给前端的日期问题

解决方式&#xff1a; 1). 方式一 在属性上加上注解&#xff0c;对日期进行格式化 但这种方式&#xff0c;需要在每个时间属性上都要加上该注解&#xff0c;使用较麻烦&#xff0c;不能全局处理。 2). 方式二&#xff08;推荐 ) 在WebMvcConfiguration中扩展SpringMVC的消息转…

JDBC基础(CRUD)使用详解(mysql)

1. 什么是JDBC JDBC,即Java Database Connectivity,java数据库连接.是一种用于执行SQL语句的Java API,它是 Java中的数据库连接规范.这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成,它为Java 开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访…

测试人员Bug书写规范

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 在测试人员日常工作中&#xff0c;关于bug的编写和定义是一个比较经常的工作&#xff0c;如果bug编写描…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

【Flink SQL】Flink SQL 基础概念(四):SQL 的时间属性

《Flink SQL 基础概念》系列&#xff0c;共包含以下 5 篇文章&#xff1a; Flink SQL 基础概念&#xff08;一&#xff09;&#xff1a;SQL & Table 运行环境、基本概念及常用 APIFlink SQL 基础概念&#xff08;二&#xff09;&#xff1a;数据类型Flink SQL 基础概念&am…

Java多线程实战-CountDownLatch模拟压测实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

QT UI窗口常见操作

MainWidget::MainWidget(QWidget *parent): QWidget(parent), ui(new Ui::MainWidget) {ui->setupUi(this);// 设置主窗口背景颜色QPalette plt;plt.setColor(QPalette::Window,QColor(180,220,130));this->setPalette(plt);// 禁止窗口最大化按钮setWindowFlags(windowF…

【前端Vue】Vue3+Pinia小兔鲜电商项目第1篇:认识Vue3,1. Vue3组合式API体验【附代码文档】

全套笔记资料代码移步&#xff1a; 前往gitee仓库查看 感兴趣的小伙伴可以自取哦&#xff0c;欢迎大家点赞转发~ 全套教程部分目录&#xff1a; 部分文件图片&#xff1a; 认识Vue3 1. Vue3组合式API体验 通过 Counter 案例 体验Vue3新引入的组合式API vue <script> ex…

Python爬虫与数据可视化源码免费领取

引言 作为一名在软件技术领域深耕多年的专业人士&#xff0c;我不仅在软件开发和项目部署方面积累了丰富的实践经验&#xff0c;更以卓越的技术实力获得了&#x1f3c5;30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定&#xff0c;也是对我的创新精神和专业承诺…

Ubuntu18.04 中编译 TI 官方的ros驱动包中 autonomous_robotics_ros 包所存在的问题及解决方案

环境&#xff1a; 安装有 ROS 系统的 Ubuntu18.04 环境&#xff0c;并且已将 TI 官方的毫米波雷达 ROS 驱动下载到Ubuntu18.04系统中&#xff0c;如需获取此代码请点击此链接根据教程下载即可。 代码下载链接&#xff1a;TI IWR6843ISK ROS驱动程序搭建-CSDN博客 问题1&…

天软专业课 C语言 24

文章目录 基础知识进制转换字符在计算机内部的表示 程序设计的基本概念程序结构化程序设计 C程序设计的初识简单的C程序标识符、常量与变量整型数据实型数据字符型数据算数表达式赋值表达式自加自减与逗号运算符 顺序结构赋值语句数据的输出数据的输入复合语句与空语句程序实例…

Android VINF

周末搞这玩意欲仙欲死&#xff0c;没办法只有看看。VINTF是供应商接口对象&#xff08;VINTF 对象&#xff09;&#xff0c;准确的说&#xff0c;这个是属于兼容性矩阵概念。。。有点想起了以前看过的一个电影&#xff0c;异次元杀阵。。。下面是谷歌官方的图。 本质上其实就是…

Linux——开发工具yum与vim

Linux——开发工具yum与vim 文章目录 Linux——开发工具yum与vim一、Linux 软件包管理器-yum1.1 什么是软件包1.2 yum的使用 二、linux下的编辑器-vim2.1 vim的基本概念2.2 vim的基本操作插入模式下的基本命令底行模式下的基本指令 2.3 vim的配置 一、Linux 软件包管理器-yum …

C++面试宝典第35题:滑动窗口最大值

题目 给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。滑动窗口每次只向右移动一位,你只可以看到在滑动窗口内的k个数字,请返回滑动窗口中的最大值。 示例: 输入:nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3 输出:[3, 3, 5, 5, 6, 7] 解析 这…

java数据结构与算法刷题-----LeetCode55. 跳跃游戏

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;时间复杂度O( n n n)&#xff0c;空间复杂度…

人人开源ueditor富文本+SpringBoot后端,配置问题解决

一、序言 首先博主第一次开始去使用到人人开源的富文本&#xff0c;在使用时几个问题解决了一天&#xff0c;如果你也存在我想你可以往下认真看&#xff0c;因为这篇博客是我刚刚解决问题时马上就写的总结&#xff0c;首先在使用过程中得到的问题如下&#xff0c;根据这些问题然…

ChatGPT国内镜像站大全

#今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像站到处都是&…