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

前言:

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

注意:

本文章参考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)@ResponseBodypublic 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.mzph.cn/news/745592.shtml

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

相关文章

软考77-上午题-【面向对象技术3-设计模式】-创建型设计模式02

一、生成器模式 1-1、意图 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 1-2、结构图 Builder 为创建一个 Product 对象的各个部件指定抽象接口。ConcreteBuilder 实现 Builder 的接口以构造和装配该产品的各个部件&#xff0c;定…

css设置选中文字和选中图片字的颜色

要改变页面中选中文字的颜色&#xff0c;可以使用 CSS 的 ::selection 伪元素来实现 *::selection {/* 改变选中文字的背景色 */background-color: #c42121;/* 改变选中文字的文本颜色 */color: #fff; } 用通配符选择器给所有元素都加上了 ::selection伪元素&#xff0c;用于…

GPT实战系列-如何让LangChain的Agent选择工具

GPT实战系列-如何让LangChain的Agent选择工具 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法…

先验分布、后验分布、极大似然的一点思考

今天和组里同事聊天的时候&#xff0c;无意中提到了贝叶斯统计里先验分布、后验分布、以及极大似然估计这三个概念。同事专门研究如何利用条件概率做系统辨识的&#xff0c;给我画了一幅图印象非常深刻&#xff1a; 其中k表示时序关系。上面这个图表示后验分布是由先验分布与似…

2024年云服务器ECS价格表出炉——阿里云

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

深入理解TCP的四次分手过程

文章目录 深入理解TCP的四次分手过程四次分手的意义四次分手的工作原理四次分手的重要性实际应用中的考虑结论补充:TIME_WAIT在哪一步?TIME_WAIT状态的目的TIME_WAIT状态的影响 深入理解TCP的四次分手过程 在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09;确…

在Linux/Ubuntu/Debian中使用7z压缩和解压文件

要在 Ubuntu 上使用 7-Zip 创建 7z 存档文件&#xff0c;你可以使用“7z”命令行工具。 操作方法如下&#xff1a; 安装 p7zip&#xff1a; 如果你尚未在 Ubuntu 系统上安装 p7zip&#xff08;7-Zip 的命令行版本&#xff09;&#xff0c;你可以使用以下命令安装它&#xff1a;…

Gitlab光速发起Merge Request

前言 在我们日常开发过程中需要经常使用到Merge Request&#xff0c;在使用过程中我们需要来回在开发工具和UI界面之前来回切换&#xff0c;十分麻烦。那有没有一种办法可以时间直接开发开工具中直接发起Merge Request呢&#xff1f; 答案是有的。 使用 Git 命令方式创建 Me…

Unity资源热更新----AssetBundle

13.1 资源热更新——AssetBundle1-1_哔哩哔哩_bilibili Resources 性能消耗较大 Resources文件夹大小不能超过2个G 获取AssetBundle中的资源 打包流程 选择图片后点击 创建文件夹&#xff0c;Editor优先编译 打包文件夹位置 using UnityEditor; using UnityEngine; public cla…

ideaSSM社区二手交易平台C2C模式开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea ssm 社区二手交易平台系统是一套完善的完整信息管理系统&#xff0c;结合SSM框架完成本系统SpringMVC spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码…

django-comment-migrate 模型注释的使用

django-comment-migrate 的使用 django-comment-migrate 是一个 Django 应用&#xff0c;用于将模型注释自动迁移到数据库表注释中。它可以帮助您保持数据库表注释与模型定义的一致性&#xff0c;并提高代码的可读性。 安装 要使用 django-comment-migrate&#xff0c;您需要…

bootstrap企业网站前端模板

介绍 企业网站前端模板 软件架构 前端所用技术html/css/js/jquery 前端框架bootstrap 安装教程 浏览器本地路径访问发布到服务器比如&#xff08;tomcat/nginx等&#xff09;云服务器/虚拟机 网站效果图 网站预览 点击预览 源码地址 https://gitee.com/taisan/company…

react native常用插件

react-native-async-storage/async-storage 说明&#xff1a;AsyncStorage 是一个在 react-native 中轻量存储的库&#xff1b;跟 localStorage 类似&#xff0c;API 也几乎一样&#xff1b;存储的时候需要将存储内容转成字符串存储。 react-navigation/material-bottom-tabs …

【数据结构和算法初阶(C语言)】队列实操(概念实现+oj题目栈和队列的双向实现,超级经典!!!)

1. 队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c; 队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为…

如何布局马斯克推特上喊的meme币赛道

2024年的牛市正如火如荼的开展&#xff0c;截止当下&#xff0c;比特币已经站上了7.3万美元&#xff0c;远超2021年高点的6.9万美元&#xff0c;比特币的未来是一片大海。 除了比特币的一枝独秀之外&#xff0c;meme板块可以说是市场资金最青睐的。尤其是马斯克在X分享PEPE相关…

【b站咸虾米】2 Vue基础(下) 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例

课程地址&#xff1a;【2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例】 https://www.bilibili.com/video/BV1pz4y1S7bC/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 Vue基础 下 2.8 计算属性 2.8.1 计算属性使用 2.8.2 计算…

【Flutter学习笔记】9.6 动画切换组件(AnimatedSwitcher)

参考资料&#xff1a;《Flutter实战第二版》9.6 动画切换组件&#xff08;AnimatedSwitcher&#xff09; 9.6.1 AnimatedSwitcher AnimatedSwitcher 可以同时对其新、旧子元素添加显示、隐藏动画&#xff0c;在需要切换新旧元素的场景广泛使用。也就是说在AnimatedSwitcher的子…

2.MongoDB与关系数据库对比

MongoDB的简单操作与比较 与关系数据库对比 MySQL与MongoDB都是开源的常用数据库&#xff0c;但是MySQL是传统的关系型数据库&#xff0c;MongoDB则是非关系型数据库&#xff0c;也叫文档型数据库&#xff0c;是一种NoSQL的数据库。它们各有各的优点&#xff0c;来看看他们之…

数字排列 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 小明负责公司年会&#xff0c;想出一个趣味游戏: 屏幕给出 1−9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 n 位置…

Turbo C++ v3.7.8.9的下载和安装(C语言编辑器完整安装步骤详细图文教程)·跟老吕学C语言(C语言必学教程之一)

[TOC](Turbo C v3.7.8.9的下载和安装(C语言编辑器完整安装步骤详细图文教程)) 跟老吕学C语言&#xff08;C语言必学教程之一&#xff09; 老吕是通过 Turbo C 编译器开始了 C 编程培训和开发。 本文中&#xff0c;老吕将带你了解如何下载 Turbo C&#xff0c;如何在任何最新 W…