Kali学习笔记38:文件上传漏洞

摘要:
早些年,提到Web渗透,或者搜索一些黑客教程基本都会看到文件上传漏洞。由于是客户端进行限制的,利用截断,我们可以轻易修改文件大小限制进一步利用:找到Kali自带的webshell修改IP:上传这个文件之后利用nc监听,轻易得到shell:结论:低安全级别的文件上传做得很差,可以轻易利用漏洞接下来看看中安全级别上传png文件成功,但是上传php文件失败想要找到失败原因,需要查看源代码:˂?

早些年,提到Web渗透,或者搜索一些黑客教程

基本都会看到文件上传漏洞。

它是一个很经典的漏洞

但它本质其实不是一个漏洞,而是网站本身的上传文件功能

不过如果我们上传了Webshell,那么就成为了文件上传漏洞

打开我们的靶机Metasploitable:

这里就是我们可以测试文件上传的地方

我们先在低安全级别的情况下测试

Kali学习笔记38:文件上传漏洞第1张

首先我们上传一个正常的图片文件;

Kali学习笔记38:文件上传漏洞第2张

在目录中输入这行路径,就可以直接访问这个图片

如果我们上传的是有恶意的文件呢?

比如php一句话

Kali学习笔记38:文件上传漏洞第3张

Kali学习笔记38:文件上传漏洞第4张

成功执行

我们来分析下低安全级别的源代码:

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

为了配合分析,我用Burp把上传文件的Request复制下来

除了基本的HTTP头,需要注意的就是下面这部分内容

Kali学习笔记38:文件上传漏洞第5张

代码首先判断点击了Upload之后,找到DVWA根目录,然后重新定义新的路径

从请求获得文件名1.php赋值,如果目标文件不存在,显示失败,否则显示成功

代码缺陷:

(1)没有对文件类型进行过滤,本意接受上传图片,实际却可以上传php

(2)对文件大小限制为100K其实没有用。由于是客户端进行限制的,利用截断,我们可以轻易修改文件大小限制

进一步利用:找到Kali自带的webshell

Kali学习笔记38:文件上传漏洞第6张

修改IP:

Kali学习笔记38:文件上传漏洞第7张

上传这个文件之后

利用nc监听,轻易得到shell:

Kali学习笔记38:文件上传漏洞第8张

结论:低安全级别的文件上传做得很差,可以轻易利用漏洞

接下来看看中安全级别

上传png文件成功,但是上传php文件失败

想要找到失败原因,需要查看源代码:

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

可以从代码中分析得出结论:这里需要验证type、name和size三个变量才能成功上传

而且要求type必须是image/jpeg,所以哪怕是png格式的图片也无法上传

绕过:

既然要验证type,name,size那么我就修改

由于size和name符合要求,那么我就修改type为image/jpeg:使用Burp截断

Kali学习笔记38:文件上传漏洞第9张

修改后上传,成功!

Kali学习笔记38:文件上传漏洞第10张

进一步可以上传木马等等

总结:中等安全等级的文件上传也可以轻易饶过,不过需要截断工具

但其实已经可以防止最低级的脚本小子

接下来看看高级安全等级:

源代码

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

分析可以看出:

这里对扩展名进行了过滤,所以上传1.php会失败,修改类型也会失败

而我们如果把1.php修改成1.php.jpg

Kali学习笔记38:文件上传漏洞第11张

上传成功!
也可以成功被利用

Kali学习笔记38:文件上传漏洞第12张

总结:高安全级别也不安全

怎么更安全呢?

一般文件前一部分字节表明这个文件的类型,我们可以来验证这一部分内容

因为哪怕修改了扩展名也无法修改这里的文件类型,我们可以用mimetype命令来验证

所以,这种方式更安全

那么有没有办法绕过这种更安全的方式呢?

有,保留表明文件类型的字节,修改文件实际内容

Kali学习笔记38:文件上传漏洞第13张

比如这里,我们不改变第一行,只改变后边的内容

Kali学习笔记38:文件上传漏洞第14张

但是想要使用会报错,因为服务器端没有用php去解释这个文件

所以我们把1.png修改为1.php.png,再发送过去,服务器端就会去解释了

然后就可以像上面一样利用了

那么,文件上传漏洞是无法被解决了吗?

不是

安全有效的解决办法:

目录权限限制,不给执行权限

sudo chmod a-x uploads/

对保存上传文件的文件夹进行权限限制

免责声明:文章转载自《Kali学习笔记38:文件上传漏洞》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇logstash进程杀不掉DotnetBrowser入门教程-(1)浏览器控件使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

submit提交表单后,不刷新当前页面

<form method="get" target="test" action="a.html"> <input type=""text /> <input type="submit" /> </form> <iframe name="test" style="display:none">...

c#在WinForm下使用HttpWebRequest上传文件并显示进度

这段时间因项目需要,要实现WinForm下的文件上传,个人觉得采用FTP方法太麻烦,还得配置FTP服务器,要通过防火墙也是一个麻烦。本来打算采用WebClient方法,但是采用这个方法实现后,进度条很短时间后就达到最大值,要等待一段时间才能传送完毕,要是文件太大(我这里测试约100M),会出现错误。后来才知道,原来WebClient是在加载完整个文件到内存...

SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制

SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制 前言 LZ最近升级SpringBoo框架到2.1.6,踩了一些坑,这里介绍的是文件上传大小限制。 升级前 #文件上传配置 1.5.9 spring: http: multipart: enabled: tr...

详解 Java 中的三种代理模式

代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法. 举个例子来说明代理的作用:假设我们想邀请一位明星...

Luci实现框架

1.总述 上一篇总结了uhttpd的工作方式,openwrt中利用它作为web服务器,实现客户端web页面配置功能。对于request处理方式,采用的是cgi,而所用的cgi程序就是luci,工作框架如下图所示: Client端和serv端采用cgi方式交互,uhttpd服务器的cgi方式中,fork出一个子进程,子进程利用execl替换为luci进...

Kali Linux安装

Kali Linux 安装过程参考:https://blog.csdn.net/qq_40950957/article/details/80468030 安装完成后,apt-get install 安装软件时可能会出现  Unable to locate package **** 的错误,这个问题应该是软件源的问题: 通过命令查看源信息 vi /etc/a...