pikachu靶场通关教程(十二)——XXE

发布于 2024-11-24  459 次阅读


一、介绍

XXE,XML External Entity injection,XML外部实体注入漏洞。当网站在解析XML输入时,没有禁止外部实体的加载,导致可以加载外部的恶意文件,从而导致一系列危害。

在这之前,需要了解什么是XML。请看XML 教程 | 菜鸟教程,我这里简单举个例子:

<?xml version="1.0" encoding="UTF-8"?>                      //XML声明,包含XML版本和编码
<site>                                                      //根元素site
  <name>warspitesaiko</name>                                //子元素name
  <url>https://warspitesaiko.cc/</url>
  <logo src="warspitesaiko.ico">warspitesaiko.ico</logo>    //子元素logo和它的属性src
  <desc>向女王展示自己的忠诚!挥舞!手中的利剑!!!</desc>
</site>

一般由声明、根元素、子元素及元素的属性构成。是不是和html很像,确实差不多,不过html的数据重点在呈现网站的外观,而xml则重在传输数据的内容。

可以看到,是可以通过XML传入一些链接数据的,那如果这些点被用于加载外部的payload,那就是漏洞所在的位置了。

二、XXE

既然这里说是接收一个XML的api,那我们随便提交一个XML格式的内容上去。

<data>some data</data>

确认能够解析XML格式的内容之后,就可以出入Payload了,这里随便到百度上找找一大堆。我在WIndows环境下部署的服务,下面的Payload仅在Windows下有效,Linux的同学请自行替换路径。

<!DOCTYPE test [
  <!ENTITY xxe SYSTEM "file:///C:/Windows/System32/drivers/etc/hosts">
]>
<data>&xxe;</data>

这样就实现了本地任意文件读取漏洞,除了file协议,XXE可能还会支持使用比如http、ftp等协议去进行外部引用,只需要将"file:///C:/Windows/System32/drivers/etc/hosts"这个部分替换即可。

三、修复方法

漏洞就这么简单,找到漏洞位置,然后那网上的payload一丢就有了,难点在于怎么找到漏洞,以及如何修复。前者要看个人水平和经验,后者这里简单列出几点:

1.禁用外部实体解析
2.开启用户输入验证
3.启用服务器或应用程序的安全配置
4.使用安全的库、框架和XML解析器

但最终还是开发过程中应该拥有并遵守一些列的代码规范,这样才能尽可能地避免包括XXE等漏洞的产生。

四、后记

这一贴好水,但感觉可以讲的内容确实不多,感觉下一章好像也没什么可以讲的,主要还是难在发现漏洞点上,不过感觉那目录扫描器扫扫应该就能找到一些。

好久没有更新了,毕业工作了好忙,突然想起来这个系列还没有更新完,赶紧爬起来把剩下的三节写了。工作之后从红队变成蓝队了,之后应该会写一些蓝队溯源的靶场内容吧。