文件上传漏洞原理【通过】

实验环境

目标靶机: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

我们再次进行我们的一句话连接,连接成功。