首页 > 其他分享 >XXE注入详解

XXE注入详解

时间:2024-01-31 13:22:06浏览次数:27  
标签:XML SimpleXMLElement class 实体 DTD 详解 XXE public 注入

XML介绍

XML全称可扩展标记语言(EXtensible Markup Language),XML跟HTML格式类似,但是作用不同,XML侧重于数据传输,HTML注重于标记语言,也就是说XML其实是一种数据传输的手段

XML格式

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!--xml文件的声明-->
<bookstore>                                                 <!--根元素-->
  <book category="COOKING">        <!--bookstore的子元素,category为属性-->
    <title>Everyday Italian</title>                       <!--book的子元素-->
    <author>Giada De Laurentiis</author>                  <!--book的子元素-->
    <year>2005</year>                                     <!--book的子元素-->
    <price>30.00</price>                                  <!--book的子元素-->
  </book>                                                 <!--book的结束-->
</bookstore>                                       <!--bookstore的结束-->
  • 所有 XML 元素都必须有关闭标签。
  • XML 标签对大小写敏感。
  • XML 必须正确地嵌套。
  • XML 文档必须有根元素。
  • XML 的属性值须加引号。

使用PHP代码来读取XML文件:

<?php 
    libxml_disable_entity_loader(false);
    $xmlContent = file_get_contents("./xml.xml");
    $dom = new DOMDocument();
    $dom->loadXML($xmlContent, LIBXML_NONET| LIBXML_DTDLOAD);
    $cred = simplexml_import_dom($dom);
    var_dump($cred);
?>

# 运行结果
class SimpleXMLElement#2 (2) {    
  public $comment =>
  array(2) {
    [0] =>
    class SimpleXMLElement#4 (0) {
    }
    [1] =>
    class SimpleXMLElement#3 (0) {
    }
  }
  public $book =>
  class SimpleXMLElement#5 (6) {  
    public $@attributes =>
    array(1) {
      'category' =>
      string(7) "COOKING"
    }
    public $comment =>
    array(5) {
      [0] =>
      class SimpleXMLElement#10 (0) {
        ...
      }
      [1] =>
      class SimpleXMLElement#9 (0) {
        ...
      }
      [2] =>
      class SimpleXMLElement#8 (0) {
        ...
      }
      [3] =>
      class SimpleXMLElement#7 (0) {
        ...
      }
      [4] =>
      }
    }
    public $title =>
    string(16) "Everyday Italian"
    public $author =>
    string(19) "Giada De Laurentiis"
    public $year =>
    string(4) "2005"
    public $price =>
    string(5) "30.00"
  }
}

XML元素内容中不能有这些特殊字符:< > &,但可以使用它们的实体编码字符:
&lt; &gt; &amp; &apos; &quot; 替换< > & ' "

DTD(document type definition)介绍

  • DTD是XML的一部分,他用来给XML定义一种格式规范,比如自定义一种标签
  • DTD用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。是XML文档中的几条语句,用来说明哪些元素/属性是合法的以及元素间应当怎样嵌套/结合,也用来将一些特殊字符和可复用代码段自定义为实体。
  • DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。

内部DTD

这是我们在XML内部自己定义的DTD:

<?xml version="1.0"?>
<!DOCTYPE note [<!--定义此文档是 note 类型的文档-->
        <!ELEMENT note (to,from,head,body,end)><!--定义note元素有四个元素-->
        <!ELEMENT to (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
        <!ELEMENT from (#PCDATA)><!--定义from元素为”#PCDATA”类型-->
        <!ELEMENT head (#PCDATA)><!--定义head元素为”#PCDATA”类型-->
        <!ELEMENT body (#PCDATA)><!--定义body元素为”#PCDATA”类型-->
        <!ELEMENT end (#PCDATA)><!--定义end元素为”#PCDATA”类型-->
        ]>
<note>
    <to>F12</to>
    <from>is</from>
    <head>very</head>
    <body>Handsome</body>
    <end><![CDATA[This is a CDATA section. It can contain any text data, including special characters like <, >, and &.]]></end>
</note>

这是一些DTD的格式说明:

PCDATA

PCDATA的意思是被解析的字符数据,是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开,被解析的字符数据不应当包含任何&,<,或者>字符,需要用它们的实体编码来替换

CDATA

CDATA意思是字符数据,CDATA 是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开,使用方法是<![CDATA[内容]]>

<?php 
  libxml_disable_entity_loader(false);
  $xmlContent = file_get_contents("./xml.xml");
  $dom = new DOMDocument();
  $dom->loadXML($xmlContent, LIBXML_NONET|LIBXML_DTDLOAD);
  $cred = simplexml_import_dom($dom);
  var_dump($cred);
?>

# 运行结果
class SimpleXMLElement#2 (5) {
  public $to =>
  string(3) "F12"
  public $from =>
  string(2) "is"
  public $head =>
  string(4) "very"
  public $body =>
  string(8) "Handsome"
  public $end =>
  class SimpleXMLElement#3 (0) {
  }
}

可以看到CDATA中的内容没有被解析

外部DTD

引入外部DTD文件

<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD文档的URL"(网络上的DTD文件)
示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root-element SYSTEM "test.dtd">
<note>
  <to>F12</to>
  <from>is</from>
  <head>very</head>
  <body>Handsome</body>
</note>
<!ELEMENT to (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)><!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)><!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)><!--定义body元素为”#PCDATA”类型-->

DTD属性

属性声明语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
DTD实例:
<!ATTLIST example suxin CDATA "F">
XML实例:
<example suxin="F" />
这个属性跟html标签中的属性是一个意思
属性类型选项:

DTD实体

  1. 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
  2. 实体引用是对实体的引用。
  3. 实体可在内部或外部进行声明

可以将DTD实体理解为一个变量

一般实体

<!ENTITY 实体名称 "实体内容">
引用方法:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
    <!ENTITY abc "F12">
]>
<test>&abc;</test>

