XXE详解-----XML实体注入

XXE-----XML外部实体注入

XML简介

  • XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
  • XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
    XXE详解-----XML实体注入_第1张图片

XML文档的构建模块

  • 所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
    • 元素
    • 属性
    • 实体
    • PCDATA
    • CDATA
    1. 元素
      元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。

      body text in between

    2. 属性
      属性可提供元素的额外信息

    3. 实体
      实体是用来定义普通文本的变量。实体引用是对实体的引用。
    4. PCDATA
      PCDATA 的意思是被解析的字符数据(parsed character data)。
      PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
    5. CDATA
      CDATA 的意思是字符数据(character data)。
      CDATA 是不会被解析器解析的文本。

DTD(文档类型定义)

  • DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
  • DTD 可以在 XML 文档内声明,也可以外部引用。
  • 内部声明:ex:
    实例:


  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>Georgeto>
  <from>Johnfrom>
  <heading>Reminderheading>
  <body>Don't forget the meeting!body>
note>
  • 外部声明(引用外部DTD):ex:
?xml version="1.0"?>

<note>
<to>Georgeto>
<from>Johnfrom>
<heading>Reminderheading>
<body>Don't forget the meeting!body>
note> 

note.dtd的内容为:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

DTD实体

  • DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。
  • 实体又分为一般实体和参数实体
    1. 一般实体的声明语法:
      引用实体的方式:&实体名;
    2. 参数实体只能在DTD中使用,参数实体的声明格式:
      引用实体的方式:%实体名;
  • 内部实体声明:
    实例


<!ENTITY copyright "Copyright W3School.com.cn">
]>

<test>&writer;©right;test>
  • 外部实体声明:
    实例



]>
<author>&writer;©right;author>
  • 在了解了基础知识后,下面开始了解xml外部实体注入引发的问题。

XXE的攻击(XML External Entity)

  • 什么是XXE?
    xxe也就是xml外部实体注入。
  • 怎样构建外部实体注入?
    方式一:直接通过DTD外部实体声明
    XML内容
    XXE详解-----XML实体注入_第2张图片
    方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
    XML内容:
    在这里插入图片描述
    DTD文件内容:
    在这里插入图片描述
    方式三:通过DTD外部实体声明引入外部实体声明
    意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明
    具体看例子
    XML内容
    XXE详解-----XML实体注入_第3张图片
    dtd文件内容:
    在这里插入图片描述
  • 支持的协议有哪些?
    XXE详解-----XML实体注入_第4张图片
  • 产生哪些危害?
  1. XXE危害1:读取任意文件
  • 利用file协议读取本地服务器文件

]>
<foo>
        <value>&passwd;value>
foo>
  1. XXE危害2:执行系统命令
  • 执行命令需要PHP装有expect扩展,比较少见

$xml = <<<EOF

 # id
]>
&f;
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>
  1. XXE危害3:探测内网端口
  • 利用http协议

$xml = <<<EOF


]>
&f;
EOF;
$data = simplexml_load_string($xml);
print_r($data);
?>
  1. XXE危害4:拒绝服务攻击
  • 该攻击通过创建一项递归的 XML 定义,在内存中生成十亿个"lol"字符串,消耗系统资源,从而导致 DDoS 攻击。

 
 <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
 ]>
 <lolz>&lol9;lolz>

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))
  • 过滤用户提交的XML数据
    过滤关键词:,或者SYSTEMPUBLIC

你可能感兴趣的:(渗透测试)