专栏首页漫流砂XXE攻击原理研究

XXE攻击原理研究

XMLExternal Entity

附上Owasp对于XXE的相关说明

https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing

XXE 翻译过来是XML外部实体,XXE攻击一般是指XXE注入攻击

XXE 攻击的是XML这种标记格式,理论上所有XML进行配置或者作为传输的应用程序都会受到这种攻击

在2017年OWASP在Top 10 中将XXE攻击列为第四名

从此国内引发了XXE学习的热潮,一开始我并不感冒,因为这不是一个新的漏洞,在《黑客攻防技术宝典 WEB实战篇》中已经包含过这种攻击方式,在《白帽子讲web安全》中只是一笔带过

所以我并没有因为这个而打乱自己的学习计划,直到最近和Hr 聊天的时候,他们涉及到了这个话题,由此引发今天的这篇文章!

XML

在介绍攻击方法之前还是要介绍一下我们的“被害方”XML

http://www.w3school.com.cn/xml/index.asp

上面是一个学习XML的网站,大家可以学习一下XML的表现和传递数据的形式

可以看到是一种树状结构,与HTML类似,表示方法都是在两个标签中表示数据

漏洞成因

与SQL注入,XSS的漏洞成因很相似,都是通过注入恶意字符,改变网站原本意图,从而达到某些目的。

在XSS防御的时候,防御方法就是把类似 < > “ 等字符转化为HTML实体,就是像 &lt; 这种形式,从而规避由恶意输入导致的用户资产损失。

XML为了保证自身的结构不被破坏,所以约定在 数据段使用 < & 都是非法的,如果想要使用都要替换为相应的实体字符

从此引出 XML实体(DTD实体)

http://www.w3school.com.cn/dtd/dtd_entities.asp

在我看来,XML实体其实也就是其他语言中说的变量,准确来说可能更像是全局变量,这样说大家可能更好的理解

从上面的图片,大家可以看出如何定义一个外部实体,并且给它“赋值”

最后就是在XML中如何调用它

<author>&writer;&copyright;</author>

这种调用方式和php中的变量差不多,

writer的值如果是“aaaa”,copyright的值如果是"bbbb",

最终的返回值就是 aaaabbbb

重点来了!!!

很多程序使用 XML作为传输格式,导致我们可以修改参数,提交任意XML,从而导致定义任何实体,并且做引用。

遗憾的是XML外部实体能做的事还挺多,可以读取文件,可以发起网络请求等等,我就以读取文件作为危害点来进行简单的讲述吧!

模拟情景

此处我们提交的是一个关键字,之后通过XML传输,最后页面会返回我们的关键字

原本我们提交的应该是<keyword>hahaha</keyword>

然而我们提交的是

<?xml version="1.0"encoding="utf-8"?>

<!DOCTYPE foo [

<!ENTITY filecontent SYSTEM"file:///etc/passwd">]>

<aaa>&filecontent;</aaa>

此时就会造成 /etc/passwd 文件的内容直接赋值给了filecontent

之后再由<aaa>这个标签调用这个变量,把内容显示了出来,从而造成了文件读取


看到这里之前,大家一定要把DTD的那个教程链接看了,其中的内容也就花费你20分钟,当你读完之后再来向下看就会清晰得多了

如果你看完了,这回我再说说DTD

通俗来讲,DTD其实就是给了一个规范,是我们的XML规范化,比如

可以看到这个DTD 用!DOCTYPE来定义了note这个标签的内部内容规范

有四个元素

之后给出了一个真实XML中的实现

看到这里,大家应该已经能够明白DTD的作用以及简单的使用方法了

上面的例子中,DTD是被写入到XML源码中的,也就是通常说的内部文档类型声明,正常的内部文档类型声明没有什么问题

XML中还支持外部文档类型声明,也就是说定义了规则的DTD代码并没有写在XML文件中,可能是因为不想XML的文本太过臃肿或者其他的一些个原因

此时我们只需要在XML中做一条外部引用的语句,如下

