XML知识

在这里插入图片描述

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值