ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XML知识

2021-11-02 20:00:37  阅读:198  来源: 互联网

标签:XML xml 实体 外部 知识 文档 XXE


在这里插入图片描述

xml和html的差异

在这里插入图片描述
也就是说与html不同的是,xml主要是用来传递数据的

xxe是什么

即xml外部注入实体注入攻击
在这里插入图片描述

什么是xml实体注入

将你的代码当成XXE代码,然后XXE再交给PHP去执行
将1.txt的东西,放入test这个变量
实体就是变量
&test就是输出这个变量
只是一个声明格式,随便写什么,就算写成都可以,只要满足格式就行

最主要的是访问的地址,file,http等协议都可以。

XXE:XML外部实体注入,原理:有了XML实体,关键字SYSTEM会令XML解析器从URL中读取内容,并允许它在XML文档中被替换。XML是被设计用来存储以及传输信息,本身不会做任何事情。真正读取的是PHP有一个处理XML的函数:simplexml_load_string()。
程序分析:SYSTEM关键字通过file协议读取c:/1.txt里面的内容赋值给test实体,&test引用实体赋值给了$test变量,这里所做的是构造xml代码,将xml代码传参给了simplexml_load_string()函数执行,真正的读取是在这个函数执行的,最后print_r输出。
没有simplexml_load_string()函数,是读取不出来的

在这里插入图片描述支持的外部协议
在这里插入图片描述
在这里插入图片描述其中php支持的协议会更多一些,但需要一定的扩展支持。
xml文档的构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
元素:
元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。
实例:

body text in between some message in between

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

实体:
实体是用来定义普通文本的变量。实体引用是对实体的引用。
PCDATA:
PCDATA 的意思是被解析的字符数据(parsed character data)。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记
CDATA:
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。

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

1,何为XXE?
答: xxe也就是xml外部实体注入。也就是上文中加粗的那一部分。
2,怎样构建外部实体注入?
方式一:直接通过DTD外部实体声明

XML内容
在这里插入图片描述
方式二:通过DTD文档引入外部DTD文档,再引入外部实体声明
XML内容:
在这里插入图片描述

DTD文件内容:
在这里插入图片描述

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

dtd文件内容:
在这里插入图片描述

XXE危害1:读取任意文件

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

另外,数据不回显就没有问题了吗?如下图,
在这里插入图片描述
不,可以把数据发送到远程服务器,在这里插入图片描述
远程evil.dtd文件内容如下在这里插入图片描述
触发XXE攻击后,服务器会把文件内容发送到攻击者网站在这里插入图片描述

XXE危害2:执行系统命令

在这里插入图片描述
该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。
XXE危害3:探测内网端口在这里插入图片描述
在这里插入图片描述
该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。
XXE危害4:攻击内网网站在这里插入图片描述
在这里插入图片描述
该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。

标签:XML,xml,实体,外部,知识,文档,XXE
来源: https://blog.csdn.net/qq_50613938/article/details/121107323

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有