上傳文件漏洞 轉

有時候上傳文件即使做了文件大小和後綴的校驗,依然會被攻擊到。

上傳文件漏洞就是一種常見的web漏洞,攻擊者可以用利用服務器端的上傳文件漏洞繞過安全驗證將代碼提交到服務器端,並想辦法讓代碼文件被執行。一單可執行的代碼上傳成功,會造成比較嚴重的安全問題,比如獲取服務器權限,爲攻擊者開後門,或者讓服務器超載,破快服務器的可用性,甚至是上傳病毒,木馬。

上傳文件漏洞例子:

我們通過一個例子演示利用文件上傳漏洞進行攻擊的例子,下面的代碼負責接受上傳文件,並保存在 ./uploads/ 目錄中(在單機應用的場景下,文件和應用程序保存在一起是比較常見的)。

<?php
//上傳文件路徑
$upload_path = "./uploads/";
$upload_file_path = $upload_path . basename($_FILES['uploadedfile']['name']);

$size = $_FILES['uploadedfile']['size'];
$type = $_FILES['uploadedfile']['type'];

//驗證文件大小和文件類型
if ($size < 1000000 && ($size == 'image/jpeg' || $size == 'image/png')) {

    print_r($_FILES['uploadedfile']);
    echo "\n";

    if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $upload_file_path)) {
        echo "上傳成功\n";
    } else {
        echo "上傳失敗\n";
    }
}
?>

上面的代碼有基本的校驗邏輯,比如文件大小驗證,和文件類型驗證,看似問題不大,其實不然。我們構造一個 php 腳本,代碼如下,通過 curl 命令僞造成圖片類型並上傳。

PHP 腳本,文件名爲 attack.php

<?php
echo "attack success !!!";
?>

使用 curl 命令上傳文件,並將 Content-Type 改成 image/jpeg

$ curl 'http://192.168.56.101/upload.php'  -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryCHKmsM8kfbHlN8Ff' --data-binary $'------WebKitFormBoundaryCHKmsM8kfbHlN8Ff\r\nContent-Disposition: form-data; name="uploadedfile"; filename="attack.php"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundaryCHKmsM8kfbHlN8Ff--\r\n'

Array
(
    [name] => attack.php
    [type] => image/jpeg
    [tmp_name] => /home/bitnami-nginxstack/php/tmp/phpjWsmp3
    [error] => 0
    [size] => 0
)

上傳成功

從結果上看,腳本文件被成功上傳到服務器上,通過 http://192.168.56.101/uploads/attack.php 可以訪問,從而達到攻擊目的,通過這種方式攻擊者可以上傳任意類型的文件。

解決上傳文件漏洞的方法:

  • 對文件類型做校驗:通過白名單方式判斷文件類型和擴展名是否是程序需要的,不過就像前面例子中介紹的,文件類型不一定可靠,容易被僞造。但作爲基礎校驗,可以防止一些低級的文件注入攻擊,也可以防止上傳一些垃圾數據,但製作文件類型校驗還是不夠的,還需要結合下面幾種方法一同使用。
  • 將經驗上傳文件和應用程序分開存儲:對於大型網站,用戶上傳的文件往往保存在單獨的服務器中,和應用程序是分開的,比如上傳到cdn服務器上,用戶保存文件的服務器只提供基本的文件存取功能,不提供腳本執行能力。另外還有對用戶上傳的數據做二次離線校驗,遇到木馬,色情圖片等文件要及時刪除,避免被正常用戶下載。
  • 對上傳的圖片進行重繪:就像上面的例子,腳本可以通過圖片執行,而圖片又是正常的圖片,可以修改文件尺寸(比如放大或縮小1個像素)、分辨率等方式重新創建一張圖片,這個重繪的過程會破壞掉原圖中的腳本。
  • 合理設置服務器權限:對於應用服務器程序,如果不在本機存儲文件,可以去掉應用程序所在目錄的寫權限。對於文件服務器,可以去掉可執行權限。(TODO,代碼)
  • 對上傳文件重命名:對上傳文件重新命名,最好具有一定的隨機性,提高攻擊成本。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章