文章目录
漏洞简介
漏洞复现
漏洞检测
脚本检测
漏洞修复
漏洞简介
SVN(subversion)是程序员常用的源代码版本管理软件。在使用 SVN 管理本地代码过程中,使用 svn checkout 功能来更新代码时,项目目录下会自动生成隐藏的.svn文件夹(Linux上用 ls 命令看不到,要用 ls -al 命令),其中包含重要的源代码信息。
造成SVN源代码漏洞的主要原因是管理员操作不规范,一些网站管理员在发布代码时,不愿意使用“导出”功能,而是直接复制代码文件夹到WEB服务器上,这就使得.svn隐藏文件夹被暴露于外网环境,黑客对此可进一步利用:
可以利用其中包含的用于版本信息追踪的 entries 文件(.svn/entries 文件),获取到服务器源码、svn服务器账号密码等信息;
可以利用 wc.db 数据库文件(.svn/wc.db 文件),获取到一些数据库信息;
更严重的问题在于,SVN产生的.svn目录下还包含了以.svn-base结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录),如果服务器没有对此类后缀做解析,则可以直接获得文件源代码。
漏洞危害
一旦网站出现SVN漏洞,其危害远比SQL注入等其它常见网站漏洞更为致命,因为黑客获取到网站源代码后,一方面是掠夺了网站的技术知识资产,另一方面,黑客还可通过源代码分析其它安全漏洞,从而对网站服务器及用户数据造成持续威胁(git同理)。
SVN目录
此图来自其他博客,分析下各个文件:
entries 和 format 文件里面,只有个数字12,没什么参考意义;
wc.db-journal 和 tmp 文件都是空的,也没什么价值;
pristine 文件夹里有若干个 .svn-base 文件,看来这个文件夹是整个项目文件的一份备份,只是一堆哈希过的文件名,似乎有点难下手啊;
wc.db文件:用SQLiteStudio软件打开 wc.db文件,可以看到 NODES 表,历这个表里的每一行,就可以下载到整个项目里的代码了,而且还能得到对应的真实文件名。
另外补充一下SVN不同版本的一下差异:
1、在 svn1.6 及以前版本会在项目的每个文件夹下都生成一个.svn文件夹,里面包含了所有文件的备份,文件名为 .svn/text-base/文件名.svn-base ;
2、在 svn1.7 及以后版本则只在项目根目录生成一个.svn文件夹,里面的pristine文件夹里包含了整个项目的所有文件备份。
漏洞复现
下面利用墨者学院现成的靶场环境进行演示:
访问靶场环境如下:
漏洞检测
1、最简单的检测方法是直接在网站路径后面 + /.svn/entries,存在漏洞会显示数字“12”,如下图所示:
2、实际工作过程中,可以使用 dirsearch 进行路径扫描:
3、下载并分析 wc.db 文件:
用 SQLiteStudio 软件打开 wc.db文件,我们看到 NODES 表,遍历这个表里的每一行,就可以下载到整个项目里的代码了,而且还能得到对应的真实文件名:
除了NODES表以外,还可以看到一个 REPOSITORY表,里面存储了svn的项目路径和 uuid,如果没有做访问IP限制的话,你可以直接使用此信息取得此项目的SVN权限(下载、提交等)…
脚本检测
Github脚本下载:svnExploit:
1、检测是否存在漏洞 python SvnExploit.py -u http://xxxxxx.com/.svn :
2、下载网站源码:python SvnExploit.py -u http://xxxxxx.com/.svn --dump :
3、此时可以在脚本文件的目录下找到网站源码文件:
漏洞修复
1、不要使用svn checkout和svn up更新服务器上的代码,使用svn export(导出)功能代替;
2、服务器软件(Nginx、apache、tomcat、IIS等)设置目录权限,禁止访问.svn目录;
3、删除 /.svn 文件夹,注意,不只svn,git 或者其他版本管理软件也存在类似的问题。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_39190897/article/details/109306693