热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XXE漏洞总结

一、XML基础知识XML是一种非常流利的标记语言,在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查
一、XML基础知识

        XML是一种非常流利的标记语言,在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。但是,在处理外部实体时,可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感信息,或利用各种方案的网络访问功能来操纵内部应用程序。通过将这些攻击与其它实现缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,取决于这些攻击的上下文。

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

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。

DTD(document type definition,文档类型定义)的作用是定义XML文档的合法构建模块。DTD可以在XML文档内部声明,也可以外部引用。

内部声明DTD

<根元素[声明元素]>

引用外部DTD

<根元素 SYSTEM “文件名”>

<根元素 PUBLIC “public_id” “文件名”>

DTD实体是用于定义引用普通文本或特殊字符的快捷方式的变量&#xff0c;可以内部声明或外部引用。

内部实体



]>

 这里定义元素为ANY说明接受任何元素&#xff0c;但是定义了一个XML的实体&#xff08;实体其实可以看成一个变量&#xff0c;到时候我们可以在XML中通过&&#xff1b;进行引用&#xff09;

例如&#xff1a;


&xxe;
mypass

 我们使用&xxe&#xff1b;对上面定义的xxe实体进行了引用&#xff0c;到时候输出的时候&xxe&#xff1b;就会被“test”替换。

外部实体

<实体名称 SYSTEM “URI”>

<实体名称 PUBLIC “public_ID” “URI”>



]>
&xxe;mypass

上面将实体分为两个派别&#xff08;内部实体和外部实体&#xff09;&#xff0c;但是实际上从另一个角度看 &#xff0c;实体可以分为另外两个派别&#xff08;通用实体和参数实体&#xff09;。

通用实体

用&实体名&#xff1b;在DTD中定义&#xff0c;在XML文档中引用


]>
Joe &file; ...

参数实体 

&#xff08;1&#xff09;使用% 实体名&#xff08;这里空格不能少&#xff09;在DTD中定义&#xff0c;并且只能在DTD中使用%实体名&#xff1b;引用

&#xff08;2&#xff09;只有在DTD文件中&#xff0c;参数实体的声明才能引用其他实体

&#xff08;3&#xff09;和通用实体一样&#xff0c;参数实体也可以外部引用

">

%an-element; %remote-dtd;

参数实体在Blind XXE中起到了至关重要的作用 

二、XML外部实体注入&#xff08;XML External Entity&#xff09;

        当允许引用外部实体时&#xff0c;通过构造恶意内容&#xff0c;可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

引入外部实体的方式有多种&#xff0c;比如&#xff1a;

恶意引入外部实体方式1&#xff1a;


]>
&xxe;

恶意引入外部实体方式2&#xff1a;


%d;
]>
&xxe;

恶意引入外部实体方式3&#xff1a; 


%d;
]>
&xxe;

DTD文件(evil.dtd)内容&#xff1a;

另外&#xff0c;不同程序支持的协议不一样

 还支持扩展协议&#xff0c;如php支持的扩展协议&#xff1a;

 三、漏洞危害

1&#xff1a;读取任意文件


]>
&xxe;

         该CASE是读取C://下的文件&#xff0c;有些XML解析支持列目录&#xff0c;攻击者通过列目录、读文件&#xff0c;获取账号密码后进一步攻击&#xff0c;如读取tomcat-users.xml得到账号密码后登录tomcat的manager部署webshell。

无数据回显的情况

xxe.dtd:

"php://filter/read&#61;convert.base64-encode/resource&#61;file:///c:/xxx.txt">
">

payload:


%remote;%int;%send;
]>

 我们从payload中能看到连续待用了三个参数实体%remote&#xff1b;%int&#xff1b;%send&#xff1b;&#xff0c;这就是我们的利用顺序&#xff0c;%remote&#xff1b;先调用&#xff0c;调用后请求远程服务器上的xxe.dtd&#xff0c;有点类似于将xxe.dtd包含进来&#xff0c;然后%int&#xff1b;调用xxe.dtd中的%file&#xff1b;&#xff0c;%file&#xff1b;就会去获取服务器上面的敏感文件&#xff0c;然后将%file&#xff1b;的结果填入到%send&#xff1b;后面&#xff08;因为实体的值中不能有%&#xff0c;所以将其转换成html实体编码%#37;&#xff09;&#xff0c;我们在调用%send&#xff1b;把我们读取到的数据发送到我们远程VPS上&#xff0c;这样就实现了外带数据的效果&#xff0c;完美解决了XXE无回显的问题。

2&#xff1a;查看php源代码

查看php源代码一般用php伪协议php://filter


]>
&xxe;

 将得到的base数据解码即可。

3&#xff1a;远程代码执行

        这种情况很少发生&#xff0c;主要时由于配置不当导致的。如果我们足够幸运&#xff0c;并且PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上&#xff0c;我们可以执行如下的代码&#xff1a;


]>
&xxe;

系统将执行id命令&#xff0c;并在响应中返回命令执行结果。 

4:SSRF

        XXE可以和SSRF&#xff08;服务端请求伪造&#xff09;漏洞一起用于探测其他内网主机的信息&#xff0c;基于http协议。




]>
&xxe;

         当然也可以用来探测端口信息&#xff0c;根据响应包的信息判断。

四、漏洞发现

        XXE漏洞主要是webserver危险的引用外部实体并且未对外部实体进行敏感字符过滤所造成的&#xff0c;所以如果web服务存在XXE漏洞&#xff0c;首先是应该存在xml传输数据。如果http头的Content-Type为application/xml时可以尝试进行XXE注入&#xff0c;或者当Content-Type为application/json时&#xff0c;修改其为Content-Type为application/xml或者text/xml再尝试进行注入。

        以下利用主要基于libxml2版本&#xff0c;其中libxml是PHP的xml支持。
        而libxml版本在2.9.1及以后&#xff0c;默认不解析外部实体&#xff0c;很多利用将无法实现。

        检测方法&#xff1a;

         尝试修改请求体的内容&#xff1a;

 如图返回内部实体定义内容。

        尝试加载本地文件&#xff1a;

 可以看到已经返回/etc/passwd这个文件了。

五、防御XXE

        XXE漏洞存在是因为XML解析器解析了用户发送的不可信数据。然而&#xff0c;要去检验DTD&#xff08;document type definition&#xff09;中SYSTEM标识符定义的数据&#xff0c;并不太容易&#xff0c;也不大可能。大部分的XML解析器默认对于XXE攻击是脆弱的。因此&#xff0c;最好的解决办法就是配置XML解析器去使用本地静态的DTD&#xff0c;不允许XML中含有任何自己声明的DTD。通过设置相应的属性值为False&#xff0c;XML外部实体攻击就能够被阻止。因此&#xff0c;可将外部实体、参数实体和内联DTD都设置为false&#xff0c;从而避免基于XXE漏洞的攻击。

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

PHP&#xff1a;
libxml_disable_entity_loader(true);


JAVA:
DocumentBuilderFactory dbf &#61; DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);


Python:
from lxml import etree
xmlData &#61; etree.parse(xmlSource,etree.XMLParser(resolve_entities&#61;False))

2、过滤用户提供的XML数据

        过滤关键字&#xff1a;、、SYSTEM、PUBLIC等。

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

参考&#xff1a;

未知攻焉知防——XXE漏洞攻防 - 博客 - 腾讯安全应急响应中心

pikachu XXE (XML外部实体注入)&#xff08;皮卡丘漏洞平台通关系列&#xff09;_仙女象的博客-CSDN博客_皮卡丘漏洞平台


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有