Upload-Lab Pass01(前端JS过滤)
文件上传漏洞的危害大家都知道了,攻击者通过文件上传漏洞上传恶意可执行脚本可以达到获取服务器shell的目的。
文件上传漏洞的防御分为前端验证和后端验证。
前端是通过文件名信息进行验证,普通开发者可能会在前端以黑名单的方式过滤文件后缀名,黑名单也会出现遗漏情况,所以前端防御建议使用白名单过滤的方式,当然,前端的过滤方式一旦修改了js文件就不起作用了。
后端验证就是通过MIME类型验证、文件后缀验证、文件路径验证、文件内容验证这几种方式。
Upload-Lab是文件上传漏洞利用的靶场,我们可以利用这个靶场学习文件上传漏洞相关知识,同时可以通过相关源码分析漏洞产生的原因。
文件上传漏洞测试的思路就是先测试是否为前端验证,再测试后端验证。
Pass-01
首先我们看到pass-01,我们可以先尝试上传 .php
文件,测试是否存在前端验证。
我们上传一句话木马文件ass.php
,这里我们看到前端页面提示该文件不允许上传,我们可以判断出当前页面是在前端对上传文件后缀进行了过滤。
打开查看器,查看网页源代码,可以发现当前上传模块调用了JS中的checkFile方法。
我们删除onsubmit触发器,不调用JS方法,再次测试上传,发现上传成功。
上传成功后我们可以复制链接地址,使用菜刀或者蚁剑进行连接。
代码分析如下:
前端JS中使用了checkFile方法,在这个方法中定义了允许上传的文件格式类型,也就是说只有满足了这三种文件后缀名才能够允许上传,这里我们是把这个前端方法直接给删除了,这里大家要记住一点,凡是在前端做的操作都是可以绕过的,因为这部分是用户可控的部分,用户想怎么做就怎么做。
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;
}
}