参数实体

<!ENTITY % 实体名称 "实体内容">
引用方法:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
    <!ENTITY %abc "F12">
%abc
]>
<test>test</test>

一般实体在代码块中引用通过&名称进行引用,而参数实体是通过%名称进行引用的,参数实体直接在DTD实体中就引用了

外部实体

外部实体,用来引入外部资源。有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机。

<!ENTITY 实体名称 SYSTEM "URI/URL">
或者
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
    <!ENTITY file SYSTEM "file:///etc/passwd">
]>
<author>&file;</author>

外部实体的引用是支持协议的,如http,file等,如果是php的话,也支持伪协议等等

内部实体

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
    <!ENTITY abc "F12"> #这个就是内部实体,其实和上面的一般实体一样
]>
<test>&abc;</test>

XML注入

XML注入的原理跟SQL注入的原理差不多,都是闭合以达到执行语句的效果,一个简单的例子

<?php

libxml_disable_entity_loader (false);
$input=$_POST[0];
$xmlfile = "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<bookstore>                                              
    <book category='COOKING'>        
        <title>Everyday Italian</title>        
        <author>$input</author>                
        <year>2024</year>                                   
        <price>30.00</price>                               
    </book>                                           
</bookstore>";
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
var_dump($creds);

?>

这里我们可以控制$input的内容,post一个0=F12
如果我们这样传,0=F12</author><name>hacker_F12</name><author>
可以看到成功注入name标签

防御建议

对传入的数据做个转义过滤就行了

XXE攻击

外部实体注入

实际上就是利用DTD搭配协议来进行攻击

<?php

libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds;

?>


可以看到读到了F12 is very handsome

内部实体注入

主要是利用外部实体加参数实体,通过报错带出数据,一张图即可理解

标签:XML,SimpleXMLElement,class,实体,DTD,详解,XXE,public,注入
From: https://www.cnblogs.com/F12-blog/p/17999070

相关文章

  • Kali学习笔记-04-利用SQLmap实现SQL注入
    Kali学习笔记-04-利用SQLmap实现SQL注入KaliLinux网络安防一、SQLmap简介SQLMAP是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL和SQL注入漏洞,其广泛的功能和选项包括数据库指纹,枚举,数据库提权,访问目标文件系统,并在获取操作权限时执行任意命令。SQLMAP是开......
  • [office] 财务必须熟练使用的15个函数公式,超详细参数详解+举例!
    又到了咱们的Excel技巧课堂分享时刻,一名会计,势必要成为一名表格高手,才能在职场中乘风破浪。不然一个公式参数设置都要10分钟,按时下班怕是不可能,升职加薪更是无望了!今天蛙蛙给大家分享的就是Excel学习逃不开的函数公式,以参数详解+举例的方式,给大家讲讲咱们经常用到的15个公式。一定......
  • sql之窗口函数详解
    官方地址https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html窗口函数:也可以被称为OLAP函数或分析函数。窗口......
  • CSS规则集详解
    整个结构称为规则集(规则集通常简称规则),注意各个部分的名称:选择器(Selector)HTML元素的名称位于规则集开始。它选择了一个或多个需要添加样式的元素(在这个例子中就是 <p> 元素)。要给不同元素添加样式,只需要更改选择器。声明(Declaration)一个单独的规则,如 color:red; 用来指......
  • sql注入
    如何检测SQL注入漏洞您可以使用一组针对应用程序中每个入口点的系统测试来手动检测SQL注入。为此,您通常需要提交:单引号字符,并查找错误或其他异常。'一些特定于SQL的语法,这些语法的计算结果为入口点的基本(原始)值和不同的值,并在应用程序响应中查找系统差异。布尔条件,例如和,......
  • 操作系统命令注入
    什么是操作系统命令注入?OS命令注入也称为shell注入。它允许攻击者在运行应用程序的服务器上执行操作系统(OS)命令,并且通常会完全破坏应用程序及其数据。通常,攻击者可以利用操作系统命令注入漏洞来破坏托管基础结构的其他部分,并利用信任关系将攻击转移到组织内的其他系统。有用......
  • 详解云桌面3种主流架构
    本文简要介绍下云桌面(云电脑)的3种主流架构:VDI、IDV和VOI,概念、原理和区别,欢迎阅读。云桌面作为桌面办公和云计算融合发展的产物,在一定程度上替代了传统的办公形式。目前阿里云、华为云、移动云、电信云,还有华三、锐捷、中兴等互联网大厂都在积极布局该领域。 云桌面的技术原......
  • 7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析
    本文给大家介绍一下在SpringBoot项目中如何集成消息队列RabbitMQ,包含对RibbitMQ的架构介绍、应用场景、坑点解析以及代码实战。最后文末有免费领取龙年红包封面以及腾讯云社区答题领奖福利,欢迎大家领取。我将使用waynboot-mall项目作为代码讲解,项目地址:https://github.co......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    前言Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交......
  • 【机器学习】常见算法详解第2篇:KNN之kd树介绍(已分享,附代码)
    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻辑回归,决策树算法,集成学习,聚......