XXE初探

0x00 环境准备工作

  1. 系统环境:
    Ubuntu+Apache+MySQL+PHP的运行环境,其中因为产生xxe漏洞的函数simplexml_load_file是PHP5及以上版本才有,所以PHP的版本有特殊要求。
  2. 脚本代码:
 $value){
	echo $key;
	echo translate($key).$value . "
"; } function translate($str){ switch ($str){ case "name": return "电影名:"; case "brief": return "简介:"; case "time": return "时间:"; } } ?>

将上面的代码保存为xxe.php存放在服务器上面,然后POST传入一段如下XML代码:

xml=

	致命摇篮
	李连杰最新力作
	

得到如下结果:

XXE初探_第1张图片
到此一个含有XXE漏洞的环境就搭建好了。

0x01 前期知识:

漏洞简介:XXE漏洞全称XML External Entity Injection即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

前期准备知识:由于XXE漏洞是由于程序解析XML文档时没有禁止外部实体的加载,所以学习漏洞之前需要先学习XML文档的基本知识,其中重要学习DTD和实体。我的关于XML学习的博客:https://blog.csdn.net/CSDNPM250/article/details/89465613

XXE注入的几种payload:

  • 1、自定义实体引用:
    ]>
    这种方法自定义了一个实体b,该实体的URI是/etc/passwd,那么当引用这个实体的时候,URI的内容就会被取出。
  • 2、使用参数实体:
    %d; ]>
    test.dtd的内容如下:

    这种方法先定义了一个参数实体,参数实体的内容是test.dtd中的内容,然后直接调用这个参数实体,其中test.dtd中有一个自定义实体b,调用了系统文件。那最后的payload等价于:
    ]>
  • 3、引用外部DTD文件:

    其中test.dtd内容同上。这种方法中直接引用了一个外部DTD文件,DTD文件中自定义了一个实体b。

XXE漏洞:

  1. 漏洞利用:当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

  2. 任意文件读取实验:
    1、直接使用自定义实体读取:
    XXE初探_第2张图片
    2、使用参数实体:
    XXE初探_第3张图片
    将test.dtd放在本地服务器,然后远程服务器就会在执行漏洞是调用。
    XXE初探_第4张图片
    3、经过测试发现,好像远程调用dtd是被禁止的。
    XXE初探_第5张图片
    通过远程调用dtd文件,读取passwd文件失败,然后我在远程读取dtd的同时,本地读取一个远程文件包含的元素定义:
    XXE初探_第6张图片
    此时读取passwd文件成功。
    ps:以上的payload都要经过url编码再传入php文件处理。

  3. 在上面的进行任意文件读取中读取的都是text类的文件,当我们要读取php这类脚本文件,要使用php伪协议对其进行编码,否则在读取时里面的‘<’,‘>’等会被当成xml标签解读。其他可用于文件读取的协议:
    XXE初探_第7张图片

  4. XXE之防御:
    1、禁用外部实体:
    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))
    2、过滤关键字符:例如:

你可能感兴趣的:(WEB安全)