码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Web漏洞探索】外部实体注入漏洞


    文章目录

        • 一、什么是外部实体注入漏洞
        • 二、外部实体注入漏洞成因
          • 内部实体声明
          • 外部实体声明
          • 参数实体声明
        • 三、漏洞攻击利用手法
          • 有回显
            • DTD外部实体声明
            • DTD实体声明
            • DTD参数声明
            • 内网端口扫描
            • 远程代码执行
            • 读取任意文件
          • 无回显
            • Out-of Band检测
            • 利用DNSLog检测
          • 拒绝服务
        • 四、修复以及预防
          • 禁用外部实体的方法
          • 过滤用户的输入
          • 禁用自定义的DTD
        • 五、附录

    请添加图片描述

    一、什么是外部实体注入漏洞

    外部实体注入漏洞XXE(XML External Entity Injection)也就是XML外部实体注入,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞发生在应用程序解析XML输入时,XML文件的解析依赖libxml库,而libxml 2.9以前的版本默认支持并开启了对外部实体的引用,服务端解析用户提交的XML文件时,未对XML文件引用的外部实体(含外部一般实体和外部参数实体)做合适的处理,并且实体的URL支持file://和ftp://等协议,导致可加载恶意外部文件和代码,造成任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等危害。

    二、外部实体注入漏洞成因

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

    内部实体声明

    DTD内部声明:
    DTD内部实体声明:

    
    ]>
    &xxe;
    
    • 1
    • 2
    • 3
    • 4

    外部实体声明

    DTD外部引用:
    DTD外部实体声明:

    
    ]>
    
        &xxe;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    
     ]>
    &xxe;
    
    • 1
    • 2
    • 3
    • 4

    参数实体声明


    
    
    ]>
    
        login
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    三、漏洞攻击利用手法

    有回显

    DTD外部实体声明

    直接通过DTD外部实体声明

    
    
    ]>
    &test;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    DTD实体声明

    通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明

    
    ]>
    &test;
    
    //而http://test.com/evil.dtd内容为
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    DTD参数声明

    通过DTD外部实体声明引入外部DTD文档,再引入外部实体声明

    
    ]>
    %test;
    
    // http://test.com/evil.dtd文件内容
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    内网端口扫描

    我们也可以使用http URI并强制服务器向我们指定的端点和端口发送GET请求,将XXE转换为SSRF(服务器端请求伪造)。

    
    
    ]>
    
    • 1
    • 2
    • 3
    • 4
    远程代码执行

    有些情况下能够通过XXE执行代码,这主要是由于配置不当/开发内部应用导致的。PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么我们就可以执行命令

    
    
    ]>
    
    &xxe;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    读取任意文件
    ]>
    
    • 1

    无回显

    Out-of Band检测

    对于无回显的XXE,我们需要构建一条带外数据(Out-of Band,OOB)通道来读取数据。思路是:

    1. 攻击者先发送payload1给Web服务器
    2. payload1触发Web服务器,Web服务器向VPS获取恶意DTD,并执行payload2
    3. payload2使Web服务器把结果作为参数来访问VPS上的HTTP服务
    4. 攻击者通过VPS的HTTP访问记录得到结果
    利用DNSLog检测
    
    
    
    %remote;
    %all;
    %send;
    ]>
    &name;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    // evil.xml
    
    ">
    
    
    • 1
    • 2
    • 3
    • 4

    同样的也可以进行FTP协议的外带回显

    拒绝服务

    利用定义实体参数变量,重复引用进行指数级增长,导致解析异常。

    
    
     
     
     
     
     
     
     
     
     
    ]>
    &lol9;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    四、修复以及预防

    禁用外部实体的方法

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

    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    过滤用户的输入

    过滤用户提交的XML数据,参考关键词:和或者SYSTEM和PUBLIC。

    禁用自定义的DTD

    不允许XML中含有自己定义的DTD。

    五、附录

    参考链接:
    https://mp.weixin.qq.com/s/scFsOJsKL2Jxx3hsQVfEdw
    https://mp.weixin.qq.com/s/3CAnOr38wCrWB1-UJYZ5aQ
    https://mp.weixin.qq.com/s/-c0853Vbydmngzch7_aHkg

  • 相关阅读:
    Linux 下 Mysql 的安装与卸载
    复习Day16:栈与队列part03:150.逆波兰表达式求值、239.滑动窗口最大值、260. 只出现一次的数字III
    敢问路在何方
    熬夜拜读349页阿里面试通关手册,成功闯入字节
    【云原生 | 从零开始学Kubernetes】二十四、kubernetes控制器Daemonset
    结构模式匹配(Structural Pattern Matching)(一)匹配序列
    【JavaEE进阶系列 | 从小白到工程师】JavaEE中的迭代器,并发修改异常与增强for循环,一文上手使用
    Github 2024-02-20开源项目日报 Top10
    UE5中置人利用iphone驱动虚拟人面部
    深度学习故障诊断之-使用条件生成对抗网络CGAN生成泵流量信号
  • 原文地址:https://blog.csdn.net/kjcxmx/article/details/125879489
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号