欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Gitlab中任意文件讀取漏洞的示例分析

這篇文章主要介紹了Gitlab中任意文件讀取漏洞的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

為重慶等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及重慶網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站建設、成都做網(wǎng)站、重慶網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

Gitlab 任意文件讀取漏洞(CVE-2016-9086)

Port : 80

GitLab 是一個利用 Ruby on Rails 開發(fā)的開源應用程序,實現(xiàn)一個自托管的 Git 項目倉庫,可通過 Web 界面進行訪問公開的或者私人項目。近日研究者發(fā)現(xiàn)在其多個版本中存在文件讀取漏洞 (CVE-2016-9086) 和 任意用戶 authentication_token 泄漏漏洞,攻擊者可以通過這兩個漏洞來獲取管理員的權限,進而控制所有 gitlab 項目。

影響版本:

  • 任意文件讀取漏洞 (CVE-2016-9086):GitLab CE/EEversions 8.9, 8.10, 8.11, 8.12, and 8.13

  • 任意用戶 authentication_token 泄露漏洞:Gitlab CE/EE versions 8.10.3-8.10.5

漏洞分析

本文在前輩研究基礎上只分析任意斍讀取漏洞。

從 8.9.0 版本開始,GitLab 新增了導入導出項目的功能。一個空的 gitlab 項目導出后結構如下:

VERSION          # GitLab 的導出模塊的版本
project.json     # 包含了項目的配置文件

當我們導入 GitLab 的導出文件的時候,GitLab 會按照如下步驟處理:

  1. 服務器根據(jù) VERSION 文件內容檢測導出文件版本,如果版本符合,則導入。

  2. 服務器根據(jù) Project.json 文件創(chuàng)建一個新的項目,并將對應的項目文件拷貝到服務器上對應的位置。

檢測 VERSION 文件的代碼位于:/lib/gitlab/import_export/version_checker.rb中:

...
def check!
  version = File.open(version_file, &:readline)
  verify_version!(version)
rescue => e
  shared.error(e)
  false
end
...
def verify_version!(version)
    if Gem::Version.new(version) != Gem::Version.new(Gitlab::ImportExport.version)
        raise Gitlab::ImportExport::Error.new("Import version mismatch: Required #{Gitlab::ImportExport.version} but was #{version}")
    else
        true
    end
end
...

我們可以看到這里的邏輯是讀取 VERSION 文件的第一行賦值給變量 version,然后檢測 verison 與當前版本是否相同,相同返回 true,不相同則返回錯誤信息 (錯誤信息中包括變量 version 的值). 于是漏洞發(fā)現(xiàn)者 Jobert Abma 巧妙的使用了軟鏈接來達到讀取任意文件的目的。首先,我們給 VERSION 文件加上軟鏈接并重新打包。

ln -sf /etc/passwd VERSION
tar zcf change_version.tar.gz ./

這樣,讀取 VERSION 文件的時候服務器就會根據(jù)軟鏈接讀取到 /etc/passwd 的第一行內容并賦值給 version。但是由于 version 與當前版本不相同,所以會輸出 version 的值,也就是 /etc/passwd 第一行的內容。

但是,如果只讀取任意文件的第一行,能做的事情還是太少了。漏洞發(fā)現(xiàn)者顯然不滿足這一結果,他繼續(xù)找了下去.讀取 Project.json 這一配置文件的代碼位于:/lib/gitlab/import_export/project_tree_restorer.rb 中:

...
def restore
  json = IO.read(@path)
  tree_hash = ActiveSupport::JSON.decode(json)
  project_members = tree_hash.delete('project_members')

  ActiveRecord::Base.no_touching do
    create_relations
  end
rescue => e
  shared.error(e)
  false
end
...

在這里,我們可以再次使用軟鏈接使變量 json 獲取到任意文件的內容,但是由于獲取的文件不是 json 格式,無法 decode,導致異常拋出,最終在前端顯示出任意文件的內容。 添加軟鏈接并打包:

ln -sf /etc/passwd project.json
tar zcf change_version.tar.gz ./

測試環(huán)境

如下測試環(huán)境借助 vulhub 的 docker 鏡像,附上 P 師傅的鏈接:https://github.com/vulhub/vulhub

編譯及運行環(huán)境:

docker-compose up -d

請使用 2G 及以上內存的 vps 或虛擬機運行該環(huán)境,實測 1G 內存的機器無法正常運行 Gitlab(運行后 502 錯誤)。

漏洞復現(xiàn)

環(huán)境運行后,Web 端口為 10080,ssh 端口為 10022。訪問 http://your-ip:10080,設置管理員(用戶名 root)密碼,登錄。

Gitlab中任意文件讀取漏洞的示例分析

新建一個項目,點擊 GitLab export

Gitlab中任意文件讀取漏洞的示例分析

將 test.tar.gz上傳,將會讀取到 /etc/passwd文件內容:

Gitlab中任意文件讀取漏洞的示例分析

Gitlab中任意文件讀取漏洞的示例分析

Gitlab中任意文件讀取漏洞的示例分析

漏洞修復

官方先移除了導入包里的軟連接,其次,讀取 VERSION 的內容和 project.json 的內容出錯后將內容輸出到日志里而非返回到前端。

Gitlab中任意文件讀取漏洞的示例分析

Gitlab中任意文件讀取漏洞的示例分析

Gitlab中任意文件讀取漏洞的示例分析

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Gitlab中任意文件讀取漏洞的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!

網(wǎng)站標題:Gitlab中任意文件讀取漏洞的示例分析
標題網(wǎng)址:http://chinadenli.net/article36/pppdsg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站營銷、網(wǎng)站設計公司、網(wǎng)站排名自適應網(wǎng)站、網(wǎng)頁設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站