XXE 漏洞简单研究

近期在做个基础的 web 常见漏洞的 ppt,主要参考 OWASP TOP 10 2017RC2,此版本中增加了 XXE 攻击,所以自己简单的研究下 XXE 攻击。XXE(XML External Entity)XML 外部实体,当前端和后端通信数据采用 xml,可传入 xml 外部实体,利用后端 xml 解析器漏洞,使 xml 解析器去访问攻击者指定的资源。首先需要了解一些 xml 的基础知识。

1.xml 基础知识

        XML 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素。

        XML 具有一些特性:

            (1).XML 是一种标记语言,很类似 HTML

            (2).XML 被设计用来传输和存储数据,而 HTML 被设计用来显示数据

            (3).XML 标签没有被预定义,需要用户自行定义标签

            (4).XML 具有自我描述性

        XML 的语法规则:

            (1).XML 必须有一个根元素

            (2).XML 必须有关闭标签

            (3).XML 标签对大小写敏感

            (4).XML 元素必须正确的嵌套

            (5).XML 属性值必须加引号

        XML DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。它使用一系列的合法元素来定义文档结构。DTD 可以在 XML 文档内声明,也可以外部引用。

        (1)内部声明:<!DOCTYPE 根元素 [元素声明]>,例如 <!DOCTYPE note aaa>

        (2)外部声明:<!DOCTYPE 根元素 SYSTEM "文件名">,例如 <!DOCTYPE root SYSTEM "test.dtd">

    DTD 实体声明:

        (1)内部实体声明

            <!ENTITY 实体名称 “实体的值”>

            示例:

                <!DOCTYPE foo [

                <!ELEMENT foo ANY> <!-- 声明元素 -->

                <!ENTITY test "abcdefg"> <!-- 声明内部实体 -->

                <!ENTITY xxe "Thinking"> <!-- 声明内部实体 -->

                ]>

                <foo>&xxe;&test;</foo>

        (2)外部实体声明

                <!ENTITY 实体名称 SYSTEM “URI/URL”>

                外部实体声明支持的部分协议如下:

<!DOCTYPE foo [

        <!ELEMENT foo ANY >

         <!ENTITY  xxe SYSTEM "file:///c:/windows/win.ini"> <!-- 声明外部实体 -->

]>

<foo>&xxe;</foo>

(3)参数实体声明

            参数实体的引用只能在 DTD 中使用

            <!ENTITY % 实体名 “实体内容”>

            <!ENTITY % 实体名 SYSTEM “URI”>

            详情见:http://www.w3school.com.cn/dtd/index.asp

2.XXE 攻击

        xxe 主要利用 xml 解析器对外部实体的解析去触发攻击,从上面支持的协议列表可以看出,可利用 xxe 去进行命令执行、读取文件、内网探测端口、作为跳板机攻击内网机器等攻击,故危害巨大。

xxe 主要分为两种场景:有回显和无回显。有回显的场景中,可以直接查看到攻击执行的结果。无回显的场景下,只能通过其他手段查看攻击效果。这次主要实验了有回显的情况。

        自己编写个简单的登录场景,登录的参数使用 xml 传输,后端对接收的 xml 参数进行解析,并且返回登录情况。制作个登录,当点击 “登录” 按钮时,使用 ajax 传输 xml 格式的登录信息,

传输的数据格式为:<login><username > 用户名 </username><password > 密码 </password></login>

后端使用 dom4j 去解析传入的 xml 参数,为了实现有回显的效果,我们将传入的 username 回传给前端,并在前端显示出来。

@Controller
@RequestMapping(value="api")
public class XXEController {/*<login><username>aaa</username><password>adfasds</password></login>*/@ResponseBody@RequestMapping(value="loginXml.json"/*,method= RequestMethod.POST*/)public AjaxResponse testXXE(String xml){AjaxResponse ajaxResponse = new AjaxResponse();try {Document document = DocumentHelper.parseText(xml);Element rootEle = document.getRootElement();String username = rootEle.elementTextTrim("username");//String password = rootEle.elementTextTrim("password");ajaxResponse.setCode(210);ajaxResponse.setMsg("登录失败");ajaxResponse.setContent(username);}catch (Exception e){e.printStackTrace();ajaxResponse.setCode(211);ajaxResponse.setMsg("数据处理失败");}return ajaxResponse;}}

正常登陆时,传输的参数和回显效果如下:

xml=%3Clogin%3E%3Cusername%3Eadmin%3C%2Fusername%3E%3Cpassword%3Etest123%3C%2Fpassword%3E%3C%2Flogin%3E

使用 xxe 攻击时,攻击示例代码如下,此代码读取 c:/windows/win.ini 文件

<!DOCTYPE foo 
[<!ELEMENT foo ANY>
<!ENTITY abc SYSTEM "file:///c:/windows/win.ini">]>
<login><username>&abc;</username><password>fdsf</password></login>

修改参数和回显效果如下:

3. 防御措施    

