浅入深出了解XXE漏洞

https://github.com/c0ny1/xxe-lab
为了更深入的理解,我准备理论和实际相结合的了解XXE!

浅谈XML 初识XML

一个好的代码基础能帮助你更好理解一类漏洞,所以先学习一下XML的基础知识。

XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具,简单来说XML主要是面向传输的。

什么是XML?

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

与HTML的对比

XML 不是 HTML 的替代 XML 和 HTML 为不同的目的而设计 XML 被设计为传输和存储数据,其焦点是数据的内容 HTML 被设计用来显示数据,其焦点是数据的外观 HTML 旨在显示信息,而 XML 旨在传输信息 XML文档结构

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

请看示例:

<!--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>wecome</to> <from>to</from> <head>This wave is hacker</head> <body>You are a good hacker</body> </note> DTD:

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

DTD文档中有很多重要的关键字如下: * DOCTYPE(DTD的声明) * ENTITY(实体的声明) * SYSTEM、PUBLIC(外部资源申请)

可以用如下语法引入外部DTD

<!DOCTYPE 根元素 SYSTEM "文件名"> 实体:

实体可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该变量的值。

实体按类型主要分为以下四种:
* 内置实体 (Built-in entities)

* 字符实体 (Character entities) * 通用实体 (General entities) * 参数实体 (Parameter entities) 四种实体引用实例

内部实体:

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

参数实体:

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

参数实体外实体+内部实体

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ENTITY name "nMask">]> <foo> <value>&name;</value> </foo>

参数实体+外部实体

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE a [ <!ENTITY name "nMask">]> <foo> <value>&name;</value> </foo>

** 注意:%name(参数实体)是在DTD中被引用的,而&name(其余实体)是在xml文档中被引用的。

由于xxe漏洞主要是利用了DTD引用外部实体导致的漏洞,所以我们特别来分析外部实体 **

外部实体定义

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

通过url可以引用哪些类型的外部实体?当然不同的程序语言,所支持的协议是不一样的

对照表:
案例演示:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE A [ <!ENTITY Config SYSTEM "file:///etc/passwd">]> <foo> <value>&Config;</value> </foo> 浅谈XXE漏洞

XXE漏洞介绍:
XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。此类攻击可能包括使用file:方案或系统标识符中的本地路径公开本地文件,其中可能包含敏感数据,例如密码或私人用户数据。由于此类攻击是相对于处理XML文档的应用程序而发生的,因此攻击者可能会使用此受信任的应用程序转到其他内部系统,可能通过http(s)请求公开其他内部内容或启动CSRF攻击任何不受保护的内部服务。在某些情况下,可以通过取消引用恶意URI来利用容易受到客户端内存损坏问题影响的XML处理器库,从而可能允许在应用程序帐户下执行任意代码。其他攻击可以访问可能不会停止返回数据的本地资源,如果未释放太多线程或进程,也可能会影响应用程序的可用性。

注意:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspwwd.html