24-xxe漏洞学习

XML基础知识

一、引入

什么是xml:

XML 被设计用来传输和存储数据。

不同于HTML 被设计用来显示数据。

XML 指可扩展标记语言(eXtensible Markup Language)。

可扩展标记语言(英语:Extensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

xml的标签必须自定义,但是写标签名的时候要有含义。

数据格式:

24-xxe漏洞学习_第1张图片

XML 和 HTML 之间的差异

XML 不是 HTML 的替代。

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

  • XML 被设计用来传输和存储数据,其焦点是数据的内容。

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

  • HTML 旨在显示信息,而 XML 旨在传输信息。

  • html标签不可以自定义,xml只能自定义

  • xml语法要求严格,必须是成对标签,且有个根标签

二、xml的基本语法

1、组成部分

一个XML文件分为如下几部分内容:

  1. 文档声明

    格式:
    
    属性列表:
    
    	*version :版本号,必须的属性
    	*encoding :编码方式,默认时iso-88
    	*standalone :是否独立 
    
  2. 元素

  3. 属性

  4. 注释

  5. CDATA区、特殊字符

  6. 处理指令(processing instruction)

2、语法规则

  • xml必须有根节点;

根节点就是其他所以节点的父级节点。

  • 根元素是一个完全包括文档中其他所有元素的元素
  • 根元素的起始标记要放在所有其他元素的起始标记之前
  • 跟元素的结束标记要放在所有其他元素的结束标记之后

24-xxe漏洞学习_第2张图片

  • XML语法-文档声明

xml头声明,不强制要求,可有可无,但是建议写上,可以解决编码

24-xxe漏洞学习_第3张图片

24-xxe漏洞学习_第4张图片

  • 所有xml都是成对标签

  • 标签名大小写敏感

24-xxe漏洞学习_第5张图片

  • xml不允许交叉标签

24-xxe漏洞学习_第6张图片

  • 特殊字符必须要使用实体,比如>,<等

XML有5个预定义的实体字符,如下:

24-xxe漏洞学习_第7张图片

XML语法-属性

属性就是用来表示标签自身的一些额外信息。

一个元素可以有多个属性,它的基本格式为:

<student id="100">
    <name>Tomname>
student>
<元素名 属性名1="属性值1" 属性名2="属性值2">

(1)属性值用双引号(”)或单引号(’)分隔,如果属性值中有单引号,则用双引号分隔;

(2)如果有双引号,则用单引号分隔。

那么如果属性值中既有单引号还有双引号怎么办?这种要使用实体(转义字符,类似于html中的空格符)

(3) 特定的属性名称在同一个元素标记中只能出现一次
(4)属性值不能包括<,>,&,如果一定要包含,也要使用实体

属性规则:

一个标签可以有多个属性,属性的值必须使用引号引起来;

命名规则:数字字母下划线,数字不能开头。

XML语法-CDATA节

假如有这么一个需求,需要通过XML文件传递一幅图片,怎么做呢?其实我们看到的电脑上的所有文件,本质上都是字符串,不过它们都是特殊的二进制字符串。我们可以通过XML文件将一幅图片的二进制字符串传递过去,然后再解析成一幅图片。那么这个字符串就会包含大量的<,>,&或者“等一些特殊的不合法的字符。这时候解析引擎是会报错的。

所以,有些内容可能不想让解析引擎解析执行,而是当做原始内容处理,用于把整段文本解释为纯字符数据而不是标记。这就要用到CDATA节。

语法如下:


CDATA必须要大写。

CDATA节中可以输入任意字符(除]]>外),但是不能嵌套!

如下例,这种情况它不会报错,而如果不包含在CDATA节中,就会报错:

<stu id="001">
    <name>杨过name> 
    <sex>sex>
    <age>20age>
    <intro>intro>
stu>

24-xxe漏洞学习_第8张图片

注意:一般情况 特殊字符较少时使用特殊字符, 字符多的时候用CDATA

三、使用PHP解析XML文档

xml是一种数据传输格式,当PHP接收到的就是一段xml的时候,我们的PHP应该怎么处理XMl的数据呢?

在PHP5版本以后,当提供了一个非常强大的类库,simpleXMl类库,专门用于实现对xml文档的解析操作。

3.1 XML解析原理

php解析xml分为3步:

1:读取XML文档到内存;

2:形成DOM树;

3:由DOM树生产对象并返回;

simplexml_load_file('xml文件')

//simplexml_load_file 解析xml文档,返回PHP对象

