实验环境
目标靶机:OWASP_Broken_Web_Apps_VM_1.2
IP:192.168.0.109
测试渗透机:kali-linux-2018-4-vm-amd64
IP:192.168.0.103
文件上传原理
1、文件上传(File Upload)是大部分web应用都具备的功能,如:用户上传的附件、修改头像、分享图片/视频等
2、正常的文件一般是文档、图片、视频等,web应用收集之后放入后台存储,需要的时候调用出来返回
3、如果恶意的文件如PHP、ASP等执行文件绕过web应用,并顺利执行,则相当于黑客直接拿到webshell
4、一旦黑客拿到webshell,则可以拿到web应用的数据,删除web文件,本地提权,进一步拿下整个服务器甚至内网
5、SQL注入攻击的对象是数据库服务,文件上传漏洞主要攻击web服务,实际渗透两种相结合,达到对目标的深度控制
实验
实验一(low)
进入靶机环境
这里提示选择你要上传的图像,我们上传一张jpg图片文件
提示上传成功,我们查看一下
再次尝试上传一个11.txt的文本文件,看是否限制上传
提示上传成功,我们查看一下
此时我们上传一个一句话木马的PHP可执行文件,看是否限制上传
提示成功上传,我们查看一下
此时亮出我们的中国菜刀
成功进入
我们来分析下靶机源码
<?php
if (isset($_POST['Upload'])) { //判断是否有post提交过来的变量
$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>';
}
}
?>
低安全模式下
没有验证文件上传类型,后缀名,可以任意上传文件及文件大小
实验二(medium)
进入靶机环境
上传一张jpg图片文件,成功上传
上传一个PHP可执行文件,提示Your image was not uploaded.
我们来分析下靶机源码
<?php
if (isset($_POST['Upload'])) { //判断是否有post提交过来的变量
$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']; //文件的MIME类型
$uploaded_size = $_FILES['uploaded']['size']; //已上传文件的字节大小
if (($uploaded_type == "image/jpeg") && ($uploaded_size < 100000)){ //进行了一个MIME类型及文件大小判断
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>';
}
}
?>
中安全模式下
对文件上传的MIME类型及大小进行了一个判断
此时,我们可以用burp suite抓包来做一个对比
利用burp suite抓包进行修改Content-Type值为imge/jpeg进行上传
上菜刀
实验三(high)
尝试上述方法,全部失败,不在赘述
查看靶机源码
<?php
if (isset($_POST['Upload'])) { //判断是否有post提交过来的变量
$target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/"; //设置上传目录
$target_path = $target_path . basename($_FILES['uploaded']['name']); //获取上传文件名
$uploaded_name = $_FILES['uploaded']['name']; //客户端文件的原名称($_FILES['file']['name']在得到文件名时0x00【%00截断】之后的内容已经不见了,如果在此基础上判断后缀名是否合法,则肯定不能通过。)
$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>';
}
}
?>
高安全模式下
后台检测上传文件后缀名(采取白名单)
这里我们结合文件包含漏洞
使用dos命令制作一句话图片木马
copy shell.jpg /b+ xiaowei.php shell3.jpg
--/b 以二进制的形式进行复制、合并文件。
--/a 以ASCII的形式进行复制、合并文件。
将制作好的一句话图片木马进行上传
结合文件包含漏洞,直接包含该文件会将该文件以PHP来运行:
上菜刀
此时,你可能会遇到这样子的问题(因为正是我在实验过程中遇到的一个问题)
(根据排查初步断定菜刀没有进行一个身份认证,导致返回了一个200状态码的一个登陆界面源码)
此时我们利用菜刀的浏览器登陆下我们的靶机环境,让它产生cookie
我们再次进行我们的一句话连接,连接成功。