XXE漏洞

XXE漏洞
一、*XML*

1、*XML简介*

(1)XML 指可扩展标记语言(EXtensible Markup Language)

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

(3)XML 的设计宗旨是传输数据,而非显示数据

(4)XML 标签没有被预定义。您需要自行定义标签。

(5)XML 被设计为具有自我描述性。

*2、XML与HTML的区别*

(1)XML 不是 HTML 的替代。

(2)XML 和 HTML 为不同的目的而设计:

(3)XML 被设计为传输和存储数据,其焦点是数据的内容。

(4)HTML 被设计用来显示数据,其焦点是数据的外观。

(5)HTML 旨在显示信息,而 XML 旨在传输信息。

*3、XML用途*

XML应用于web开发的许多方面,常用于简化数据的存储和共享。

(1)XML 把数据从 HTML 分离

通过 XML,数据能够存储在独立的 XML 文件中。这样你就可以专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。

通过使用几行 JavaScript,你就可以读取一个外部 XML 文件,然后更新 HTML 中的数据内容。

(2)XML 简化数据共享

XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。

这让创建不同应用程序可以共享的数据变得更加容易。

(3)XML 简化数据传输

通过 XML,可以在不兼容的系统之间轻松地交换数据。

(4)XML 简化平台的变更

XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。

(5)XML 使您的数据更有用

由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。

不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。

通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。

(6)XML 用于创建新的 Internet 语言

很多新的 Internet 语言是通过 XML 创建的:

例子:

XHTML - 最新的 HTML 版本

WSDL - 用于描述可用的 web service

WAP 和 WML - 用于手持设备的标记语言

RSS - 用于 RSS feed 的语言

RDF 和 OWL - 用于描述资源和本体

SMIL - 用于描述针针对 web 的多媒体

4、*XML树结构*

(1)XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。

(2)XML 文档必须包含根元素。该元素是所有其他元素的父元素。

(3)XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

(4)所有元素均可拥有子元素

注意:所有元素皆可自定义。

*5、XML语法规则*

(1)所有的xml元素都必须有一个闭合标签;

(2)xml标签大小写敏感;

(3)xml的标签必须正确嵌套;

(4)XML文档必须有根元素;

(5)xml属性必须加引号;

(6)实体引用;

在 XML 中,一些字符拥有特殊的意义。

如果你把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。这样会产生 XML 错误

在这里插入图片描述
(7)在xml中空格会被保留。

(8)XML以LF存储换行

(9)XML中的注释

*6、XML元素*

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。

7、*XML命名规则*

(1)名称可以含字母、数字以及其他的字符;

(2)名称不能以数字或者标点符号开始;

(3)名称不能以字符 “xml”(或者 XML、Xml)开始;

(4)名称不能包含空格。

最佳命名习惯:

(1)使名称具有描述性

(2)名称应当比较简短

(3)最好使用下划线,不使用“-”、“.”、“:”等。

*8、XML属性*

XML 元素可以在开始标签中包含属性,属性 (Attribute) 提供关于元素的额外(附加)信息。

实例:

//sex是属性 Anna Smith female //sex是子元素 Anna Smith

*二、DTD*

*1、DTD简介*

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

*2、DTD声明*

(1)内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当包装在一个 DOCTYPE 声明中。

实例:

<?xml version="1.0"?> //定义 note 元素有四个元素:"to、from、heading,、body" <!ELEMENT to (#PCDATA)> //定义 to 元素为 "#PCDATA" 类型 <!ELEMENT from (#PCDATA)> //定义 from 元素为 "#PCDATA" 类型 <!ELEMENT heading (#PCDATA)> //定义 heading 元素为 "#PCDATA" 类型 <!ELEMENT body (#PCDATA)> //定义 body 元素为 "#PCDATA" 类型]> George John Reminder Don't forget the meeting!

(2)外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应被封装在一个 DOCTYPE 定义中。

实例:

<?xml version="1.0"?>GeorgeJohnReminderDon't forget the meeting!

包含DTD的“note.dtd”文件:

<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>

*3、DTD构建模块*

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

