文件上传漏洞upload-labs靶场
文件上传靶场环境:https://github.com/c0ny1/upload-labs
Less1 前端JS绕过
0x01 Less1说明
查看源代码
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; }}
通过查看源代码发现使用了白名单,只能上传.jpg、.png、.gif三种类型的文件,但是代码是在前端实现的,也就是说服务器端没有进行校验,因此可以通过抓包来修改后缀名进行绕过。
第一关主要是在前端对上传文件的类型进行判断,在前端禁止上传非图片类型的文件。突破这种限制的方法是在本地上传jpg类型的文件,然后使用burp进行抓包,修改后缀名为php类型,即可绕过。
0x02文件上传
方法一:使用Burp进行抓包
①:本地不允许上传php类型文件
②:不允许上传php类型的文件,首先上传jpg类型的文件,使用burp进行抓包,然后再修改后缀名为php
③:修改文件后缀为php类型
④:访问该文件,并使用菜刀成功连接
方法二:删掉加检查文件类型的函数
①:打开F12,将前端检查文件类型的函数删掉,这样上传文件时就不会触发这个函数,因此就可以上传任意文件
②:可以上传php类型文件
③:上传成功,进行访问
方法三:禁用JS
①:在地址栏输入about:config,查找javascript,将javascript.enabled的类型改为false,默认值为true
②:上传任意后缀文件
③:访问该文件
0x03方法总结
这种方式是在前端使用JavaScript来限制在本地可以上传的文件类型,上传的文件类型并没有在服务器端进行校验,这样就可以抓包来修改上传的文件后缀,还可以修改前端代码,在允许上传的文件后缀名后添加上自己想要上传的文件后缀名,其实,最直接的方式是直接禁掉相关的JS代码,这样就可以上传任意类型的文件了。
Less2 MIME类型绕过
0x01 Less2说明
查看源代码
$is_upload = false;$msg = null;if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
if (move_uploaded_file($_FILES['upload_file']['tmp_name'], UPLOAD_PATH . '/' . $_FILES['upload_file']['name'])) {
$img