渗透测试之XEE[外部实体注入]漏洞 原理 攻击手法 xml语言结构 防御手法

目录

原理

XML语言解释

什么是xml语言:

以PHP举例xml外部实体注入

XML语言结构

面试题目

如何寻找xxe漏洞

XEE漏洞修复域防御

提高版本

代码修复

php

java

python

手动黑名单过滤(不推荐)


一篇文章带你深入理解漏洞之 XXE 漏洞 - 先知社区

原理

  • XXE:XML External Entity 即外部实体 简称XXE漏洞

    • 从安全角度理解成XML External Entity attack 外部实体注入攻击。

    • 由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。


XML语言解释

什么是xml语言:

  • XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

  • XML文档结构包括

  • XML声明

  • DTD文档类型定义(可选)

  • 文档元素

  • 其实XML是一门语言,类似于html,但是后来主要用xml的文档格式来传输数据,但是现在比较新的系统,大家之前传输数据用的是json了。

  • 现在很多语言里面对应的解析xml的函数默认是

    • 禁止解析外部实体内容的,从而也就直接避免了这个漏洞。

以PHP举例xml外部实体注入

  • 以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中

    • 默认是禁止解析xml外部实体内容的

    • 如果你测试用的php中解析xml用的libxml的版本大于了2.9.1

    • 为了模拟漏洞,那么可以通过手动指定LIBXML_NOENT选项开启xml外部实体解析功能。

  • 修改 libxml 版本 PHP版本


XML语言结构

文档结构包含以下三个部分:

  • Json xml 数据 xml攻击数据格式

  • 外部实体注入攻击

  • Xml外部实体攻击

复制代码
内部声明DTD
<!DOCTYPE 根元素 [元素声明]>
引用外部DTD文档
<!DOCTYPE 根元素 SYSTEM "文件名">
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

内部声明实体
<!ENTITY 实体名称 "实体的值">
引用外部实体
<!ENTITY 实体名称 SYSTEM "URI">
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

调用方式:&实体名称;

DTD 也就是攻击代码

我们在做渗透测试 做一个读取文件 证明存在这个漏洞就行了

  • payload如下:
    • 而且你需要掌握的代码就这几行,大家最好能够背下来

    --------------------------------------------------------------------------------------------

    • 声明部分

      DTD攻击载荷部分

      xml部分

复制代码
  <?xml version = "1.0"?>
  <!DOCTYPE note [
      <!ENTITY hacker "lady_killer9">
  ]>
  <name>&hacker;</name>

如何寻找xxe漏洞

  • 抓包查看accept的头是否接收xml
  • 抓包修改数据类型把json改成xml来传输数据

XEE漏洞修复域防御

提高版本

代码修复

php

复制代码
libxml_disable_entity_loader(true);

java

复制代码
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
setFeature("http://xml.org/sax/features/external-general-entities",false)
setFeature("http://xml.org/sax/features/external-parameter-entities",false);

python

复制代码
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

手动黑名单过滤(不推荐)

复制代码
过滤关键词: <!DOCTYPE 、 <!ENTITY SYSTEM 、 PUBLIC
相关推荐
奈落243 小时前
DeepSeek Harness 开源贡献手记:从 Issue 认领到 PR 合入的完整实践
大数据·人工智能·安全·搜索引擎·开源
白帽攻防录4 小时前
SRC 挖洞:Claude Code Action 供应链 RCE 深度复盘,CVE-2026-47751 一个 PR 怎么偷走你所有 CI/CD 密钥
网络安全·ci/cd·供应链安全
xixingzhe24 小时前
正确认知HTTPS:并非万能加密,通信安全需要多层防护
网络协议·安全·https
菩提小狗5 小时前
每日安全情报报告 · 2026-10-06
网络安全·漏洞·cve·安全情报·每日安全
小蒋观天下5 小时前
端侧大模型在安防摄像头部署实操(下篇)|模型量化、推理加速、视频接入与量产调优
大数据·人工智能·算法·安全·机器学习·计算机视觉·ai大模型
学逆向的5 小时前
win32文件系统
网络安全·api·win32
汤姆yu17 小时前
Gemini 4 Argon模型综述:技术、能力与实际使用指南
网络·安全·web安全·ai·大模型
hasty17 小时前
policy.xml 在,不代表策略生效:ImageMagick 补丁给安全配置验收的提醒
xml·mysql·安全
寻林写彡19 小时前
云安全 | Docker 容器逃逸复盘(一):从隔离边界到运行时链路,如何确认自己身处容器
安全·云原生
网络毒刘20 小时前
Manual 模式精修补丁:在 Agent 提案后用最小编辑完成高风险改动
安全·agent·ai编程·cursor