jQuery-File-Upload—三個漏洞的故事

翻譯自:https://blog.detectify.com/2018/12/13/jquery-file-upload-a-tale-of-three-vulnerabilities/
翻譯:聶心明

在github上星個數第二多的JavaScript項目中有兩個遠程命令執行漏洞,並且星數第三多的那個項目可能會通過jQuery-File-Upload任意刪掉被上傳的文件。後者是有意的行爲,我們的安全研究員警告過他們,用戶的隱私內容會被外部人員隨意查看,這是對用戶隱私及其不尊重的。Detectify Crowdsource已經在 jQuery-File-Upload找到三個安全漏洞了,並且這些漏洞已經被安全研究員提交了我們的社區中,並且我們已經在我們的漏掃工具Detectify中實現了檢測。我們的研究員發現,jQuery-File-Upload廣泛存在於各種平臺中,並且很多都沒有被正確配置。下面是CVE-2018-9206的poc:未授權任意文件上傳漏洞和基於ImageTragick的遠程命令執行漏洞。下面是這三個漏洞的說明

https://youtu.be/JXxUWj5ybUk

CVE-2018-9206 未授權任意文件上傳漏洞

第一個漏洞在2015年的時候就已經被發現了。但是,在2018年的時候才被分配cve編號,並且通過《Thousands of Applications were vulnerable to RCE via jQuery File Upload》才被大家所熟知。jQuery-File-Upload是一個開源的文件上傳組件,在github上是星數第二多的JavaScript項目,星數第一多的項目是jQuery JavaScript。CVE-2018-9206的核心問題在於服務器配置和php的組件技術,不是JavaScript的問題。當然,這個問題最後成爲JavaScript的漏洞讓人覺得有點不可思議,但如果這個是php的文件就不會讓人感到驚訝。這個漏洞依賴於Apache服務器中.htaccess的配置。這個配置文件會限制文件的上傳或者文件的執行。

# The following directives prevent the execution of script files
# in the context of the website.
# They also force the content-type application/octet-stream and
# force browsers to display a download dialog for non-image files.
SetHandler default-handler
ForceType application/octet-stream
Header set Content-Disposition attachment

# The following unsets the forced type and Content-Disposition headers
# for known image files:
<FilesMatch "(?i)\.(gif|jpe?g|png)$">
ForceType none
Header unset Content-Disposition
</FilesMatch>

<...>

上面是jQuery-File-Upload的.htaccess文件,並且存在於9.22.0版本之前,爲了防範文件上傳漏洞。.htaccess可以設置MIME的類型爲application/octet-stream,從而讓瀏覽器下載服務器上的文件而不是去執行它們。這就意味着Query-File-Upload 允許任意文件上傳,但是不能在服務器上執行它們,因爲它們信任web服務器對此做了檢查。修補之後,後面的版本檢查了文件的上傳類型。可是問題是,在Apache的2.3.9版本中,Apache默認不再支持.htaccess了。如果沒有被明確的開啓的話,這個保護措施是無效的。如果使用了另一種web容器的話(比如Nginx),那麼基於.htaccess文件的保護則完全無效。攻擊者可以上傳任意文件到服務器中,然後控制這臺服務器。如果攻擊者上傳一個後綴爲php的文件,那麼就可以執行它了。

基於ImageTragick的遠程命令執行

jQuery-File-Upload的第二個漏洞在黑客社區中被廣爲所知,這個漏洞一直沒有被公開,因爲CVE-2018-9206的出現,這個漏洞才被大家所關注,之後越來越多的人開始研究jQuery-File-Upload的代碼庫。因爲代碼使用了ImageMagic,攻擊者可以使用GhostScript來執行任意代碼(CVE-2016-3714 AKA ImageTragick)。這裏有個演示視頻。攻擊者會把下面的GhostScript保存成後綴爲PNG, GIF 或者JPG的文件,然後再把他們上傳到服務器中。

 %!PS
userdict /setpagedevice undef
save
legal
{ null restore } stopped { pop } if
{ legal } stopped { pop } if
restore
mark /OutputFile (%pipe%ping example.com) currentdevice putdeviceprops

服務器會執行ping example.com這個指令,注意,在不同的操作系統中GhostScript可能看着會有一些不同,但是ping指令可以運行在大多數的環境中,這樣就可以利用自動化的手段來發現存在的漏洞。注意,這個漏洞是jQuery-File-Upload庫使用的問題,不是代碼本身的問題。

一個有意爲之的漏洞

第三個也是最後一個漏洞是不安全的對象引用,或者稱之爲 IDOR vulnerability,一個站長報告過這個問題,但是issue中明確寫着這是一種“有意的功能”,但是很多jQuery-File-Upload 用戶不知道這一特性,也不知道這一特性的風險。這就是爲什麼:向文件上傳接口發送get請求,服務器就會返回一組json數據,裏面包含所有之前上傳的文件。這就會暴露文件的名稱,上傳的路徑,縮略圖路徑還有就是可能會造成文件的刪除。返回報文就像下面這樣:

{"files":[{"name":image.jpg","size":68549,"url":"http:\/\/example.com\/image.jpg","thumbnailUrl":"http:\/\/example.com\/thumbnail\/image.jpg","deleteUrl":"http:\/\/example.com\/server/php?file=image.jpg","deleteType":"DELETE"}

通過返回報文,用戶就可以通過url字段的內容看到之前上傳過的文件。也可以通過發送DELETE請求來刪除所有的文件,發送的請求就像下面這樣:

curl -X DELETE http://example.com/server/php?file=image.jpg

當我們看到網站使用jQuery-File-Upload時,就可以故意的去訪問這個“有意的漏洞”了。如果這個網站是一個約會網站,用戶肯定會很自然的上傳自己的圖片。通過發送這樣的請求,我們就可以看到所有用戶上傳的圖片了。另一個例子是如果這個網站通過上傳用戶的身份證或者護照來驗證用戶身份的話,我就可以用這樣的請求來獲得所有的圖片。我已經聯繫過 Sebastian Tschan了(jQuery-File-Upload的主要維護者),並且所有的網站都發現了這樣的漏洞。

修復

最開始提到的兩個漏洞已經在jQuery-file-upload後續的版本修復了。我建議大家趕緊升級到最新的版本。爲了修復最後一個漏洞,你應該嚴格限制文件上傳接口的權限(通常在server/php/index.php),所有上傳的文件不應該被公開可見。你是否在你的網站上安裝了jQuery-File-Upload?並且你不確定你的網站代碼是否安全。那麼現在你應該來試試Detectify。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章