WEB应用(十七)---XXE(XML外部实体漏洞)

什么是XML (Extensible Markup Language)

一种类似于HTML(超文本标记语言)的可扩展标记语言,可以用来标记数据、定义数据类型。XML语言没有预定义的标签,允许用户自定义标签和文档结构,XML 被设计用来传输和存储数据。

下面去学习XML的文档结构(怎么写):

  1. XML声明
  2. DTD文档类型定义(可有可无),用来约束一个XML文档的书写规范。
  3. 文档元素
<!-- 声明版本,编码格式 -->
<?xml version="1.0" encoding="UTF-8"?>

<!-- 两个主机进行传输数据需要规范格式,当然与你自己进行交流就可以不需要 -->
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>

<!-- 这里怎么写没有限制 -->
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note> 

 DTD的基本语法 (Document Type Define 文档类型定义)

基础语法

<!ELEMENT 元素名 类型>

内部定义

<!DOCTYPE 根元素[

    元素声明

   <!ELEMENT 元素名 类型>
]>     

外部实体

在DTD中定义外部实体,实体即为标签里的值,上面的都是内部实体,现在是外部实体,定义外部实体,就需要加上SYSTEM

<!ENTITY 实体名SYSTEM "file:///文件路径" >

这里就产生了漏洞利用

xxe是一个外部实体(ENTITY 的中文意思是实体),实体的值是来自于外部文件的,构成XML文件的外部实体漏洞。

下面我们还是通过代码的形式来了解漏洞,同时了解XML这门语言

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE Person[
<!-- 这里就是一个内部实体,username是变量,也是实体名,张三丰即是值 -->
<!ENTITY username "张三丰"> 
<!-- 这里是一个外部实体,file是一个变量,变量的值是文件的内容 -->
<!ENTITY file SYSTEM "file:///C:/Windows/win.ini">
<!-- 但是我们在使用浏览器去访问的时候,没有将该文件的内容显示出来,这是出于安全的考虑,浏览器没有这样的功能 -->
]>     
<!-- 那么我们就只能通过代码来解析文件数据 -->
<Person sex="男">
    <name>&username;</name>
    <resume>&file;</resume>
    <age>101</age>
    <address>
        <city>十堰市 </city>
        <distinct>武当山</distinct>
    </address> 
    <job>武当派掌门人</job>
</Person>

问题又来了,我们自己不会写如何去解析文件的代码,怎么办嘞,看别人是怎么写的,这个别人就是pikachu靶场

先去查看xxe漏洞的源代码,路径

 这里我加了注释,细细理解

 

 这里已经给我们写好了payload,记得改一下

 

成功执行

 

上面是外部实体,下面是内部实体,当然外部实体是有危害性的 

 

我们再详细的说说XXE漏洞 

全称是“xml external entity ”,即XML外部实体注入

攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行

服务端接收和解析来自用户端的XML数据,而没有做严格的安全控制,从而导致xml外部实体注入

那怎么去防御

理论上的防御措施 (靠xml文件本身和加载xml文件的函数)

禁用外部实体

过滤和验证用户提交的xml数据

不允许xml中含有任何自己声明的dtd

实践有效的防御措施(加载xml的函数)

配置xml parser(xml解析器)只能使用静态dtd,禁止外来引入

 

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值