(1)元素:主要构建模块

(2)属性:有关元素的额外信息

(3)实体:定义普通文本的变量

(4)PCDATA:被解析的字符数据(parsed character data)

(5)CDATA:字符数据(character data)CDATA 是不会被解析器解析的文本。

*4、DTD元素*

(1)声明一个元素

<!ELEMENT 元素名称 类别>

或者

<!ELEMENT 元素名称 (元素内容)>

(2)空元素

<!ELEMENT 元素名称 EMPTY>

(3)只有 PCDATA 的元素

<!ELEMENT 元素名称 (#PCDATA)>

(4)带有任何内容的元素

<!ELEMENT 元素名称 ANY>

(5)带有子元素的元素

<!ELEMENT 元素名称 (子元素名称1,子元素名称2,.....)>

(6)声明只出现一次的元素

<!ELEMENT 元素名称 (子元素名称)>

(7)声明最少出现一次的元素

<!ELEMENT 元素名称 (子元素名称+)>

(8)声明出现零次或多次的元素

<!ELEMENT 元素名称 (子元素名称+)>

(9)声明出现零次或多次的元素

<!ELEMENT 元素名称 (子元素名称*)>

(10)声明出现零次或一次的元素

<!ELEMENT 元素名称 (子元素名称?)>

(11)声明“非…/既…”类型的内容

<!ELEMENT note (to,from,header,(message|body))>

(12)声明混合型的内容

<!ELEMENT note (#PCDATA|to|from|header|message)*>

*5、DTD属性*

(1)声明属性

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

DTD 实例:

<!ATTLIST payment type CDATA "check">

XML 实例:

(2)列举属性值

<!ATTLIST 元素名称 属性名称 (en1|en2|..) 默认值>

DTD 例子:

<!ATTLIST payment type (check|cash) "cash">

XML 例子:

或者

*6、DTD实体*

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

实体引用是对实体的引用。

实体可在内部或外部进行声明。

(1)一个内部实体声明(类似变量)

<!ENTITY 实体名称 "实体的值">

例子:

DTD 例子:

<!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

&writer;©right;

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。

(2)一个外部实体声明

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

例子:

DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

&writer;©right;

*三、XML漏洞原理*

Xml注入产生原理:

XXE漏洞:全称(XML External Entityinjection)即XML外部实体注入漏洞。

XEE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描。攻击内网网站、发起DOS攻击等危害。XXE漏洞触发的点往往是可以上传XML文件的位置,没有对上传的XML文件进行过滤,导致可上传恶意XML文件。

*四、重要函数*

*1、File_get_contents()*

file_get_contents() 函数把整个文件读入一个字符串中。

和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。

file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。

语法:

file_get_contents(path,include_path,context,start,max_length)
在这里插入图片描述

例子

<?php echo file_get_contents("test.txt"); ?>

输出:

This is a test file with test text.

file_get_contents.php与test.txt在同一目录下:

在这里插入图片描述

*2、php://input*

php://input是一个可以访问请求的原始数据的只读流。

结合file_get_contents(“php://input”)可以读取post提交的数据,不提交post数据则无输出。

在这里插入图片描述
在这里插入图片描述

*3、simplexml_load string函数介绍*

php中的simplexml_load_string函数将xml格式字符串转换为对应的simeplXMLElemlent\

语法:

simplexml_load_string(data,classname,options,ns,is_prefix);

在这里插入图片描述

实例:

在这里插入图片描述

在这里插入图片描述

*4、XML注入回显,PHP输出函数*

在php中可以使用print_r()、echo输出想输出的内容。

语法:

bool print_r ( mixed $expression [, bool $return ] )

参数说明:

$expression: 要打印的变量,如果给出的是 string、integer 或 float 类型变量,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。

$return: 可选,如果为 true 则不输出结果,而是将结果赋值给一个变量,false 则直接输出结果。

*(**1**)**服务端源代码:*

在这里插入图片描述

*(**2**)**提交正常参数*

在这里插入图片描述

*(3)构造payload:*
在这里插入图片描述

*(4)利用payload读取文件test.txt*

在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值