[关闭]
@1kbfree 2019-01-18T15:17:47.000000Z 字数 2644 阅读 1084

文件上传漏洞

基础


什么是文件上传

文件上传漏洞是web漏洞中危害大大滴那个,如果遇到这个漏洞的话可以直接上传恶意的代码,获取目标机的webshell来达到控制目标服务器的权限。

造成文件上传漏洞的原因以及原理

原因:
1 对于上传文件的后缀名(扩展名)没有做较为严格的限制
2 对于上传文件的MIMETYPE(用于描述文件的类型的一种表述方法) 没有做检查
3 权限上没有对于上传的文件目录设置不可执行权限,(尤其是对于shebang类型的文件)
4 对于web server对于上传文件或者指定目录的行为没有做限制

文件上传漏洞的攻击与防御方式

1、前端限制

  1. function check(){
  2. var filename=document.getElementById("file");
  3. var str=filename.value.split(".");
  4. var ext=str[str.length-1];
  5. if(ext=='jpg'||ext=='png'||ext=='jpeg'||ext=='gif'){
  6. return true;
  7. }else{
  8. alert("这不是图片!")
  9. return false;
  10. }
  11. return false;
  12. }

2、检查扩展名

就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传
在检查扩展名是否合法的时候,有两种策略:

黑名单策略:

  1. <?php
  2. if ($_FILES["file"]["error"] > 0)
  3. {
  4. echo "错误:" . $_FILES["file"]["error"] . "<br>";
  5. }
  6. else{
  7. $file = $_FILES["file"]["name"];
  8. $file_exp = explode('.',$file)[1];
  9. if ( $file_exp === 'php' or $file_exp === 'asp' or $file_exp === 'jsp' or $file_exp === 'aspx'){
  10. echo '<h3>上传失败!</h3>'."<br>";
  11. exit;
  12. }else{
  13. echo '<h3>上传成功!</h3>'."<br>";
  14. echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
  15. echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
  16. echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  17. echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]."<br>";
  18. move_uploaded_file( $_FILES["file"]["tmp_name"],'file/'.$file );
  19. echo "上传后的文件:" . "http://127.0.0.1/file/" . $_FILES["file"]["name"];
  20. }
  21. }
  22. ?>

但是可以上传php3绕过,所以黑名单策略非常不安全。

1.png-75.1kB

也可以用大写绕过,总之很多办法~

白名单策略

白名单策略就比较安全,因为这个是只能让xxx文件可以上传

  1. <?php
  2. if ($_FILES["file"]["error"] > 0)
  3. {
  4. echo "错误:" . $_FILES["file"]["error"] . "<br>";
  5. }
  6. else{
  7. $file = $_FILES["file"]["name"];
  8. $file_exp = explode('.',$file)[1];
  9. if ( $file_exp === 'png' or $file_exp === 'gif' or $file_exp === 'jpg' or $file_exp === 'bmp'){
  10. echo '<h3>上传成功!</h3>'."<br>";
  11. echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
  12. echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
  13. echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  14. echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]."<br>";
  15. move_uploaded_file( $_FILES["file"]["tmp_name"],'file/'.$file );
  16. echo "上传后的文件:" . "http://127.0.0.1/file/" . $_FILES["file"]["name"];
  17. }else{
  18. echo '<h3>上传失败!</h3>'."<br>";
  19. exit;
  20. }
  21. }
  22. ?>

这种一般只能有解析漏洞才能绕过~

3、检查文件类型

  1. <?php
  2. if ($_FILES["file"]["error"] > 0)
  3. {
  4. echo "错误:" . $_FILES["file"]["error"] . "<br>";
  5. }
  6. else{
  7. $file = $_FILES["file"]["name"];
  8. $file_exp = explode('.',$file)[1];
  9. $file_type = 'application/octet-stream';
  10. if ( $_FILES["file"]["type"] != $file_type ){
  11. echo '<h3>上传失败!</h3>'."<br>";
  12. exit;
  13. }else{
  14. echo '<h3>上传成功!</h3>'."<br>";
  15. echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
  16. echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
  17. echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
  18. echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]."<br>";
  19. move_uploaded_file( $_FILES["file"]["tmp_name"],'file/'.$file );
  20. echo "上传后的文件:" . "http://127.0.0.1/file/" . $_FILES["file"]["name"];
  21. }
  22. }
  23. ?>

可以利用抓包来修改他的类型。

靶场练习

靶场下载地址:
https://github.com/c0ny1/upload-labs

通过过程我写了笔记,如下:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注