2017-01-08 81 views
0

我注意到,PHP Imagick在處理PNG時改變了IDAT塊。 這到底如何?是否有可能創建保持不變的IDAT塊?是否有可能預測Imagick的結果?PHP Imagick對PNG IDAT塊的重新解釋

背景資料這個問題: 我不知道下面的代碼(PHP文件上傳的一部分)是否能防止PNG圖像隱藏PHP代碼(例如webshel​​ls):

$image = new Imagick('uploaded_file.png'); 
$image->stripImage(); 
$image->writeImage('secure_file.png'); 

評論被剝離出來,所以繞過此過濾器的唯一方法是將PHP有效內容隱藏在IDAT塊中。如here所述,理論上可行,但Imagick以某種方式重新解釋此圖像數據,即使我將CompressionCompressionQuality設置爲我用於創建PNG的值。我還設法創建了一個PNG,它的ZLIB頭由Imagick保持不變,但原始壓縮圖像數據沒有。我得到相同輸入和輸出的唯一PNG是之前通過Imagick的PNG。我也試圖在source code中找到原因,但找不到它。

我知道其他檢查是必要的,以確保上傳的文件實際上是一個PNG等,如果服務器配置正確,但PNG中的PHP代碼沒有問題,但現在我只是感興趣在這個問題上。

回答

1

IDAT塊可以變化,仍然產生相同的圖像。不幸的是,PNG規範迫使IDAT塊形成一個連續的數據流。這意味着數據可以以不同方式分組/分塊,但重新組合爲單個數據流時將會完全相同。實際數據是不同的還是隻是「塊」改變?如果以後,如果圖像相同,爲什麼它很重要? PNG是一種無損壓縮類型,剝離元數據,甚至解壓縮+重新壓縮圖像都不應改變任何像素值。

如果您比較壓縮數據並期望它是相同的,則它可能會不同並仍然會生成相同的圖像。這是因爲FLATE壓縮使用迭代過程來查找以前數據中的最佳匹配。您提供的「質量」數字越高,搜索匹配的次數越多,並縮小輸出數據大小。使用zlib時,9級deflate請求將比默認值需要更長的時間,並導致輸出數據的大小稍小。

所以,請回答下列問題:

1)你是不是想前/壓縮的數據進行比較,你帶手術後,看是否不知何故影像切換?如果是這樣,那麼查看壓縮數據並不是做到這一點的方法。

2)如果你想剝離元數據而不改變圖像文件的其他方面,那麼你需要自己編寫工具。實際上,瀏覽PNG塊並在跳過要移除的塊時重新組合新文件是很簡單的。

回答我的問題,我會用更多的細節更新我的答案...

+0

感謝您的回答。 1)strip操作本身不會改變IDAT塊,它只是刪除tEXt塊等等。它是Imagick的構造函數,正確地放置輸入文件(因爲實際的像素數據保持不變),但使用其他參數再次放氣(編寫輸出文件)。我想知道在這裏使用哪些參數(例如哪個壓縮級別,哪個歷史緩衝區(或窗口大小)以及哪個壓縮策略)生成PNG,其將具有完全相同的二進制數據(至少在IDAT塊中)由Imagick處理。 – user7390973

+0

如果使用ImageMagick來創建原始文件,那麼您可能有機會。如果使用其他工具,則可能無法生成相同的PNG文件。如果你只是剝離元數據,那麼解壓縮和重新壓縮圖像是CPU時間的可怕浪費。更糟糕的是,ImageMagick通常是一組非常慢的函數。沒有辦法訪問所有這些參數。 IM使用zlib和單個參數(壓縮級別)來生成flate數據。 – BitBank

+0

2)我不打算找到(或寫)一個可以做到這一點的工具,實際上我正在尋找相反的東西。我設法對GD做了完全相同的事情,所以我知道在這一點上它不是「安全的」(儘管在漏洞利用中必須有其他漏洞使用這樣的PNG)。但只有我不能用Imagick做同樣的事情並不能證明這是不可能的。所以我問了這個問題來澄清它是否在理論上可行。 – user7390973

0

我不知道下面的代碼(PHP文件上傳的一部分)是否能防止隱藏PHP代碼(例如webshel​​ls)在PNGs

你應該永遠不需要考慮這一點。如果您擔心人們將WebShells隱藏在上傳到服務器的文件中,那麼您做錯了什麼。

例如,通過PHP解析器提供這些文件......這是可以調用webshel​​l來攻擊服務器的方式。

從Imagick自述文件:

5)不要直接服務已直接通過PHP上傳用戶的任何文件,而不是要麼爲他們服務通過Web服務器,而無需調用PHP,或使用ReadFile的服務他們在PHP中。

readfile不執行該文件,它只是將其發送給最終用戶,而不必調用它,所以完全阻止你似乎是擔心攻擊類型。

+0

是的,我完全同意你的看法。這是我最後一段想要暗示的。儘管如此,我對這個主題有理論上的興趣(實際應用可能是CTF和安全測試)。 – user7390973