对比之前就会发现,这里使用SYSTEM语法来指定了一个外部的文档定义,文档定义的文件名称是note.dtd

下面我们来看看这个文件中的内容有哪些?

可以看到就是之前XML中的那些内容,只不过用一个独立的文件进行了封装而已,并且在XML中进行了引用


看到这里,大家应该已经能够了解XML是如何进行外部文档声明的了

这个时候你在回去看我们之前的那个例子

模拟情景

此处我们提交的是一个关键字,之后通过XML传输,最后页面会返回我们的关键字

原本我们提交的应该是<keyword>hahaha</keyword>

然而我们提交的是

此时就会造成 /etc/passwd 文件的内容直接赋值给了filecontent

之后再由<aaa>这个标签调用这个变量,把内容显示了出来,从而造成了文件读取


基于刚才的知识我们知道了:

提交的数据中首先定义了一个内部文档声明,对foo标签进行了规则的定义,

而对于foo的进行了元素声明(用[ ]扩起来的 )

声明的内容就是我们白色框中的,我们在这个位置添加了payload

这个payload是一个外部实体引用,特征就是SYSTEM

外部实体引用的是/etc/passwd 文件,而不是其他的DTD文件

注意:此处其实是可以很多种协议的,比如file, http, ftp

这些声明赋值给了foo,之后被<aaa>标签打印出来

此时大家应该就可以明白XXE漏洞产生的原因及其简单利用了吧!

-END-

本文分享自微信公众号 - 漫流砂(yidalidemao)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NSE代码生成器 | Nmap 脚本

    可以看到直接生成了发送这个 http 请求的Nmap NSE代码,至于要如何处理返回包,如何判断是否存在漏洞那就是你的事了

    意大利的猫
  • FTP & VBScript & Powershell & Debug 远程传输

    之前我们说过FTP在非交互shell 下会出现没有办法输入密码,导致身份认证过程没有办法完整完成,这里我们就来介绍一下如何变通。

    意大利的猫
  • 提权(六) Dump SAM

    在提权到现在我们分别通过系统的自身功能,还有一些辅助工具,最终又使用一些比如嗅探等边缘策略,接下来我们要硬杠Windows的密码了,通过各种方式来获取windo...

    意大利的猫
  • XML概述3

        无效文档:没有遵守XML规范定义的语法规则。如果开发人员已经在DTD或模式中定义了文档能够包含什么,而某个文档没有遵守那些规则,那么这个文档也是无效的。

    py3study
  • XML语言基本介绍

    怎么解释呢,拿我们平时熟悉的HTML语言来说,HTML就是一种规定了特定标签的语言,而XML语言则没有规定特定的标签(可能有一些基本的?目前我还没有学习到,以后...

    MonroeCode
  • 最近大火的XXE漏洞是什么

    XXE全称是——XML External Entity,也就是XML外部实体注入攻击。漏洞是在对不安全的外部实体数据进行处理时引发的安全问题。

    HACK学习
  • 【面试】找工作必看的十道XML面试题

    XML并不依赖于其他编程语言,与SQL一样是编程人员所必备的技能之一,因此在任何技术工作面试之前准备一些XML问题都是很有意义的。老九君为大家整合了十道有关XM...

    老九君
  • XML+JSON面试题都在这里

    XML+JSON常见面试题 什么是JSON和XML 什么是JSON和XML JSON:JavaScript Object Notation 【JavaScrip...

    Java3y
  • Java简单面试题(XML)

    包括web开发人员的Java面试在内的各种面试中,XML面试题在各种编程工作的面试中很常见。XML是一种成熟的技术,经常作为从一个平台到其他平台传输数据的标准。...

    葆宁
  • XML是历史前进中的怪胎

    人的理性是有限的,甚至拙劣的,但理性中的人却很自负。互联网本身不是被理性事先设计出来的,但是我们总是想在互联网上再次理性设计,XML和区块链都是人类理性自负地结...

    Titan框架

扫码关注云+社区

领取腾讯云代金券