XXE篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
0x01 Brief Description
XXE(XML External Entity) XML外部实体攻击也是常见的web漏洞之一,在学习这个漏洞之前有必要了解一下xml,可以参考w3c的基本介绍,http://www.w3school.com.cn/x.asp
xml(Extensible Markup Language)可扩展性标记语言,被设计用来传输和保存数据。xml也是一种树形的结构,且不同于html,它的所有元素都必须要关闭标签,且xml的标签对大小写敏感,元素的属性值必须加引号括起来,拥有正确语法的 XML 被称为“形式良好”的 XML。通过 DTD 验证的 XML 是“合法”的 XML。
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
DTD可以理解为提供了xml格式的一个描述和限定。这个DTD呢可以来自本身的xml文件中,也可以来自外部。
xml实体呢 则相当于内容占位符,用于内容转义,代表一些重复的或无法通过键盘输入或与xml 规范保留字符相冲突的字符数据。xml的实体类型大概有以下四种:
1.字符实体
2.命令实体
3.外部实体
4.参数实体
xml实体注入攻击主要是利用了外部实体进行攻击。
xml的原意是让这样使用,也是一般程序员是这么使用
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPe root [
<!ENTITY outfile SYSTEM "outfile.xml">
]>
<root><outfile>&outfile;</outfile></root>
然后呢,攻击者一般是通过xml的外部实体结合各种协议来读取服务器上的文件。
像下面这样:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY content SYSTEM "file:///etc/passwd">
]>
<root><foo>&content;</foo></root>
这样就可以利用file协议进行任意文件读取。
当然还有其它的协议例如gopher 、php的filter协议、 java的jar协议等进行攻击。
0x02 Reproduce the vulnerability
构造一个上传页面并将xml文本提交给后台服务器处理,代码如下
<form method="POST" action="">
<textarea name="keyword" value="" style="width: 500px; height: 300px"></textarea>
<input type="submit" value="submit">
</form> <?php
$keyword = @$_POST['keyword'];
$dom = new DOMDocument();
$dom->loadXML($keyword, LIBXML_NOENT);
echo $dom->saveXML();
参考了rickgray的代码但有不同,自己在测试的时候发现低版本的php默认允许加载外部实体,而高版本的php是不加载外部实体的,要使用LIBXML_NOENT参数才可以解决这个问题,参考了stackoverflow的问题。
更新:XML外部实体的解析,和php版本并无关系,而是和编译时的libxml库版本有关。
我们可以看到,通过实例化一个DOMDocument对象,然后使用loadXML去加载xml,如果我们的提交的xml是这样,那么就会通过file协议去读取passwd文件,如下图
0x03 Vulnerability impact
xxe能做什么
1.文件读取
2.命令执行
3.内网探测和端口扫描
4.文件上传(java应用中的jar包上传)
5.命令执行(php安装了Expect的扩展)
6.dos攻击
0x04 漏洞发掘及利用技巧
白盒测试:查找处理xml的函数,查看处理的xml是否来自用户的输入,即是否可控
黑盒测试:查找可能存在xml处理的入口,例如某些邮件转发服务器支持用户自定义RSS推送功能可以,可以加载外部的xml进行攻击。SVG格式的图片在光栅化的过程导致的xxe。一些系统支持xml的导入,一些支持在线预览的应用例如docx中插入恶意xml进行xxe攻击等。。。
0x05 Avoid And Defense
禁用外部实体或者对外部实体的内容进行过滤
0x06 Reference
1.http://rickgray.me/2015/06/08/xml-entity-attack-review.html
2.https://security.tencent.com/index.php/blog/msg/69
0x07 不定期更新
1.https://hawkinsecurity.com/2018/03/24/gaining-filesystem-access-via-blind-oob-xxe/
XXE篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题的更多相关文章
- xss篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 0x01 跨站脚本攻击漏洞(XSS),是客户端脚本安全中的头号大敌,owasp top10 屡居榜首,由于攻击手法较多,开发者水平不一 ...
- CSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
0x01 Brief Description csrf 跨站伪造请求,请求伪造的一种,是由客户端即用户浏览器发起的一种伪造攻击.攻击的本质是请求可以被预测的到. 在了解csrf攻击之前,需要了解浏览器 ...
- SSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.( ...
- sqli篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
前言 最早接触安全也是从xss攻击和sql注入攻击开始的. 和xss一样屡居OWASPtop10 前三名的漏洞,sqli(sql Injection)sql注入攻击也是web安全中影响较大和影响范围较 ...
- Java 审计之XXE篇
Java 审计之XXE篇 0x00 前言 在以前XXE漏洞了解得并不多,只是有一个初步的认识和靶机里面遇到过.下面来 深入了解一下该漏洞的产生和利用. 0x01 XXE漏洞 当程序在解析XML输入时, ...
- Python开发【第十四篇】:Web框架本质
Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- 如果这篇文章说不清epoll的本质,那就过来掐死我吧!
转载自:https://www.toutiao.com/i6683264188661367309/ 目录 一.从网卡接收数据说起 二.如何知道接收了数据? 三.进程阻塞为什么不占用cpu资源? 四.内 ...
- 构建后端第6篇之---java 多态的本质 父类引用 指向子类实现
张艳涛写于2021-2-20 今天来个破例了,不用英文写了,今天在家里电脑写的工具不行,简单的说 主题是:java多态的原理与实现 结论是:java的多态 Father father= new Son ...
- 关于C++对汉字拼音的处理——终结篇
以前写过了3个博文,都是关于汉字转拼音的,后来发现都不是很“完美”的解决方案,第一个和第二个利用的unicode编码的范围进行确定汉字的拼音,但是难免有遗漏,这个在后面的实践中发现的,后来第三个方法是 ...
随机推荐
- 7-ajax的同步和异步?
同步和异步统一根据send()执行的位置来实现分割逻辑同步:1.send()后统一不会被执行,直到http事务完成之后才会之后后续逻辑.2.堵塞send()方法的逻辑.异步:1.send()后面照样执 ...
- Asp.Net操作WebServices
最近在看一些关于webServices的资料,做了一个下例子整理一下,主要包括.net平台下创建services服务.后台访问和前端Ajax访问三部分. 一.创建webServices服务. 1.打开 ...
- Wpf 数据绑定简介、实例1
简介:1.WPF绑定使用的源属性必须是依赖项属性,这是因为依赖项属性具有内置的更改通知支持,元素绑定表达式使用了Xaml扩展标记, WPF绑定一个控件是使用Binding.ElementName, 绑 ...
- 关于mtk Android打开串口权限问题
最近在做一个测试串口读写回路的APK,jni代码部分遇到一个小小问题: fd = open(path_utf, O_RDWR);返回值是-1,要么就是权限问题,要么就是文件不存在所以需要打印错误信息, ...
- asp.net 真正实现完全跨域单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. asp.ne ...
- 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
3.5.2 字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就 ...
- Java学习----运算符与表达式
一.运算符 1.算术运算符 + - * / % ++ -- public class Test7 { public static void main(String[] args) { ...
- FMDB警告Warning: there is at least one open result set around after performing的问题
FMDB操作sqlite的时候总是报警告Warning: there is at least one open result set around after performing,后来发现是执行查询 ...
- 发一个自己写的php框架
这个框架是我在学习php初期练手写的,现在分享出来希望对初学者有一定帮助. 目录结构:app:网站系统目录 ---common:网站配置目录 ---tpl:网站模板目录 ---log ...
- java常用用代码
/** *Java获取IP代码 */ import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.ev ...