【文件上传】前端JS验证的绕过与思考

文件上传中的前端JS验证,应该说是文件上传的验证里面最简单的、也是最容易绕过的验证,对于网络安全知识的积累,个人觉得最简单、基础的东西,往往要掌握的更加扎实,这样才能牢固的筑起万丈高楼,本文通过常规的集中绕过方式,对前端验证进行了一些总结和思考。

一、源码分析

本文实验环境以github上的https://github.com/c0ny1/upload-labs为例进行。

<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
	<p>请选择要上传的图片:<p>
	<input class="input_file" type="file" name="upload_file"/>
	<input class="button" type="submit" name="submit" value="上传"/>
</form>
<script type="text/javascript">
    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;
        }
    }
</script>

通过上述代码,我们可以看到,网页使用一段JS代码对form表单提交的数据进行了扩展名校验,校验的触发条件是在onsubmit事件同时发生的。

二、绕过方法

1、上述所有的校验都存在于前端,即在我们的本地客户端上,网络安全中有这么一句经典,“位于客户端的数据输入校验都是可以绕过的”。因此,我们可以用修改客户端代码和burpsuite代理改包的方式绕过前端验证。
2、客户端修改源码可以通过firebug或者直接保存修改源码的方式,这里就不多说。我们重点说一下burp代理绕过的两种方式。第一种,我们先用浏览器向server发送一个能够通过前端校验的报文,当报文到达burp处时,我们可以通过在burp处修改报文(如修改文件名后缀),达到绕过校验的目的,其作用原理如下图,只需要修改1~2过程报文,这也是burp改包的常规手法。
在这里插入图片描述
3、第二种方法,在文件上传之前,我们发送一个没有上传文件的请求,然后在brup处对response报文进行修改,我们可以在此处删除js代码的显示,对应下图过程3~4,最终得到一个没有JS校验源码的客户端页面,这种方法和客户端改源码达到的目的相同,但过程更加优雅。
在这里插入图片描述
之所以在这里提这种方法,主要是想强调一下burp使用思路,很多人在使用burp时凭经验认为burp只能对request报文修改,实际上由于默认开关关闭,让很多人忽略了这一点。我们可以通过brup的proxy—>options选项中勾选下面的√,就可以在抓包时候看到response报文并对报文进行修改了,修改完成后放过response报文后,我们再在浏览器查看源码,能够看到我们JS校验代码已经被去掉。
在这里插入图片描述

三、一点思考

1、说了这么多,那么为什么程序员开发代码时候会使用前端校验的方式,是他们不清楚前端校验很容易被绕过吗?当然不是。之所以使用前端校验,主要是因为效率高,用户体验好,如果所有的数据都发送给服务器,服务器校验后再发给客户端,这中间需要消耗时间,用户体验就变得不好。但这种校验方式的开发的初衷是针对中规中矩的普通用户,当面对黑客这类群体时候就变得形同虚设。
2、那么我们深入再思考一点,对于CS架构的游戏类开发,其实很多数据也是通过客户端进行校验的,因为游戏类产品,人物的复杂运动会产很多复杂的数据,这些数据如果全部提交给服务器校验,显然会对服务器造成很大处理压力,因此,程序员在开发时候,对一些安全要求不高,对速度要求很高的数据校验都是写在客户端进行校验的,当然,这也是游戏外挂编写的基本思路,其实还是那句老话,所有客户端的数据输入校验都是可以绕过的
3、写到最后,实际编程开发中我们应该在安全开发方面注意哪里点呢。其实,从上面的分析就可以得出结论,一是不能只有前端校验,没有后端校验,对于一些可能重大影响程序结果的数据,最好使用前后端结合的校验方式,即保证用户体验,又保障程序安全。另外,在游戏、app等客户端开发时,我们可以通过混淆、加密、加壳等手段尽量防止客户端使用者对关键数据和算法进行逆向分析。

文件上传漏洞指的是攻击者可以通过上传恶意文件来执行任意代码或者获取服务器上的敏感信息。在前端检查方面,可以通过以下步骤来检查和防止文件上传漏洞的发生: 1. 检查文件类型:客户端可以通过对文件类型的检查来防止用户上传恶意文件。这可以通过在前端使用JavaScript来实现,或者通过使用一些第三方库来实现。在检查文件类型时,应该使用白名单的方式来限制允许上传的文件类型。 2. 检查文件大小:客户端可以通过对文件大小的检查来限制用户上传过大的文件。这可以通过在前端使用JavaScript来实现。 3. 检查文件名称:客户端可以通过对文件名称的检查来防止用户上传含有恶意脚本的文件。这可以通过在前端使用JavaScript来实现。 但是,这些前端检查都可以被攻击者绕过,因此还需要在服务器端进行进一步的检查和过滤。在服务器端,可以采取以下措施来防止文件上传漏洞的发生: 1. 验证文件类型:在服务器端,应该再次验证文件类型,以确保文件类型符合预期。 2. 验证文件大小:在服务器端,应该再次验证文件大小,以确保文件大小符合预期。 3. 验证文件内容:在服务器端,应该对文件内容进行检查,以确保文件中不包含恶意代码或者其他危险内容。 总之,前端检查只是一种基本的防御措施,但是还需要在服务器端进行更加严格的检查和过滤,以确保文件上传漏洞不会发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值