漏洞说明:
Web应用系统虽然对用户上传的文件进行了校验,但是校验是通过前端javascript代码完成的。由于恶意用户可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件,就会导致基于js的校验很容易被绕过。
实验环境:
- 火狐浏览器
- PHPstudy
- Burp Suite抓包软件
- upload-labs-master上传漏洞靶场
- 文件上传的页面,需要前端和后端两个文件,如下:
index.html
文件
<<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
</head>
<body>
<form action="fileupload.php" onsubmit="checkupload();" method="POST" enctype="multipart/form-data">
<input type="file" name="uploadfile">
<input type="submit">
</form>
<script type="text/javascript">
function checkupload() {
var filetag = document.getElementById("uploadfile");
var filename = filetag.value;
// alert(filename)
var lastpos = filename.lastIndexof(".")+1;
// alert(lastpos);
var ext = filename.substring(lastpos);
// alert(ext);
if (ext != "jpg") {
alert("文件类型错误,上传失败");
return false;
}
}
</script>
</body>
</html>
fileupload.php
文件
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
?>
首先判断是否存在前端js绕过漏洞
按F12打开调试面板,选择网络,然后上传非图片文件,如果网络中没有数据变化说明存在js漏洞,如果有变化说明不存在。
绕过方法一:删除或者禁用js
在输入框中输入about:config
点击接受
在搜索框中输入java
然后找到javascript.enabled
选项双击,出现false
回到upload-labs-master
选择第一关上传html文件
上传成功
绕过方法二:使用代理上传文件,比如Burp Suite
在桌面创建1.php文件,写入一句话木马保存,然后将后缀名改为jpg
点击浏览选中创建好的jpg文件
然后点击上传,效果如下上传成功
使用Burp Suite
抓包
将文件格式改成php
文件,点击Forward
发送数据包
查看C:\phpStudy\PHPTutorial\WWW\upload-labs-master
下的upload
文件夹,出现1.php文件上传成功。