@1kbfree
2019-01-18T23:17:47.000000Z
字数 2644
阅读 1190
基础
文件上传漏洞是web
漏洞中危害大大滴那个,如果遇到这个漏洞的话可以直接上传恶意的代码,获取目标机的webshell
来达到控制目标服务器的权限。
原因:
1 对于上传文件的后缀名(扩展名)没有做较为严格的限制
2 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查
3 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)
4 对于web server对于上传文件或者指定目录的行为没有做限制
1、前端限制
function check(){
var filename=document.getElementById("file");
var str=filename.value.split(".");
var ext=str[str.length-1];
if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif'){
return true;
}else{
alert("这不是图片!")
return false;
}
return false;
}
2、检查扩展名
就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传
在检查扩展名是否合法的时候,有两种策略:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else{
$file = $_FILES["file"]["name"];
$file_exp = explode('.',$file)[1];
if ( $file_exp === 'php' or $file_exp === 'asp' or $file_exp === 'jsp' or $file_exp === 'aspx'){
echo '<h3>上传失败!</h3>'."<br>";
exit;
}else{
echo '<h3>上传成功!</h3>'."<br>";
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]."<br>";
move_uploaded_file( $_FILES["file"]["tmp_name"],'file/'.$file );
echo "上传后的文件:" . "http://127.0.0.1/file/" . $_FILES["file"]["name"];
}
}
?>
但是可以上传php3
绕过,所以黑名单策略非常不安全。
也可以用大写绕过,总之很多办法~
白名单策略就比较安全,因为这个是只能让xxx
文件可以上传
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else{
$file = $_FILES["file"]["name"];
$file_exp = explode('.',$file)[1];
if ( $file_exp === 'png' or $file_exp === 'gif' or $file_exp === 'jpg' or $file_exp === 'bmp'){
echo '<h3>上传成功!</h3>'."<br>";
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]."<br>";
move_uploaded_file( $_FILES["file"]["tmp_name"],'file/'.$file );
echo "上传后的文件:" . "http://127.0.0.1/file/" . $_FILES["file"]["name"];
}else{
echo '<h3>上传失败!</h3>'."<br>";
exit;
}
}
?>
这种一般只能有解析漏洞才能绕过~
3、检查文件类型
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else{
$file = $_FILES["file"]["name"];
$file_exp = explode('.',$file)[1];
$file_type = 'application/octet-stream';
if ( $_FILES["file"]["type"] != $file_type ){
echo '<h3>上传失败!</h3>'."<br>";
exit;
}else{
echo '<h3>上传成功!</h3>'."<br>";
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]."<br>";
move_uploaded_file( $_FILES["file"]["tmp_name"],'file/'.$file );
echo "上传后的文件:" . "http://127.0.0.1/file/" . $_FILES["file"]["name"];
}
}
?>
可以利用抓包来修改他的类型。
靶场下载地址:
https://github.com/c0ny1/upload-labs
通过过程我写了笔记,如下: