XXE详解

XXE详解xxe漏洞的学习与利用总结前言对于xxe漏洞的认识一直都不是很清楚,而在我为期不长的挖洞生涯中也没有遇到过,所以就想着总结一下,撰写此文以作为记录,加深自己对xxe漏洞的认识。xml基础知识要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许…

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

xxe漏洞的学习与利用总结

前言

对于xxe漏洞的认识一直都不是很清楚,而在我为期不长的挖洞生涯中也没有遇到过,所以就想着总结一下,撰写此文以作为记录,加深自己对xxe漏洞的认识。

xml基础知识

要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成。

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素

XXE详解

xml文档的构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

下面是每个构建模块的简要描述。
1,元素
元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。
实例:

<body>body text in between</body>
<message>some message in between</message>

空的 HTML 元素的例子是 “hr”、”br” 以及 “img”。

2,属性
属性可提供有关元素的额外信息
实例:

<img src="computer.gif" />

3,实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。

4,PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

5,CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。

DTD(文档类型定义)

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可以在 XML 文档内声明,也可以外部引用。

1,内部声明:<!DOCTYPE 根元素 [元素声明]> ex: <!DOCTYOE test any>
完整实例:

<?xml version="1.0"?>
<!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

2,外部声明(引用外部DTD):<!DOCTYPE 根元素 SYSTEM “文件名”> ex:<!DOCTYPE test SYSTEM 'http://www.test.com/evil.dtd'>
完整实例:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note> 

而note.dtd的内容为:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

DTD实体

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

实体又分为一般实体和参数实体
1,一般实体的声明语法:<!ENTITY 实体名 “实体内容“>
引用实体的方式:&实体名;
2,参数实体只能在DTD中使用,参数实体的声明格式: <!ENTITY % 实体名 “实体内容“>
引用实体的方式:%实体名;

1,内部实体声明:<!ENTITY 实体名称 “实体的值”> ex:<!ENTITY eviltest "eviltest">
完整实例:

<?xml version="1.0"?>
<!DOCTYPE test [ <!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn"> ]>

<test>&writer;&copyright;</test>

2,外部实体声明:<!ENTITY 实体名称 SYSTEM “URI”>
完整实例:

<?xml version="1.0"?>
<!DOCTYPE test [ <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> ]>
<author>&writer;&copyright;</author>

在了解了基础知识后,下面开始了解xml外部实体注入引发的问题。

XXE的攻击与危害(XML External Entity)

1,何为XXE?
答: xxe也就是xml外部实体注入。也就是上文中加粗的那一部分。

2,怎样构建外部实体注入?
方式一:直接通过DTD外部实体声明
XML内容
XXE详解

方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
XML内容:
XXE详解
DTD文件内容:
XXE详解

方式三:通过DTD外部实体声明引入外部实体声明
好像有点拗口,其实意思就是先写一个外部实体声明,然后引用的是在攻击者服务器上面的外部实体声明
具体看例子,XML内容
XXE详解

dtd文件内容:
XXE详解

3,支持的协议有哪些?
不同程序支持的协议如下图:
XXE详解

其中php支持的协议会更多一些,但需要一定的扩展支持。

XXE详解

4,产生哪些危害?

XXE危害1:读取任意文件
XXE详解

XXE详解

该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。

另外,数据不回显就没有问题了吗?如下图,
XXE详解

不,可以把数据发送到远程服务器,

XXE详解

远程evil.dtd文件内容如下:
XXE详解

触发XXE攻击后,服务器会把文件内容发送到攻击者网站

XXE详解

XXE危害2:执行系统命令
XXE详解

该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。

XXE危害3:探测内网端口

XXE详解

XXE详解

该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

XXE危害4:攻击内网网站

XXE详解

XXE详解

该CASE是攻击内网struts2网站,远程执行系统命令。

如何防御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))

方案二、过滤用户提交的XML数据
关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

最后

通过本次对XXE的总结,认真了解了XML基础知识,XXE的攻击方式与及防御方案。

参考资料

1,未知攻焉知防——XXE漏洞攻防
2,XXE注入攻击与防御
3,DTD教程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142129.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UML旅游管理系统「建议收藏」

    UML旅游管理系统「建议收藏」一、需求概述1.1项目概述随着人们的生活质量的逐步提高,外出旅游成为人们生活中不可或缺的一项活动。开发一个旅游管理系统可以为大家提供便捷的途径。系统管理员可以发布和管理旅行路线。旅客可以查询路线,预定路线。1.2用户需求分析分析的系统的参与者有系统管理员、会员、普通用户三个群体。分别对三个群体的需求进行具体分析。系统管理员:管理员作为系统的管理者。需要对线路的数据库进行管理。比如发布新的线路,对不需要的线路进行删除、修改线路的具体信息。对于已经发布的线路,系统管理员可以查看预定的情况。同

    2022年6月12日
    27
  • 大数运算模板

    大数运算模板#include#include#include#includeusingnamespacestd;#defineMAX_DIGIT500//大数运算:加法intAdd(int*a,int*b,int*&result){if(a==NULL||b==NULL||re

    2022年10月7日
    0
  • 关于尺度空间的理解和认识_尺度空间理论

    关于尺度空间的理解和认识_尺度空间理论通常会听到尺度变化等这类词语,看到的也总是一堆的数学公式,有时候真的不知道这到底有啥用,有啥意义,没有弄懂这些意义,当然就更不可能的理解,不可能去掌握应用它了,现在我才理解,小波变化其实也是一种尺度变化。今天我看到一篇南航数学系写的关于尺度空间解释的文章,感觉很通俗易懂,我们不从数学上来推倒什么是尺度空间,只是从生活常识方面来解释尺度空间的意义,意义懂了,数学方面自然就好理解了。       

    2022年10月11日
    0
  • 搜索、推荐、广告系统等人工智能优质技术资源最全整理[通俗易懂]

    搜索、推荐、广告系统等人工智能优质技术资源最全整理[通俗易懂]前沿文章目录前沿开源地址[算法学习资料:AI_Tutorial](https://github.com/cbamls/AI_Tutorial)开源相关LuceneSolrElasticLucidWorks中文分词大公司阿里百度京东美团点评携程去哪儿搜狗一号店待分类开发应用理论基础源码解读常见问题其他人工智能领域文集算法学习资料:AI_Tutorial人工智能、AI架构、搜索系统、推荐系统…

    2022年5月5日
    37
  • html从零开始——为网页加入樱花飘落效果[通俗易懂]

    html从零开始——为网页加入樱花飘落效果[通俗易懂]JavaScript代码: varstop,staticx; varimg=newImage(); img.src=”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUgAAAEwCAYAAADVZeifAAAACXBIWXMAAACYAAAAmAGiyIKYAAAHG2lUWHRYTUw6Y29tLmFkb2Jl…

    2022年7月12日
    12
  • pageinfo 分页实现_分页显示

    pageinfo 分页实现_分页显示项目中有时候遇到list多种来源,不能使用PageInfo在查询数据库时分页,需要查询全部之后,手动分页。 //手动分页的分割起始下标IntegerfromIndex=0;//手动分页的分割结尾下标IntegertoIndex=0;Integertotal=arrayList.size();…

    2025年7月28日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号