CVE-2021-22205:Gitlab Exiftool RCE分析之二:從認證后RCE到未授權RCE之旅
認證后命令執行
Gitlab本身包含圖片上傳功能,所以按照上文構造思路,很容易實現RCE。
首先修改djvu命令為curl指令,生成文件后修改為圖片后綴名。

使用用戶登錄Gitlab,新建一個工程。

然后建一個issue,點擊`attach a new file`導入圖片,命令隨即被執行。

新建issue和工程需要用戶權限,存在一定的限制。
認證繞過探索
通常來講,像Gitlab這樣通用的框架圖片上傳解析應該都是需要認證的,但是經過深入分析,發現了無需認證的接口。由于信息并沒有公開,這里嘗試利用自己的思路尋找一種無需認證圖片上傳的辦法,復盤整個漏洞分析過程。
查閱Gitlab官方文檔:
user_file_uploads.html
https://docs.gitlab.com/ee/security/user_file_uploads.html
在`Administrator users/User file uploads`中說明了用戶文件上傳的規則,其中`Non-image attachments do require authentication to be viewed`這句話顯得很突出。大體來說就是Gitlab為了支持電子郵件正文中圖片的處理,設計上認為圖片上傳無需用戶認證。

從Gitlab官網下載v13.10.2-ce版本源碼,全文搜索`upload`和`user`字段,找到了`/uploads/user`接口:

全文搜索`/uploads/user`,在routes.go中找到路由映射:

按照`snippetUploadPattern`往后跟并沒有找到引用鏈,而`/uploads/user`接口處理代碼位于`uploads_controller`中。

測試`/uploads/user/`GET請求返回404,但POST請求返回422錯誤:

使用`gitlab-ctl tail`命令查看日志,顯示`InvalidAuthenticityToken`。

搜索代碼,請求必須必須加上`HTTP_X_CSRF_TOKEN`。

添加X-CSRF-TOKEN后顯示404:

嘗試向該接口發送圖片文件,然后抓包修改報文,將登錄用戶的Cookie和XSRF-TOKEN設置好,詭異得返回了`Faild to Process image`,說明圖片已經被處理,而且不驗證傳輸文件的變量名:

以上步驟還是需要用戶認證的,那么怎樣不需要認證呢。查看登錄頁面`/users/sign_in`,同樣返回了Cookie信息,且頁面中包含csrf-token:

使用登錄頁面返回的Cookie值和csrf-token值,成功實現RCE。

至此未授權圖片解析復現成功,進而實現RCE,這里就不進行代碼分析了,有興趣的小伙伴可以自行下載源代碼調試學習。
漏洞修復
主要修補了exif圖片處理模塊。

修補后,請求返回404。

最后記得升級GitLab到最新版本。