常见Web源码泄露

写在前面

源码泄露漏洞成因

把网站部署在某一个虚拟主机上面,然后把代码先打包压缩后上传,上传成功后再去服务器解压。虽然解决了上传速度慢的问题。但压缩包解压后如果没有删除,当攻击者发现后就可以把代码压缩包下载;因为部署到服务器上的都是源代码,这时候攻击者就可以通过代码进一步挖掘一些安全漏洞:文件上传,SQL 注入等等。

0x01 .git源码泄漏

当在一个空目录执行 git init 时,Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库,只需把这个目录拷贝至另一处就可以了。
该目录的结构:

HEAD config* description hooks/ info/ objects/ refs/
  • description 文件仅供 GitWeb 程序使用,无需关心。
  • config 文件包含项目特有的配置选项;
  • info 目录包含一个全局性排除(global exclude)文件,用以放置不希望被记录在 .gitignore
    文件中的忽略模式(ignored patterns);
  • hooks 目录包含客户端或服务端的钩子脚本(hook scripts)

下面的四个很重要:

  • HEAD 文件指示目前被检出的分支;
  • index 文件保存暂存区信息;
  • objects 目录存储所有数据内容;
  • refs 目录存储指向数据(分支)的提交对象的指针。

1、漏洞成因

在发布代码的时候,如果没有把 .git 这个目录删除,直接发布到了运行目录中。攻击者就可以通过这个文件夹,可以用来恢复源代码。
eg:

http://www.example.com/.git/

2、漏洞利用

常规利用
下载整个目录, 然后用git命令回滚整个项目:

wget -r --no-parent --mirror http://www.example.com/.git
cd www.example.com && git reset --hard

工具
GitHack

GitHack.py http://www.example.com/.git/

dvcs-ripper

rip-git.pl -v -u http://www.example.com/.git/

3、修复建议

1.删除.git
2.在Nginx添加中URL重写判断来禁止访问这个.git目录下的内容:

  rewrite ^/.git/ http://www.example.com/; #Fix git issues

配置WEB服务器(apache/nginx等)来拒绝对.git路径的访问, 但也会出现被意外绕过的风险.
最好的办法就是在项目新建一个www目录来存放源代码文件.

0x02 .hg源码泄漏

Mercurial的意思是水银,所以缩写成hg(汞), 也是一个版本管理软件.。用法和git有点类似,,但也保留了svn命令简明的特点,而且原生地支持Windows/MacOS/Linux三大平台, 不像git需要MinGW才得以运行,,所以当今也有不少人偏向于用hg做版本控制。

1、漏洞成因

hg init的时候会生成.hg
eg:

http://www.example.com/.hg/

2、漏洞利用

工具
dvcs-ripper

rip-hg.pl -v -u http://www.example.com/.hg/

3、修复建议

删除.hg

0x03 .svn源码泄漏

SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。互联网上很多版本控制服务已从 CVS 迁移到 Subversion。很多网站都使用了SVN版本控制系统,和使用 git 版本控制器类似。

1、漏洞成因

在使用SVN管理本地代码过程中,会自动生成一个名为.svn的隐藏文件夹,其中包含重要的源代码信息。但开发者在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使.svn隐藏文件夹被暴露于外网环境。

攻击者可以借助其中包含的用于版本信息追踪的entries文件,逐步摸清站点结构,并且也可以使用工具 dvcs-ripper下载网站源码。
eg:

http://www.example.com/.svn/entries

2、漏洞利用

工具

dvcs-ripper

rip-svn.pl -v -u http://www.example.com/.svn/

Seay SVN

3、修复建议

1.在web服务器配置文件中增加一段代码,过滤到.svn文件,返回404
nginx服务器:

location ~ ^(.*)\/\.svn\/
{
return 404;
}

重启nginx
Apache服务器:

Order allow,deny
Deny from all

重启Apache

2.查找服务器上所有.svn隐藏文件夹,删除

以下命令删除当前目录下.svn文件夹

find . -type d -name ".svn"|xargs rm -rf
rm -rf `find . -type d -name .svn`
find . -name ".svn" -type d | xargs rm -fr
find . -name ".svn" -type d | xargs -n1 rm -R

使用脚本删除

#!/bin/sh
cd /home/web/
find ./ -name ".svn" |xargs -n1 echo > /dev/null 2>&1
find ./ -name ".svn" -print0 | xargs -0 rm -fr
if [ $? -ne 0 ]; then
echo "remove .svn dirs failed!"
fi

以上文件保存为.sh
执行之后,会删除 /home/web目录及其子目录中 所有 .svn 隐藏文件夹。

3.在使用SVN时,严格使用导出功能。禁止直接复制代码

0x04 .CVS信息泄漏

CVS是一个年代比较久远的版本控制系统, 通过它可以追踪源代码的历史变化记录,但是因为功能比较简单, 而且不支持分支, 所以很早前就被上面提到的svn替代了。

1、漏洞成因

cvs项目在初始化(cvs checkout project)的时候, 会在project目录下创建一个名为CVS的目录,其中保存了各个文件的修改和commit记录.。通过此目录可以获取代码的历史版本.。
其中两个关键文件为:CVS/Root和CVS/Entries, 分别记录了项目的根信息和所有文件的结构。

2、漏洞利用

测试的目录

http://url/CVS/Root 返回根信息
http://url/CVS/Entries 返回所有文件的结构

