• XXE漏洞介绍 & XXE漏洞攻击 & 修复建议


    介绍XXE漏洞

    XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是-种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)文档元素。

    常见的XML语法结构如下图所示。

    <!--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>
    

    其中,文档类型定义(DTD)可以是内部声明也可以引用外部DTD,如下所示。

    • 内部声明DTD格式: <! DOCTYPE 根元素 [元素声明] >。
    • 引用外部DTD格式: <! DOCTYPE 根元素 SYSTEM "文件名">。
      在DTD中进行实体声明时,将使用ENTITY关键字来声明。实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在内部或外部进行声明。
    • 内部声明实体格式: <! ENTITY 实体名称 "实体的值">。
    • 引用外部实体格式: <! ENTITY 实体名称 SYSTEM "URI">。

    XXE漏洞攻击

    http请求的POST参数如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE a [
    	<!ENTITY b SYSTEM "file:///c:/kms10.log">
    ]>
    <xml>
    <xxe>&b;</xxe>
    </xml>
    

    在POST参数中,关键语句为file///windows/win.ini",该语句的作用是通过filet协议读取本地文件C:/windows/win.ini, 如图所示。

    好吧我没做出来,因为libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡。如果想做这个实验可以照下面这个链接玩玩。
    https://github.com/vulhub/vulhub/tree/master/php/php_xxe

    XXE漏洞代码分析

    <?php 
    	//libxml_disable_entity_loader(false);
    	$xmlfile = file_get_contents('php://input'); 
    	$dom = new DOMDocument(); 
    	$dom->loadXML($xmlfile); 
    	$xml = simplexml_import_dom($dom); 
    	print_r($xml);
    	$xxe = $xml->xxe;
    	$str = "$xxe 
    ";
    	echo $str; 
    
    ?>
    
    • 使用file_ get contents获取客户端输入的内容。
    • 使用new DOMDocument () 初始化XML解析器。
    • 使用loadXML ($xmlfile) 加载客户端输入的XML内容。
    • 使用simplexml import dom ($dom)获取XML文档节点,如果成功则返回SimpleXMLElement对象,如果失败则返回FALSE。
    • 获取SimpleXMLElement对象中的节点XXE,然后输出XXE的内容。
      可以看到,代码中没有限制XML引入外部实体,所以当我们创建一个包含外部实体的XML时,外部实体的内容就会被执行。

    修复建议

    禁止使用外部实体,例如libxml disable_entity_loader(true) 。
    过滤用户提交的XML数据,防止出现非法内容。

  • 相关阅读:
    201-STM32+Air724UG基本控制篇(阿里云物联网平台)-设备使用物模型Topic上报温湿度数据
    Sentinel Go 核心统计结构滑动窗口的深度解析
    golang sync.Mutex互斥锁的实现原理
    Golang-Scheduler原理解析
    Golang-Channel原理解析
    golang里channel的实现原理
    最长回文子序列
    GO语言的goroutine并发原理和调度机制
    golang 常见问题
    通过js给网页加上水印背景
  • 原文地址:https://www.cnblogs.com/coderge/p/XXE-vulnerability-attack-and-repair-suggestions.html
Copyright © 2020-2023  润新知