欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【渗透测试笔记】四、文件上传漏洞

程序员文章站 2022-05-27 15:48:47
...

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>';

            }
        }

?> 
相关标签: 【渗透测试】