【渗透测试笔记】四、文件上传漏洞
We are all in the gutter, but some of us are looking at the stars.
身在井隅,心向璀璨。
本文仅供学习交流,正确使用渗透测试,遵守相关法律法规,请勿用于非法用途。
关于漏洞
文件上传漏洞:指由于在对用户上传文件部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。如上传木马,病毒,恶意脚本或者WebShell等。
实验环境
本实验基于以下环境:
确保所有虚拟机处于同一个NAT Network下
- 启动Metasploitable,利用 ifconfig 获取本机IP
- 启动Kali,进行渗透测试,浏览器输入Metasploitable中查询到的IP,访问漏洞页面
漏洞预防策略
- 分析上传的文件类型,对文件重命名
- 拓展名检测
- Content-Type文件类型检测
挖掘漏洞
这里以DVWA为例,默认登录账号admin/password
DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境。
先设置安全等级为low,可自行调整难度。
使用weevely生成php后门
weevly是一款使用python编写的webshell工具 ( 用于webshell生成和连接,限于php )
生成后门文件的格式
weevely generate <password> <path>
如,在当前目录生成一个webshell.php文件,密码为test123:
weevely generate test123 webshell.php
试试能不能上传,可以看到,在安全级别为low的情况下,文件轻松上传。
访问Metasploitable也可以看到上传的文件位置
通过网页显示的url可知,文件存在于http://ip地址/dvwa/hackable/uploads/webshell.php,通过weevely连接
URL为上传的文件路径,密码为之前创建文件时设置的密码
weevely <URL> <password>
连接目标服务器成功,可执行命令
提高难度为Medium
在中等难度下,再次尝试使用之前的方法上传webshell.php。
提示失败,用 Burp suite 作为代理拦截请求看看
既然要求上传图片类型,试试修改Content-Type,看看能不能绕过。
正常情况下:客户端 -> 服务器
Burp suite代理: 客户端 -> Burp suite -> 服务器
通过Burp suite拦截请求,修改类型,提交到服务器
可以看到,服务端错误的识别了类型,将其作为图片格式,上传后门文件成功。
提高难度为Hign
尝试修改拓展名为 webshell.php.jpg,绕过检测
相关难度源码
Low
<?php
if (isset($_POST['Upload'])) {
$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
$target_path = $target_path . basename( $_FILES['uploaded']['name']);
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
} else {
echo '<pre>';
echo $target_path . ' succesfully uploaded!';
echo '</pre>';
}
}
?>
Mediun
<?php
if (isset($_POST['Upload'])) {
$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
$target_path = $target_path . basename($_FILES['uploaded']['name']);
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_type = $_FILES['uploaded']['type'];
$uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
} else {
echo '<pre>';
echo $target_path . ' succesfully uploaded!';
echo '</pre>';
}
}
else{
echo '<pre>Your image was not uploaded.</pre>';
}
}
?>
Hign
<?php
if (isset($_POST['Upload'])) {
$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
$target_path = $target_path . basename($_FILES['uploaded']['name']);
$uploaded_name = $_FILES['uploaded']['name'];
$uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
$uploaded_size = $_FILES['uploaded']['size'];
if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){
if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
} else {
echo '<pre>';
echo $target_path . ' succesfully uploaded!';
echo '</pre>';
}
}
else{
echo '<pre>';
echo 'Your image was not uploaded.';
echo '</pre>';
}
}
?>