代码案例:

24-xxe漏洞学习_第9张图片

php解析xml返回对象的值:

24-xxe漏洞学习_第10张图片

四、遍历xml数据

man as $v){
	echo $v->name;
}
?>

或者

$x=simplexml_load_file('3.1xml');
$c=count($x->man);
for($i=0;$i<$c;$i++){
	echo $x->man[$i]->name;
}

24-xxe漏洞学习_第11张图片

  • 解析的两种方式
    • SAX 解析
    • DOM 解析

24-xxe漏洞学习_第12张图片

24-xxe漏洞学习_第13张图片

五、添加节点

addChild() 函数

定义:addchile()函数给simplexml元素添加一个子元素。

语法:

addchile(name,values,ns);

// -name 必须 规定要添加子元素的名称

-value 可选 规定子元素的值

-ns 可选 规定子元素的命名空间。

实例

$x=simplexml_load_file('3.1.xml');

$man=$x->addChild('man');

$man->addChild('name','玉帝');
$man->addChild('age','999');

24-xxe漏洞学习_第14张图片

asXML()函数

asXML() 函数以字符串的形式从 SimpleXMLElement 对象返回 XML 文档。

若失败,则返回 false。

$x->asXML('3.1.xml');

24-xxe漏洞学习_第15张图片

六、DTD

文档类型定义(DTD)可定义合法的XML文档构建模块
它使用一系列合法的元素来定义文档的结构
DTD可被成行地声明于XML文档中,也可作为一个外部引用。

24-xxe漏洞学习_第16张图片

(1)内部的DOCTYPE声明

从xml文件外部引入DTD:



DOCTYPE note [ 
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>Georgeto>
  <from>Johnfrom>
  <heading>Reminderheading>
  <body>Don't forget the meeting!body>
note>

(2)外部文档声明

从xml文件外部引入DTD:


24-xxe漏洞学习_第17张图片

DTD实体:

DTD可以约束XML文档出现的各个元素,元素的名称,元素的先后顺序,属性等。。

(1)内部实体声明

(2)外部实体声明

(3)参数实体声明

规定一个默认的属性值

DTD属性值:



以下是属性类型的选项:

类型 描述
CDATA 值为字符数据 (character data)
(en1|en2|…) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值

24-xxe漏洞学习_第18张图片

xxe漏洞

一、思维导图

24-xxe漏洞学习_第19张图片

二、简介:

XXE:XML External Entity attack(XML外部实体攻击)。其实XXE就是攻击者自定义了XML文件进行了执行,已知的最终效果就是读取系统文件或DOS攻击。。

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

三、xml示例


<!DOCTYPE note [	
<!ELEMENT to (#PCDATA)>			
<!ELEMENT from (#PCDATA)>		
<!ELEMENT head (#PCDATA)>		
<!ELEMENT body (#PCDATA)>		
]]]>


<note>
    <to>Daveto>
    <from>Tomfrom>
    <head>Reminderhead>
    <body>You are a good manbody>
note>

四、pikachu靶场XML

回显,玩法,协议,引入

24-xxe漏洞学习_第20张图片

  • 打开靶场

24-xxe漏洞学习_第21张图片

判断:包含命名实体(内部实体)的xml数据是否回显

 
 ]> 
&xxe;

网页上回显“仙女”,说明网页对输入的xml数据是有结果回显的

注意:这里只能判断是否有回显

24-xxe漏洞学习_第22张图片

构置payload玩法

1、读取文件



DOCTYPE ANY [
	

]>

<x>&xxe;x>

//xxe为变量,读取test.txt
//打印出来
//用file协议读指定路径的文件

**备注:**前提条件是有那个文件24-xxe漏洞学习_第23张图片

2、内网探针或攻击内网应用(触发漏洞地址)


DOCTYPE foo [
<!ELEMENT foo ANY >

]>
<x>&rabbit;x>

返回为空,说明内网中服务器上,index.php文件是存在的,也可以说8081端口是开放的,因此这里这个xxe漏洞,可以实现内网探针。

24-xxe漏洞学习_第24张图片

为什么这里返回为空,说明index.txt文件是存在的?因为如下测试显示,改为不存在的1132323.txt后,服务器返回一行报错信息。

24-xxe漏洞学习_第25张图片

上面的ip地址假设就是内网的一台服务器的ip地址。还可以进行一个端口扫描,看一下端口是否开放。

你可能感兴趣的:(学习,html,java)