靶机地址:https://www.vulnhub.com/entry/xxe-lab-1,254/
靶机描述:
Haboob Team made this virtual machine regarding the published paper "XML External Entity Injection - Explanation and Exploitation" https://www.exploit-db.com/docs/45374 to exploit the vulnerability in a private network. We hope that you enjoy the challenge!
The challenge is right here: http://IP-ADDRESS/xxe
Haboob团队制作了这个虚拟机,涉及到发表的文章"XML外部实体注入-解释和利用"https://www.exploit-db.com/docs/45374 来利用私人网络中的漏洞。我们希望你喜欢这个挑战!挑战就在这里:http://IP-ADDRESS/xxe
困难程度:简单
靶机搭建完成后,网络模式采用NAT,与kali攻击机NAT共处一个网段,本次实验全程采用kali操作。
先用arp-scan工具进行扫描。
发现靶机的ip地址为192.168.13.134。
然后用namp进行扫描
发现靶机开放80端口,HTTP服务,中间件版本为Apache2.4.27,同时探测到robots.txt及_/xxe/* /admin.php等路径。
之后使用gobuster目录扫描,若没有可使用apt install gobuster进行安装,此处gobuster dir为目录扫描模式,-u指定URL,-w指定目录字典,-o指定输出文件
发现robots.txt文本文件,用于告诉搜索引擎的爬虫(机器人)哪些页面或目录可以被访问,哪些不可以,通常位于网站的根目录下。
用curl访问一下robots.txt
发现存在两个路径/xxe和/admin.php,通过浏览器访问,分别是两个登录界面,应该是前后台的关系。
查看一下页面源码,没什么隐藏信息,但是声明了XHTML 1.0 Transitional 文档。与本靶机的标题XXE相关,该标准已过时,容易构造XSS或XXE攻击
使用burpsuite对登录包进行拦截,测试XXE。声明DTD。
这里定义了一个外部实体(cjc),它可以被用来读取服务器上的任意文件。这里尝试读取 /etc/passwd 文件成功,证明此处存在XXE漏洞。
此处虽然可以查看标准路径的文件内容,但是我们还无法确定其网站源码的绝对路径,所以此处需要配合相对路径测试,利用robots.txt中的/admin.php,该文件应该与当前界面处于同一级目录
代码:<?xml version="1.0"?>
<!DOCTYPE cjccjc [
<!ELEMENT cjccjc ANY>
<!ENTITY cjc SYSTEM
"php://filter/read=convert.base64-encode/resource=admin.php">]>
<root><name>&cjc;</name><password>cjc</password></root>
上面代码利用了 PHP 的过滤器功能,通过 php://filter 读取 admin.php 文件的内容并进行 Base64 编码。服务器解析这个 XML,读取 admin.php 的内容,并进行 Base64 编码,返回的结果是编码后的字符串,攻击者可以解码以获取源代码。
注意:Base64 编码可以将二进制数据转换为文本格式,便于在 XML 或其他文本格式中传输。这种方式可以避免某些字符导致的解析问题。不要想当然直接copy命令,需要了解为什么需要这么做。
文本格式:Base64 编码将二进制数据转换为 ASCII 字符串,使其适合在 XML 或其他文本格式中传输,避免了二进制数据的处理问题。
避免特殊字符:在 XML 中,某些字符(如 <、>、&)具有特殊含义,直接包含这些字符可能导致解析错误。Base64 编码则可以避免这些问题。
这里将response响应包中的内容copy to file保存到本地。删除无关信息只留下源码
然后进行base64解码输出,此处文件太长,使用head先展示一下
查看源码内容,可以发现其存在账户及密码。
此处我们拿到了账号administhebest,密码为加密字段e6e061838856bf47e1de730719fb2609。通过md5解密拿到密码明文。
此时可以登录后台界面。
同时在源码中还存在一段flag保存位置的代码,表明flag在/flagmeout.php中。
直接访问该页面显示404,原因是因为虽然这里给的是/flagmeout.php,但实际上flag是存在于/xxe目录下的,所以要在前面拼接/xxe。或者可以继续尝试XXE来读取内部的源码。通过拼接xxe后访问为白屏,检查页面提示
<!-- the flag in (JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5) -->
对密文进行解密,此处为先base64加密后base32加密。
base32与base64区别
1. 检查长度
Base32 编码的字符串通常是 8 的倍数。
Base64 编码的字符串长度通常是 4 的倍数,并且可能以 = 结尾。
2. 字符集
Base32:仅包含字母 A-Z 和数字 2-7。
Base64:包含字母 A-Z、a-z、数字 0-9,以及 + 和 / 字符。
输出flag保存在flag.php中,这时候我们就可以利用之前的XXE配合file伪协议读取源码
保存到本地,对文件内容进行修改。
看似用php编写,使用了多个数组和变量,通过自增运算符 ++ 来动态生成和修改内容。最后的 $_($_); 表示将构造的字符串作为代码执行,这是 PHP 中的 eval() 函数的典型用法。可以在本地搭建apache+php服务(无数据库),然后尝试访问看看内容。
注意此处要在原代码前后添加<?php ?>
本地访问URL,可得到内容flag Failure evaluating code: SAFCSP{xxe_is_so_easy} 。