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委託得那一行:
" "
可以看到,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-contextviewbox 0 0 640 480fill '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-contextviewbox 0 0 640 480fill '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
以上所述是小編給大家介紹的ImageMagick命令執行漏洞的知識,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對指令碼之家網站的支援!