2010-05-17 36 views
2

我注意到,用戶一直在嘗試通過頭像圖片上傳來創建漏洞利用。當用戶向我反饋說他們從諾頓反病毒軟件獲得了一個聲明「HTTP可疑可執行映像下載」的通知時發現了這一情況。此警告引用用戶的頭像圖像。我認爲他們實際上並沒有以竊取信息或任何類似的方式取得任何成就,但我認爲如果洞被打開的時間足夠長的話,這可能是可能的。我使用PHP上傳圖像文件,並檢查上傳的文件是否爲png,jpg,bmp或gif。可執行圖像(PHP)的塊上傳

這是檢查它是否是一個圖像的代碼:

$allow_types = array('image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/png', 'image/bmp', 'image/bitmap'); 
if (in_array($this->tmp_image['type'], 
$this->allow_types)) { 
    return true; 
} 

回答

6

沒有辦法阻止上傳惡意文件。你需要關心的是你如何處理這些文件。

重新保存圖像文件等建議註定要失敗。通過對比特進行排序,可以繞過這種操作,以便在已知的圖像壓縮器運行後它們按照攻擊者的要求排列。

有很多方法來組合圖像和惡意文件。惡意文件可能是可執行文件,或者只包含由瀏覽器解釋的JavaScript。此外,你應該如何重新保存不是圖像類型的文件?

處理文件上傳時,必須注意以下幾點。

  • 限制每個用戶上傳的字節數量,以便您的服務器不會耗盡空間。

  • 限制每個用戶上傳的文件數量,以便您的服務器不會耗盡inodes。

  • 將文件存儲在文檔根目錄上方,以便它們不能直接訪問。

  • 通過PHP代理腳本即成您的文件,寫類似:

    $data = file_get_contents('/home/account/files/file.png'); 
    header('Content-Type: image/png'); 
    header('Content-Length: '. strlen($data)); 
    header('X-Content-Type-Options: nosniff'); 
    echo $data; 
    
  • 重命名上傳的文件有一個完全隨機的名稱沒有擴展名。如果您需要存儲文件名(和擴展名/類型),請將詳細信息存儲在數據庫中。

  • 如果需要,只有在用戶有權獲取文件時才提供文件。

  • 永遠不要包含/執行您上傳的文件。這意味着不包含或需要PHP。沒有包含它們的HTML腳本標籤或樣式表標籤。沒有Apache Include命令包括它們。等等。

  • 如果可能,請提供其他來源的文件。這消除了大多數Flash發生的問題。使用不同的端口,域名或IP地址也很好。從子域服務是危險的,使用IP地址的實現變得稍微困難​​一點(即,您不能通過域來提供文件,只能通過IP,並且不能通過IP爲域名提供服務)。

  • 謹防LFI和RFI。在使用fopen()read()等函數中的文件名之前重命名文件名,並根據需要驗證/清理任何目錄值。

0

使用imagecreatefromjpeg(和其他imagecreatefrom *)來檢查傳送的數據是實際的圖像。 EXE不會通過。

+1

和getimagesize可能是因爲它不會加載資源更好的選擇。 – buggedcom 2010-07-19 15:32:37

2

最簡單的解決方案是重新採樣圖片。獲取一個簡單的圖像處理庫(GD)並加載重新保存圖像,它應該有效地去除任何可執行的內容,或者只是很難 - 如果圖像只是一個重命名的exe。

+0

重新啓動是過度操作。如果它被屏蔽了exe,它將在打開時失敗 – Andrey 2010-05-17 19:17:04

+2

這不是一個過度的操作。某些文件格式(主要是gif)允許您在文件中嵌入非圖像數據。唯一可行的方法就是加載並重新保存。 – ircmaxell 2010-05-17 19:22:13

+0

是的,重新保存是爲了殺死額外的嵌入數據,如果圖像是圖像+可執行的。 – Aren 2010-05-17 20:18:59