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

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

程序员文章站 2022-03-25 10:35:40
...

文件上传中的前端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改包的常规手法。
【文件上传】前端JS验证的绕过与思考
3、第二种方法,在文件上传之前,我们发送一个没有上传文件的请求,然后在brup处对response报文进行修改,我们可以在此处删除js代码的显示,对应下图过程3~4,最终得到一个没有JS校验源码的客户端页面,这种方法和客户端改源码达到的目的相同,但过程更加优雅。
【文件上传】前端JS验证的绕过与思考
之所以在这里提这种方法,主要是想强调一下burp使用思路,很多人在使用burp时凭经验认为burp只能对request报文修改,实际上由于默认开关关闭,让很多人忽略了这一点。我们可以通过brup的proxy—>options选项中勾选下面的√,就可以在抓包时候看到response报文并对报文进行修改了,修改完成后放过response报文后,我们再在浏览器查看源码,能够看到我们JS校验代码已经被去掉。
【文件上传】前端JS验证的绕过与思考

三、一点思考

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

相关标签: 渗透