成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

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

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

Port : 80

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

漏洞分析

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

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

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

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

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

  2. 服務(wù)器根據(jù) Project.json 文件創(chuàng)建一個新的項目,并將對應(yīng)的項目文件拷貝到服務(wù)器上對應(yī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 文件的時候服務(wù)器就會根據(jù)軟鏈接讀取到 /etc/passwd 的第一行內(nèi)容并賦值給 version。但是由于 version 與當前版本不相同,所以會輸出 version 的值,也就是 /etc/passwd 第一行的內(nèi)容。

但是,如果只讀取任意文件的第一行,能做的事情還是太少了。漏洞發(fā)現(xiàn)者顯然不滿足這一結(jié)果,他繼續(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 獲取到任意文件的內(nèi)容,但是由于獲取的文件不是 json 格式,無法 decode,導致異常拋出,最終在前端顯示出任意文件的內(nèi)容。 添加軟鏈接并打包:

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 及以上內(nèi)存的 vps 或虛擬機運行該環(huán)境,實測 1G 內(nèi)存的機器無法正常運行 Gitlab(運行后 502 錯誤)。

漏洞復現(xiàn)

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

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

新建一個項目,點擊 GitLab export

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

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

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

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

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

漏洞修復

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

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

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

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

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

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

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

廣告

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

成都做網(wǎng)站
安岳县| 攀枝花市| 威信县| 子洲县| 桃江县| 安庆市| 台前县| 义马市| 元阳县| 永胜县| 佳木斯市| 望城县| 禹城市| 韩城市| 碌曲县| 盐津县| 翁源县| 石柱| 谷城县| 德昌县| 六安市| 天全县| 合川市| 论坛| 夏津县| 公主岭市| 都江堰市| 松溪县| 娱乐| 汝阳县| 洪雅县| 林西县| 大洼县| 桦甸市| 施秉县| 仪陇县| 修水县| 营山县| 大埔县| 宣城市| 静安区|