作者:
瞌睡龍
·
2013/07/30 15:05
0x00 SVN介紹
Subversion,簡稱SVN,是一個開放原始碼的版本控制系統,相對於的RCS、CVS,採用了分支管理系統,它的設計目標就是取代CVS。網際網路上越來越多的控制服務從CVS轉移到Subversion。
Subversion的官方網站是:http://subversion.tigris.org/
中文的網站:Subversion中文站、SVNBook 正體中文版、Subversion中文社群、中文SVN技術資料。
這些網站都提供了非常詳細、多樣的說明文件,有時間大家可以逐一細查。
Subversion使用服務端—客戶端的結構,當然服務端與客戶端可以都執行在同一臺伺服器上。在服務端是存放著所有受控制資料的Subversion倉庫,另一端是Subversion的客戶端程式,管理著受控資料的一部分在本地的對映(稱為“工作副本”)。在這兩端之間,是透過各種倉庫存取層(Repository Access,簡稱RA)的多條通道進行訪問的。這些通道中,可以透過不同的網路協議,例如HTTP、SSH等,或本地檔案的方式來對倉庫進行操作。
0x01 安裝配置
安裝SVN
#yum install subversion
測試是否安裝成功
#svnserve --version
如果顯示了版本資訊則表示安裝成功
建立倉庫
#svnadmin create /home/svn/repo
給svn設定密碼
修改配置檔案/home/svn/repo/conf/svnserve.conf
去掉
#[general]
前面的#號
匿名訪問的許可權,可以是read,write,none,預設為read
anon-access = none
認證使用者的許可權,可以是read,write,none,預設為write
auth-access = write
密碼資料庫的路徑
#password-db = passwd
去掉前面的#
修改配置檔案passwd
#vim /home/svn/repo/conf/passwd
=前面是使用者名稱,後面是密碼:
[users]
name = password
啟動SVN伺服器
對於單個程式碼倉庫
#svnserve -d -r /home/svn --listen-host 192.168.1.100
svn預設埠是3690,在防火牆上開放這個埠。
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 3690 -j ACCEPT
/sbin/service iptables save
把/var/www/html/目錄匯入到svn的repo目錄下
svn import /var/www/html/ file:///home/svn/repo -m "test"
0x02 注意的問題
1、檢出(匯出結果帶.svn資料夾的目錄樹)
svn co http://路徑 [本地目錄全路徑] --username 使用者名稱 --password 密碼
svn co svn://路徑 [本地目錄全路徑] --username 使用者名稱 --password 密碼
svn checkout http://路徑 [本地目錄全路徑] --username 使用者名稱
svn checkout svn://路徑 [本地目錄全路徑] --username 使用者名稱
如果不帶--password 引數傳輸密碼的話,會提示輸入密碼,建議不要用明文的--password 選項。
其中 username 與 password前是兩個短線,不是一個。
不指定本地目錄全路徑,則檢出到當前目錄下。
2、匯出(匯出一個乾淨的不帶.svn資料夾的目錄樹)
svn export [-r 版本號] http://路徑 [本地目錄全路徑] --username 使用者名稱
svn export [-r 版本號] svn://路徑 [本地目錄全路徑] --username 使用者名稱
svn export 本地檢出的(即帶有.svn資料夾的)目錄全路徑 要匯出的本地目錄全路徑
第一種從版本庫匯出乾淨工作目錄樹的形式是指定URL。
如果指定了修訂版本號,會匯出相應的版本。
如果沒有指定修訂版本,則會匯出最新的,匯出到指定位置。
如果省略 本地目錄全路徑,URL的最後一部分會作為本地目錄的名字。
第二種形式是指定 本地檢出的目錄全路徑 到 要匯出的本地目錄全路徑,所有的本地修改將會保留。
但是不在版本控制下(即沒提交的新檔案,因為.svn資料夾裡沒有與之相關的資訊記錄)的檔案不會複製。
現實的開發環境中,強烈建議使用匯出功能svn export而不是svn co。
由此可能導致非常嚴重的問題,很多管理員直接吧svn co出來的程式碼直接放到web目錄下。
這就使.svn隱藏資料夾被暴露於外網環境,駭客可以藉助其中包含的用於版本資訊追蹤的“entries”檔案,逐步摸清站點結構。
更嚴重的問題在於,SVN產生的.svn目錄下還包含了以.svn-base結尾的原始碼檔案副本(低版本SVN具體路徑為text-base目錄,高版本SVN為pristine目錄),如果伺服器沒有對此類字尾做解析,駭客則可以直接獲得檔案原始碼。
如果解析了該字尾,可能會有檔案解析的漏洞,可能會有擴充套件解析漏洞,找地方上傳xxx.php.gif也許就可以直接得到webshell了。
如果已經線上的生產環境已經有了.svn目錄不想刪掉可以在伺服器上設定禁制訪問此目錄:
另外svn更新至1.7+ .svn/entries目錄就不包含檔案目錄列表了。
Apache:
<Directory ~ "\.svn">
Order allow,deny
Deny from all
</Directory>
Nginx:
location ~ ^(.*)\/\.svn\/ {
return 404;
}
附上個遍歷.svn/entries展現網站目錄結構的兩個指令碼:
svn遍歷指令碼.zip
wooyun上也是已經有非常多的svn洩露網站資訊的事件,有的甚至由此導致整個伺服器淪陷:
WooYun: 【盛大180天滲透紀實】第四章.SVN獵手 (某站SVN資訊洩露+設計問題導致伺服器淪陷)
WooYun: 愛拍svn洩露,有被脫褲危險,想起了csdn....
WooYun: 優酷某分站SVN資訊及某sql檔案洩漏
WooYun: 淘寶網某應用svn資訊導致程式碼洩露
WooYun: 鮮果網怕是所有應用要淪陷了?
參考:
Subversion快速入門教程
使用Subversion進行版本控制
用Apache和Subversion搭建安全的版本控制環境
centos svn安裝及配置與使用
linux下svn常用指令
WooYun: .svn目錄未設許可權限制的漏洞利用總結
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!