@1kbfree
2019-01-18T15:17:47.000000Z
字数 2644
阅读 1602
基础
文件上传漏洞是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、检查扩展名
就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传
在检查扩展名是否合法的时候,有两种策略:
<?phpif ($_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文件可以上传
<?phpif ($_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、检查文件类型
<?phpif ($_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
通过过程我写了笔记,如下: