zoukankan      html  css  js  c++  java
  • 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数据,防止出现非法内容。

  • 相关阅读:
    flash中网页跳转总结
    as3自定义事件
    mouseChildren启示
    flash拖动条移出flash无法拖动
    需要一个策略文件,但在加载此媒体时未设置checkPolicyFile标志
    Teach Yourself SQL in 10 Minutes
    电子书本地转换软件 Calibre
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes – Page 31 练习
  • 原文地址:https://www.cnblogs.com/coderge/p/XXE-vulnerability-attack-and-repair-suggestions.html
Copyright © 2011-2022 走看看