<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    原文地址:http://drops.wooyun.org/tips/352

    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及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目錄未設權限限制的漏洞利用總結

    97av