Xml 外部实体注入(xxe)

XML External Entity

漏洞简介:

  • XML介绍
    • i. 可扩张标记语言,是一种用于标记电子文件使其具有结构性的标记语言
    • ENITITY 实体
    • 在一个甚至多个XML文档中频繁使用某一条数据,我们可以预先定义一个这条数据的别名,即作为一个ENITITY,然后在这些文档中需要该数据的时候调用它
    • XML定义了两种类型的ENTITY,一种在XML文档中使用,另一种作为参数在DTD文件中使用
    • ENTITY 语法
  • 危害
    • Xml ENTITY 可以读取外置文件,其实entity作用相当于定义全局变量和引用外部文件
    • 在一般的异步网站都会有异步数据与服务器的交互,一般传送数据为json但如果将传送的数据格式改为xml。有很大的可能服务器会解析你异步上传的xml脚本,就可以执行任何想干的事,比如读取任意文件、执行系统命令、探测内网端口、攻击内网网站等
  • Xml攻击类型
    • Xxe 根据服务器回不回显来区分类型
      1. 对于传统的XXE来说,要求有一点,就是攻击者只有在服务器有回显或者报错的基础上才能使用XXE漏洞来读取服务器端文件
      2. 如果服务器没有回显,只能使用Blind XXE漏洞来构建一条带外信道提取数据。

漏洞代码分析

  • 以下是php的简单的后台代码,目的是为了演示XXE (有回显)

    • 定义一个xml
    • 引入外部实体,代码中有执行任意读取文件的payload
    • 利用php解析xml文件
    • 命令成功执行
  • 以下代码是演示 blind xxe 无回显的xml外部注入
    • Target_server.Php
    • Attacker_server.php
    • 代码逻辑
    • 首先,Target_server.php 文件在被攻击的服务器上,通过构造xml的文件,创建一条通道连接攻击者的页面
    • 这里的“通道“
    • 对攻击者页面的访问,并且传递信息,这里的flag后不止可以是字符串,还可以是被攻击者服务器上的文件

漏洞演示

  • 攻击一:读取任意文件
    • Payload :<!ENTITY xxe SYSTEM "file:///E:/php/flag.txt" >]>
  • 攻击二:探测内网端口
    • Payload:<!ENTITY xxe SYSTEM "http://127.0.0.1/8080" >]>
  • 攻击三:执行系统命令
    • Payload:<!ENTITY xxe SYSTEM "expect://id" >]>
    • 在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令
  • 攻击四:无回显的XXE外部实体注入
    • 环境:本次攻击者服务器和目标服务器皆为本地,只起演示作用。
    • Payload:分两部分
      • 利用构造后的xml欺骗服务器,xml中含有一条‘通道‘,连接攻击者服务器
      • 准备好接收目标服务器上发送过来的数据
      • 可以发现,服务器上不会回显什么信息,但是通道已经建立
      • 根据攻击者页面上的代码
      • 此时应该创建一个文件记录数据
      • 可见,文件已经成功在攻击者服务器上创建,且数据成功写入

修复方案

  • 方案一:使用开发语言提供的禁用外部实体的方法
    • PHP: libxml_disable_entity_loader(true);
      • 提醒:Php中的simplexml_load_file的xml文件读取组件存在该漏洞
  • 方案二:过滤用户提交的Xml数据
    • 关键词:<!DOCTYPE和<!ENTITY,SYSTEM和PUBLIC

总结

  • 以上测试环境为 PHP-5.4.45 在PHP 7上测试却不成功,由此猜测PHP7上simplexml_load_file 是默认不解析外部实体的(猜测)
  • 对于web或者是pc上,xml始终扮演着重要的角色,但在其高效的使用中,难以避免的出现一些安全问题,而这类漏洞往往带来不可估量的危害,换句话说,只要用户能够触碰的xml都可能存在危害程度或大或小的漏洞。所以在开发的时候我们要严格的处理xml,在用户可控的xml里进行过滤或者是直接禁用外部实体。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据