upload-labs_less1_less2_绕过前端js校验_MIME检查绕过_

关于靶场说几点:单纯用phpstudy 可能无法复现所有的漏洞,而且phpstudy中的php可能是线程不安全的,所以建议大家在自己本机或者虚拟机的中亲自搭建一下apache和php的环境,便于复现upload-labs的所有靶场环境。配置有问题的可以参考我写的这篇文章:
https://blog.csdn.net/qq_51550750/article/details/124062273

上面这篇博客记录了我为了搭建有些不能在phpstudy中复现而能在自己搭建的apache+php中复现的过程。

再次补充一下:
我的靶场练习记录中,http://172.16.135.186/upload-labs/这个URL是我phpstudy的环境,http://172.16.135.186:7299/upload-labs/Pass-01/index.php是我另外在虚拟机上搭建的apache和php环境。

less 1

http://172.16.135.186/upload-labs/Pass-01/index.php

在这里插入图片描述

看本题提示:
在这里插入图片描述

使用js对于不合法的进行过滤。既然是JS(前端,在这里可以简单理解为客户端)进行校验,那么就很简单了,只需要前端绕过。

这里补充两种方法:

**先说第一种方法,**这种方法可能用的比较少,因为他可能会影响其他功能:
在URL中输入:
about:config
在这里插入图片描述

选择接受风险并继续:
在搜索框中输入:javascript.enabled

在这里插入图片描述

将false改为true ,再上传一句话木马,连接蚁剑就行。

方法2:

删掉检查不合法这个功能 方法。

补充一下浏览器的一个功能:
首先可以通过“右键—》检查—〉查看器”中看到一堆HTML代码:
在这里插入图片描述
然后看到这个窗口的左上角有一个箭头,点击箭头,
在这里插入图片描述

然后点击提交的按钮:
在这里插入图片描述

点击之后,就会定位到这个按钮对应的HTML代码
在这里插入图片描述
可以看到,点击“上传”的时候会触发一个事件:
在这里插入图片描述

onsubmit这是一个JS事件,在点击这个按钮的时候会触发的事件,也可以查看这个事件的代码:
在这里插入图片描述

我把代码粘贴如下:


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

这个checkFile执行的功能很简单:首先接受上传的文件,file这个变量就是接受文件
然后第一个if流程控制语句就是用来判断上传的文件是否为空,如果为空,就提示"请选择要上传的文件!"(防止有些人恶意地没有上传文件就点击上传的按钮)

然后allow_ext定义了允许上传的文件类型,jpg png gif是允许上传 的类型。

又获取了上传的文件的类型,说明一下file.substring(file.lastIndexOf(“.”))

首先file.lastIndexOf(“.”)是获取文件名字的最后一个“.”的位置,因为有人可能会上传xxx.xxx.jpg这样的文件,所以获取最后一个点的位置。
然后file.substring(file.lastIndexOf(“.”)中substring这个方法是提取子串,如果只是传了一个参数,就会提取从该索引值开始到字符串结尾,以test.random.jpg这个文件名来说,file.lastIndexOf(“.”)是11(第一个字母t的索引是0),那么file.substring()就是从索引值11开始到结尾即.jpg
也就是说ext_name最终会得到.xxx这样的后缀(文件扩展名)

最后一个if流程控制语句就是查找allow_ext有没有ext_name,如果有,allow_ext.indexOf(ext_name) == -1)这个返回的就不是-1,如果没有(也就是上传到文件不是规定的jpg png gif这些格式之一),就会返回-1,如果返回-1,那么提示“该文件不允许上传,请上传…的类型”。

checkFile这个函数就是验证白名单(jpg png gif)中有没有用户上传的格式。

但是可以把这个方法删除,如下图所示:
在这里插入图片描述

那上面这个checkFile就没有任何用了。

一句话木马上传成功后,看到图片“裂开了”:
在这里插入图片描述

这时候可以拖动“图片”查看这个“图片”的路径:
http://172.16.135.186/upload-labs/upload/shell.php

通过蚁剑连接这个webshell:
在这里插入图片描述
连接成功:
在这里插入图片描述

less2

在这里插入图片描述
看本关提示:
本关提示:‘本pass在服务端对数据包的MIME进行检查!’

这里需要补充一个MIME 的小知识点:
MIME:Multipurpose Internet Mail Extensions 多用途互联网邮件扩展类型
各位小伙伴可以去看看官网对于MIME的介绍:
https://developer.mozilla.org/zh- CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
说完这些,可能你还是会有点懵逼,简单列举几个常见的MIME类型,你可能就容易理解了:
在这里插入图片描述

根据对于前一关(less 1)的理解,前端还是进行了JS扩展名校验:
在这里插入图片描述
既然有进行了校验,那么后端(或者说服务器端)也会对MIME进行校验的时候关注MIME的类型是不是图片,根据上面的常见MIME类型,可以知道如果MIME类型不是image/jpeg 估计会进行拦截,那么如何解决这个呢?

要清楚一点,其实这个MIME类型是在HTTP请求头和响应头中常见的字段,比如我们在访问百度的时候,你可以通过“F12–>网络”查看一下第一个链接的请求头和相应头中是否有有个字段Content-Type:
在这里插入图片描述
这个字段就是用来检验或者说明MIME类型的,但是如果我们上传的是php文件(木马文件),这个Content-Type字段的值一定不是image/jpeg,那么又该怎么做呢?
我们不可能在浏览器中修改Content-Type这个字段的值,只能抓包来解决了。

开启代理,抓包:
在这里插入图片描述

但是有两个Content-Type字段,该修改哪一个呢?显然第二个。
在这里插入图片描述

然后forward一下,就成功了。一个webshell就上传成功了。

最后剩余的19关我会慢慢更新,欢迎大家关注公众号“小东方不败”,欢迎大家来和我交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值