栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

XXE外部实体注入漏洞原理,漏洞利用,简单判断方式,防御方式。

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

XXE外部实体注入漏洞原理,漏洞利用,简单判断方式,防御方式。

目录

1.xml 简单了解

1.1 xml声明

1.2文档类型定义

1.3文档元素

1.4代码详解

2.DTD两种使用方式

2.1内部声明

2.2外部声明

3.DTD实体

3.1内部实体声明引用

3.2外部实体声明引用

3.3参数实体声明引用

4.XXE漏洞原理

5.XXE漏洞利用

5.1读取本地文件

 5.2读取系统文件

5.3内网IP探测

5.4内网端口探测

5.5无回显读取文件

6.如何检测XXE漏洞

6.1人工

6.2工具

7.如何防御XXE

7.1使用开发语言提供的禁用外部实体的方法

7.2过滤用户提交的XML数据


写这篇文章目的就是想认真理理XEE这个漏洞,因为在学习过程中,听过老师的一些课,看过很多文章解释,我觉得讲的都是很官方话或者专业用语,对于初学者理解很难,可能我理解能力不够哈。以下内容仅仅是我个人理解,以及我个人的比喻,比喻可以让你更好理解这个东西,这是我学习的一个方法,可是使的抽象的东西变得比较具体一些。

1.xml 简单了解

XXE这个漏洞的理解,首先我们了解xml文档,因为该漏洞就是由xml文档引起的

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

这个是大家搜索xml时候出现的专业解释,那我简单粗暴理解就是来传输数据的,不过有自己的格式,就跟文章一样,有标题,有正文,有前言,有目录等等。文章是汉字,xml是代码而已。那么xml的格式是什么样子呢,它比写文章简单,只有三个部分,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。接下来我们介绍这个三个部分干什么的。

1.1 xml声明

就是一个说明,简单介绍自己的,版本信息咯,还有编码信息,一般简单,就像文章标题,反正都得有,就和我一样出门必须的化妆,不然不能见人,哈哈哈,开个玩笑。

1.2文档类型定义

这个就是我们的重点,也是漏洞产生的地方,它有一个简称叫DTD,功能已经说明了文档类型定义,它会定义文档会出现那些子元素、父元素、子元素数据类型、实体等等。!DOCTYPE note 这个note就是父元素,在下面的文档元素里面出现了    ,子元素就是note括号里面就是子元素to,from,heading,body。文档元素子元素是在父元素里面的。子元素数据类型#PCDATA,元素格式都一样,就像南天门左右护法,只不过右护法多了一个长枪。有DTD会让你的xml文档更加规范好看,就跟化妆一样,DTD可以让你有一个正确的化妆顺序,呈现完美容颜,而不是所有化妆品堆在脸上,那你就是风华绝代的石榴姐了。

1.3文档元素

当你有个DTD的时候文档元素呈现就会很规范,那么在子元素中间的,比如John可以认为是xml文档的正文了。

1.4代码详解
  1. 
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ]>
    
    Tove
    Jani
    Reminder
    Don't forget me this weekend
    

2.DTD两种使用方式

2.1内部声明


  
  
  
  
]>

  George
  John
  Reminder
  Don't forget the meeting!

2.2外部声明



George
John
Reminder
Don't forget the meeting!

note.dtd文件内容是





3.DTD实体

看到实体这两个词了,和我们漏洞有点关系了,很多人不知道实体具体代表的是啥,专业解释就是DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量,也可以内部实体声明或外部实体引用,具体先看一个代码。

3.1内部实体声明引用



]>
 
&writer;&right;

实体总结就是产生一个变量 ,定义一个而变量,上述代码中 writer ,right称为实体名,大家可以理解就是一个变量名。“Bill Gates”,"School"这个就是实体内容,也就是变量值。那么这个过程说白了,就是在DTD里面产生了一个变量。将该变量名放入到元素标签中间,就相当于使用该变量了。这种称之为引用实体,和变量使用还是有一点区别,格式:&+实体名+;。具体可以看上面代码,上面代码是内部实体声明

3.2外部实体声明引用



]>
&writer;&right;

外部实体引用就是DTD里面的变量值不是直接在DTD里面给与了,而是需要更加url寻找,寻找之后才能获取变量值。外部实体引用关键词就是SYSTEM.会在system后面放入变量值的url。这里URL还可以使用其他协议,各个脚本支持协议如下。外部实体引用我称之为将外面的变量值引进来。这个过程如果处理不好就会引进坏人的。

3.3参数实体声明引用

参数实体的实体名前面是有一个%号的,那么引用参数实体的时候需要在dtd里面 其他实体引用在xml文档内。下面的write和right就是一个参数实体,她们的引用格式%+实体名+;。而且在DTD里面进行引用,如果你想在外面引用得有一个过渡。bb就是。




   %write; 
   %right;                                               
]>
&bb;


---------------------------------
en.dat里面内容是

4.XXE漏洞原理

现在我们再来说说XXE漏洞原理就好理解了,某些应用程序允许XML格式的数据输入和解析,因为支持了外部实体的引用,在引用过程中没有做好防范措施,引进了恶意代码,并成功执行,被攻击者进一步利用,那么就产生了危害。

5.XXE漏洞利用

5.1读取本地文件

读取到网站目录下aa.txt文件内容

 



]>

&xxe;

 5.2读取系统文件

读取window系统文件


 ]>
&goodies;

读取linux系统文件



]>
&f;

使用pikachu靶场,如果你是才开始学习渗透的可以在本地搭建一下这个靶场,还有DVWA可以帮助自己对于漏洞的理,也可以在虚拟机里面使用docker镜像搭建靶场,


 ]>
&goodies;

靶场搭建参考链接:web渗透靶场(pikachu,DVWA)本地搭建环境配置_dreamthe的博客-CSDN博客

5.3内网IP探测

这里我是开了一台虚拟机,开启了http服务。对其进行内网IP和端口探测 ,得到的数据进行base64编码,记得进行解码。可以利用bp软件进行重放,可以对于ip和端口进行遍历


 ]>
&goodies;

5.4内网端口探测

 ]>
&goodies;

将端口变成15就会得到如下内容,因为没有开发15端口。

5.5无回显读取文件

如果页面没有任何显示的情况下,按照上面的思路读取文件是不行的,那么我们就反向链接,第一步将aa.txt文件内容存入file实体里面,第二步访问外部1.dtd,第三步将file里面内容发送给攻击者。


 


%dtd;
%send;
]>


其中1.dtd的内容如下
"
>
%all;

6.如何检测XXE漏洞

6.1人工

看数据包里的content-type值,比如text/xml ,application/xml.

修改content-type的值 看返回

看传输的数据是否是下面格式

 

6.2工具

这里就不多讲,工具可以自己搜搜。

7.如何防御XXE

7.1使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader(true);
 
JAVA:
documentBuilderFactory dbf =documentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
 
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))


7.2过滤用户提交的XML数据

关键词:

下一篇:文件上传漏洞攻击与防御总结_dreamthe的博客-CSDN博客

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531563.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号