zoukankan      html  css  js  c++  java
  • xxe漏洞的学习与利用总结

    前言

    对于xxe漏洞的认识一直都不是很清楚,而在我为期不长的挖洞生涯中也没有遇到过,所以就想着总结一下,撰写此文以作为记录,加深自己对xxe漏洞的认识。

    xml基础知识

    要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。

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

    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 是不会被解析器解析的文本。

    DTD(文档类型定义)

    DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

    DTD 可以在 XML 文档内声明,也可以外部引用。

    1,内部声明: 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): 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)>
    

    DTD实体

    DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用。


    实体又分为一般实体和参数实体
    1,一般实体的声明语法:
    引用实体的方式:&实体名;
    2,参数实体只能在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,外部实体声明:
    完整实例:

    <?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>
    

    在了解了基础知识后,下面开始了解xml外部实体注入引发的问题。

    XXE的攻击与危害(XML External Entity)

    1,何为XXE?
    答: xxe也就是xml外部实体注入。也就是上文中加粗的那一部分。

    2,怎样构建外部实体注入?
    方式一:直接通过DTD外部实体声明
    XML内容

    方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
    XML内容:

    DTD文件内容:

    方式三:通过DTD外部实体声明引入外部实体声明
    好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明
    具体看例子,XML内容

    dtd文件内容:

    3,支持的协议有哪些?
    不同程序支持的协议如下图:

    其中php支持的协议会更多一些,但需要一定的扩展支持。

    4,产生哪些危害?

    XXE危害1:读取任意文件

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

    另外,数据不回显就没有问题了吗?如下图,

    不,可以把数据发送到远程服务器,

    远程evil.dtd文件内容如下:

    触发XXE攻击后,服务器会把文件内容发送到攻击者网站

    XXE危害2:执行系统命令

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

    XXE危害3:探测内网端口

    该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

    XXE危害4:攻击内网网站

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

    如何防御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。

    最后

    通过本次对XXE的总结,认真了解了XML基础知识,XXE的攻击方式与及防御方案。

    参考资料

    1,未知攻焉知防——XXE漏洞攻防
    2,XXE注入攻击与防御
    3,DTD教程

  • 相关阅读:
    saltstack(master迁移)
    saltstack(主机改名)
    saltstack-部署
    redis部署
    lvs+keepalived
    android适应屏幕
    Android 网络编程
    使用pdb调试python
    python zookeeper 学习笔记
    Python 守护进程
  • 原文地址:https://www.cnblogs.com/r00tuser/p/7255939.html
Copyright © 2011-2022 走看看