取回源码的命令

bk clone http://url/name dir

命令的意思就是把远端一个名为name的repo,clone到本地名为dir的目录下。
查看所有的改变的命令,转到download的目录

bk changes

工具
dvcs-ripper

rip-cvs.pl -v -u http://www.example.com/CVS/

3、修复建议

1.在目标服务器上删除CVS相关目录
2.限制对CVS相关目录的访问。

0x05 .DS_Store文件泄漏

.DS_Store 文件 MAC 系统是用来存储这个文件夹的显示属性的:比如文件图标的摆放位置。如果用户删除以后的副作用就是这些信息的失去。这些文件本来是给 Finder 使用的,但它们被设想作为一种更通用的有关显示设置的元数据存储,诸如图标位置和视图设置。

1、漏洞成因

当需要把代码上传的时候,安全正确的操作应该把 .DS_Store 文件删除才正确。
因为里面包含了一些目录信息,如果没有删除,攻击者通过 .DS_Store 可以知道这个目录里面所有文件名称,从而让攻击者掌握了更多的信息。

在发布代码时未删除文件夹中隐藏的 .DS_store,被发现后,获取了敏感的文件名等信息。攻击者可以利用访问 URL(http://www.example.com/.ds_store)的方式来判断,是否存在DS_store泄露,如果存在泄漏,使用工具dsstoreexp,就可以下载源码。

2、漏洞利用

工具
dsstoreexp

python ds_store_exp.py http://www.example.com/.DS_Store

3、修复建议

1.删除.Ds_Store文件*

find . -name '*.DS_Store' -type f -delete

2.禁止.DS_Store文件的生成

defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE

恢复.DS_Store文件的生成

defaults delete com.apple.desktopservices DSDontWriteNetworkStores

git中对.DS_Store文件的操作

删除项目中的所有.DS_Store。这会跳过不在项目中的 .DS_Store
1.find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
将 .DS_Store 加入到 .gitignore
2.echo .DS_Store >> ~/.gitignore
更新项目
3.git add --all
4.git commit -m '.DS_Store banished!'

0x06 .bzr源码泄露

bzr,即Bazaar。也是个版本控制工具, 虽然不是很热门, 但它也是多平台支持, 并且有不错的图形界面,所以也有一些人认为bzr比git要好用。

1、漏洞成因

bzr在初始化项目时(bzr init/init-repo), 会在项目根目录产生名为.bzr的隐藏目录, 同样暴露了源代码和用户信息

2、漏洞利用

bzr revert命令

wget -r --no-parent --mirror http://www.example.com/.bzr
cd www.example.com && bzr revert

工具
dsstoreexp

rip-bzr.pl -v -u http://www.example.com/.bzr/

3、修复建议

删除.bzr文件(同.git)

0x07 网站备份压缩文件

在网站的使用过程中,往往需要对网站中的文件进行修改、升级。此时就需要对网站整站或者其中某一页面进行备份。当备份文件或者修改过程中的缓存文件因为各种原因而被留在网站web目录下,而该目录又没有设置访问权限时,便有可能导致备份文件或者编辑器的缓存文件被下载,导致敏感信息泄露,给服务器的安全埋下隐患。

1、漏洞成因

  • 服务器管理员错误地将网站或者网页的备份文件放置到服务器web目录下。
  • 编辑器在使用过程中自动保存的备份文件或者临时文件因为各种原因没有被删除而保存在web目录下。

该漏洞往往会导致服务器整站源代码或者部分页面的源代码被下载,利用。源代码中所包含的各类敏感信息,如服务器数据库连接信息,服务器配置信息等会因此而泄露,造成巨大的损失。被泄露的源代码还可能会被用于代码审计,进一步利用而对整个系统的安全埋下隐患。

2、漏洞利用

在 URL 加上域名+网站备份文件名 +压缩包后缀 也就是 URL,下载网站源码。
部分常见的网站备份文件后缀名:

.rar   .zip  .7z   .tar.gz   .bak    .swp   .txt

部分常见的备份文件名:

www   back   backup   web   temp   data   website   新建文件夹

3、修复建议

把备份文件删除或移出web根目录

0x08 WEB-INF/web.xml 泄露

WEB-INF是Java的WEB应用的安全目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
WEB-INF主要包含一下文件或目录:

  • /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
  • /WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
  • /WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
  • /WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
  • /WEB-INF/database.properties:数据库配置文件

1、漏洞成因

通常一些web应用我们会使用多个web服务器搭配使用,解决其中的一个web服务器的性能缺陷以及做均衡负载的优点和完成一些分层结构的安全策略等。在使用这种架构的时候,由于对静态资源的目录或文件的映射配置不当,可能会引发一些的安全问题,导致web.xml等文件能够被读取。

2、漏洞利用

通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。
一般情况,jsp引擎默认都是禁止访问WEB-INF目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,问题原因其实很简单,Nginx不会去考虑配置其他类型引擎(Nginx不是jsp引擎)导致的安全问题而引入到自身的安全规范中来

3、修复建议

修改Nginx配置文件禁止访问WEB-INF目录

 location ~ ^/WEB-INF/* { deny all; } 或者return 404; 或者其他!

参考博客:
谈谈源码泄露 · WEB 安全
常见Web源码泄露总结


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qwzf1024@qq.com

×

喜欢就点赞,疼爱就打赏