        关于防御措施,第一种可以关闭 xml 解析器外部解析功能,第二种进行过滤,例如过滤掉!、DOCTYPE、SYSTEM、ENTITY 等关键字

        尝试下第二种方案,过滤关键字。后端代码如下,将部分关键字过滤掉。

@Controller
@RequestMapping(value="api")
public class XXEController {/*<login><username>aaa</username><password>adfasds</password></login>*/@ResponseBody@RequestMapping(value="loginXml.json"/*,method= RequestMethod.POST*/)public AjaxResponse testXXE(String xml){AjaxResponse ajaxResponse = new AjaxResponse();try {//过滤部分关键字,防止XXEString newXml = xml.replace("!","").replace("DOCTYPE","").replace("ELEMENT","").replace("ENTITY","");Document document = DocumentHelper.parseText(newXml);Element rootEle = document.getRootElement();String username = rootEle.elementTextTrim("username");//String password = rootEle.elementTextTrim("password");ajaxResponse.setCode(210);ajaxResponse.setMsg("登录失败");ajaxResponse.setContent(username);}catch (Exception e){e.printStackTrace();ajaxResponse.setCode(211);ajaxResponse.setMsg("数据处理失败");}return ajaxResponse;}}

可以看到,将关键字过滤(替换成 “”),会导致传入的数据不符合 xml 的格式,后端在 xml 解析器在解析数据时,直接出错并跳转到异常处理代码段,证明这样过滤是有效的。以上为一次简单的研究 xxe,后续有待深入研究。

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

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

相关文章

迭代器模式:分离遍历逻辑与数据结构,实现统一访问接口与灵活扩展

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、优缺点分析总结&#xff1a; 一、引言 ​ 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种方法顺序访问聚合对象的元素&#xff0c;而又不暴露其底层表示。迭…

STC-ISP原厂代码研究之 V3.7d汇编版本

最近在研究STC的ISP程序,用来做一个上位机烧录软件,逆向了上位机软件,有些地方始终没看明白,因此尝试读取它的ISP代码,但是没有读取成功。应该是目前的芯片架构已经将引导代码放入在了单独的存储块中,而这存储块有硬件级的使能线,在面包板社区-宏晶STC单片机的ISP的BIN文…

uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现

uniapp:使用DCloud的uni-push推送消息通知&#xff08;在线模式&#xff09;java实现 1.背景 今天开发app的时候遇到一个需求&#xff1a; 业务在出发特定条件的时候向对应的客户端推送消息通知。 为什么选择在线模式&#xff0c;因为我们使用的是德邦类似的手持终端&#xf…

vue如何重写移动端长按文字复制的功能

移动端长按文字会出现 “复制 全选”的默认弹框&#xff08;这里拿安卓举例&#xff09; 但是有的时候需要在长按的时候增加别的功能 这时候就需要禁用原生的弹框然后重写自己的功能 第一步&#xff1a;禁用掉原生弹窗 但是支持划选文字 重要css属性&#xff1a; -webkit-t…

StarRocks——Stream Load 事务接口实现原理

目录 前言 一、StarRocks 数据导入 二、StarRocks 事务写入原理 三、InLong 实时写入StarRocks原理 3.1 InLong概述 3.2 基本原理 3.3 详细流程 3.3.1 任务写入数据 3.3.2 任务保存检查点 3.3.3 任务如何确认保存点成功 3.3.4 任务如何初始化 3.4 Exactly Once 保证…

Ethernet/IP转Modbus TCP网关

产品功能 1 YC-EIP-TCP工业级EtherNet/IP 网关 2 Modbus TCP 转 EtherNet/IP 3支持ModBus主从站 4 即插即用 无需编程 轻松组态 ,即实现数据交互 5导轨安装 支持提供EDS文件 6 EtherNET/IP与ModBus互转数据透明传输可接入PLC组态 支持CodeSys/支持欧姆龙PLC 支持罗克韦尔(AB) 典…

LACP——链路聚合控制协议

LACP——链路聚合控制协议 什么是LACP&#xff1f; LACP&#xff08;Link Aggregation Control Protocol&#xff0c;链路聚合控制协议&#xff09;是一种基于IEEE802.3ad标准的实现链路动态聚合与解聚合的协议&#xff0c;它是链路聚合中常用的一种协议。 链路聚合组中启用了…

jenkins+kubernetes+git+dockerhub构建devops云平台

Devops简介 k8s助力Devops在企业落地实践 传统方式部署项目为什么发布慢&#xff0c;效率低&#xff1f; 上线一个功能&#xff0c;有多少时间被浪费了&#xff1f; 如何解决发布慢&#xff0c;效率低的问题呢&#xff1f; 什么是Devops&#xff1f; 敏捷开发 提高开发效率&…

卖东西的微信小程序多少钱?卖货小程序怎么做?

部分商家在寻找一个简单的解决方案来在线销售商品&#xff0c;需求并不复杂&#xff0c;能让客户轻松下单并完成支付的商城小程序就已足够。那么做一个这样的商城小程序要怎么做呢&#xff1f;多少钱&#xff1f; 您可能会想&#xff1a;我不懂编程&#xff0c;也没有搭建过小程…

导览系统厂家|景区电子导览|手绘地图|AR导览|语音导览系统

随着元宇宙、VR、AR等新技术的快速发展&#xff0c;旅游服务也更加多元化、智能化。景区导览系统作为旅游服务的重要组成部分&#xff0c;其形式更加多元化智能化。智能导览系统作为一种新的服务方式&#xff0c;能够为游客提供更加便捷的旅游服务和游览体验&#xff0c;也逐渐…

windows安装部署node.js并搭建Vue项目

一、官网下载安装包 官网地址&#xff1a;https://nodejs.org/zh-cn/download/ 二、安装程序 1、安装过程 如果有C/C编程的需求&#xff0c;勾选一下下图所示的部分&#xff0c;没有的话除了选择一下node.js安装路径&#xff0c;直接一路next 2、测试安装是否成功 【winR】…

如何搭建零售行业经营分析体系?

​怎么搭建零售行业的经营分析体系&#xff1f; 整体思路就是&#xff1a;利用数据中台基于业务全价值链的数据沉淀&#xff0c;借助大数据技术进行采集、计算、存储和加工&#xff0c;同时统一数据建模与治理&#xff0c;构建数据资产&#xff0c;充分挖掘数据&#xff0c;实…

[electron] electron环境搭建

electron组成部分 Electron作为一个跨平台的框架。按照道理来说Node.js作为语言已经统一了不同平台的操作&#xff0c;为什么还有Native apis。好吧&#xff0c;先不管那么多首先我们需要先下载Node.js nodejs官网 。记得还要安装npm包管理&#xff0c;这里就不细讲。 npm换源…

[极客大挑战 2019]LoveSQL1 题目分析与详解

一、题目简介&#xff1a; 二、通关思路&#xff1a; 1、首先查看页面源代码&#xff1a; 我们发现可以使用工具sqlmap来拿到flag&#xff0c;我们先尝试手动注入。 2、 打开靶机&#xff0c;映入眼帘的是登录界面&#xff0c;首先尝试万能密码能否破解。 username: 1 or 11…

istio学习记录——VirtualService详解

上一篇使用VirtualService进行了简单的流量控制&#xff0c;并通过Gateway将流量导入到了集群内。这一篇将更加深入的介绍 VirtualService。 k8s中有service&#xff0c;service能够对流量进行负载均衡&#xff0c;那为什么istio又引入了VirtualService呢&#xff0c;因为serv…

MATLAB_ESP32有限脉冲响应FIR无限脉冲响应IIR滤波器

要点 ESP32闪烁LED&#xff0c;计时LEDESP32基础控制&#xff1a;温控输出串口监控&#xff0c;LCD事件计数器&#xff0c;SD卡读写&#xff0c;扫描WiFi网络&#xff0c;手机控制LED&#xff0c;经典蓝牙、数字麦克风捕捉音频、使用放大器和喇叭、播放SD卡和闪存MP3文件、立体…

Vuex的mutations和actions区别

Vuex中的mutations用于同步操作&#xff0c;而actions则处理异步操作。以下是它们的具体区别&#xff1a; 同步与异步&#xff1a; Mutations是同步的&#xff0c;这意味着在mutation中的函数执行时&#xff0c;不能包含任何异步操作&#xff0c;如Promise或者setTimeout等。…

solidity编程

一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机&#xff08; EVM &#xff09;智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能&#xff1a;区块链项⽬⼤部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以 规避很多亏钱项⽬。…

省市区街道/乡镇四级联动vue3

最近优化了一个省.市.区/县、乡镇/街道的四级联动组件&#xff0c;技术栈是element vue3记录一下。 本来是这样的三级联动&#xff1a; 这个三级联动很简单&#xff0c;直接利用el-select组件把地区值带进去就行了&#xff0c;现在要优化成省.市.区/县、乡镇/街道的四级联动&…

GORM框架快速入门

GORM框架 gorm地址 &#xff1a;https://github.com/go-gorm/gorm 目前使用最广泛的一个go语言数据库框架 1、入门 数据库以目前使用最多的mysql为例。 //安装MySQL驱动 go get -u gorm.io/driver/mysql //安装gorm包 go get -u gorm.io/gorm //安装gin go get -u github.c…