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

三、一点思考

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

你可能感兴趣的:(渗透)