CTFWeb篇03-信息泄露
信息泄露
phpinfo.php
通常是一个包含 PHP phpinfo()
函数的简单脚本,使用 phpinfo()
函数时,它会生成一个包含大量信息的表格,包括但不限于:
- PHP 版本
- 编译时选项
- PHP 运行时配置
- 已安装的 PHP 扩展及其版本
- 环境变量
- 服务器信息
这个脚本通常用于调试目的,以帮助开发者了解服务器的 PHP 环境配置。然而,出于安全考虑,不应该在生产环境中公开 phpinfo.php 文件,因为它可能会泄露敏感信息,比如服务器路径、已安装的扩展、PHP 版本等,这些信息可能被恶意用户用来寻找攻击服务器的漏洞。
备份文件下载
当开发人员在线上环境中对源代码进行了备份操作,并且将备份文件放在了 web 目录下,就会引起网站源码泄露。
- 压缩包备份
- bak文件
- 后缀名为bak的文件是备份文件,你修改了原文件的内容后,保存了修改后的内容,那么修改前的内容会自动保存为后缀名为bak的备份文件(前提是设置为保留备份),如果你想查看或者恢复修改前的内容,就可以打开这个bak文件
- 有些时候网站管理员可能为了方便,会在修改某个文件的时候先复制一份,将其命名为xxx.bak。而大部分Web Server对bak文件并不做任何处理,导致可以直接下载,从而获取到网站某个文件的源代码
- vim缓存
- 当开发人员在线上环境中使用 vim 编辑器,在使用过程中会留下 vim 编辑器缓存,当vim异常退出时,缓存会一直留在服务器上,引起网站源码泄露
- 当你打开一个文件,vi编辑器就会生成这么一个.swp文件防止出现意外情况(类似微软word的缓存文件机制),如果正常退出那么这个swp文件将会自动删除。当你强行关闭vi或者SSH连接时,比如电源断了或者使用了Ctrl+ZZ,vi自动生成一个.swp文件,下次你再编辑时,就会出现一些提示
- 已知:当vim异常退出时,以index.php为例,
- 第一次产生 .index.php.swp
- 第二次产生 .index.php.swo
- 第三次产生 .index.php.swn
- .DS_Store
- .DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过url/.DS_Store可以知道这个目录里面所有文件的清单
Git泄漏
- 该泄漏需要用到Githack工具
- 当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
- 原理:开发人员在开发时,常常会先把源码提交到远程托管网站(如github、gitee),最后再从远程托管网站把源码pull到服务器的web目录下,如果忘记把.git文件删除,就造成此漏洞。利用.git文件恢复网站的源码,而源码里可能会有数据库的信息。
- 在一个目录中初始化一个仓库以后 , 会在这个目录下产生一个名叫 .git 的隐藏文件夹(版本库)这个文件夹里面保存了这个仓库的所有版本等一系列信息
- git目录:使用git init初始化git仓库的时候,生成的隐藏目录,git会将所有的文件,目录,提交等转化为git对象,压缩存储在这个文件夹当中
什么是Git
Git是一个开源的分布式版本控制系统 ,简单的可以理解为 Git 是一个内容寻址文件系统,也就是说 Git 的核心部分是键值对数据库。 当我们向 Git 仓库中插入任意类型的内容(开发者们在其中做的版本信息修改之类的操作),它会返回一个唯一的键,通过该键可以在任意时刻再次取回该内容。
git文件泄漏造成后果
一般情况下 , 开发人员为了让版本控制和网站部署比较方便 , 在开发的时候就会走这样的流程
- 初始化仓库 , 并将仓库托管在Coding或者Github上 , 便于远程协作/备份/部署
- 在本地进行网站开发 , 并定时提交commit , push到远程托管网站
- 当一个阶段的开发差不多的时候 , 需要远程登陆服务器 , 通过托管网站再将发行版网站pull到Web目录下
- 网站正常运行
这里当网站维护(开发)人员在从托管网站pull代码的时候 , 也会将这个储存了所有的版本信息的.git文件夹下载到服务器的Web目录下 , 这样的话 , 攻击者就可以利用这个目录 , 去下载git文件夹 , 就可以利用其中储存的版本控制信息:
(1)完全恢复网站后台的代码和目录结构
(2)当然 , 一般网站都会涉及到数据库操作 , 而一般来说 , 需要链接数据库就需要用户名/密码/端口/库名等信息 , 而这些信息肯定会在网站后台的源码里面又体现 , 因此这种情况是极其危险的 , 还有 , 一旦服务器开放了数据库的远程连接功能 , 攻击者就可以利用从源码中找到的数据库用户名和密码对远程数据库进行登陆 , 危险性不言而喻。
利用方法
(1)GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,还原重建工程源代码,还原历史版本。渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等安全漏洞。
脚本的工作原理:
- 解析.git/index文件,找到工程中所有的: ( 文件名,文件sha1 )
- 去.git/objects/ 文件夹下下载对应的文件
- 使用zlib解压文件,按原始的目录结构写入源代码
使用指令(以我的为例):
python2 GitHack -u url/.git #别忘了最后的.git
还原后的文件在 dist/ 目录下
((2) 爬虫爬取整个git目录
(这个方法比较原始 , 需要具有一定的Git经验)但是这种方法和使用githack这个工具相比 , 有一个比较好的地方就是 , 可以完全模拟服务器上的代码环境 , 可以跟踪到git的每一次提交 , 但是githack好像只可以将源码恢复到最近的一次提交,这里的好处还有可以去查看git的提交日志 , 这个日志信息中会有开发人员对每一次commit的描述 , 比如某个BUG的修复等等 , 对于这些和BUG相关的地方 , 可以有针对性地进行白盒审计 , 有可能这个BUG修复了还不如没修复 , 可能会造成更大的漏洞)
具体利用思路: - 利用爬虫递归下载.git目录的所有文件
- 利用git命令对网站的commit历史进行查看
- 利用git命令对网站的源码进行恢复
具体操作:
演示网站 : http://www.xxx.com/.git/
- 在虚拟机中利用wget对该目录进行递归下载(-r)
wget -r -p -np -k http://www.xxx.com/.git/
--recursive(递归)
-k, --convert-links(转换链接)
-p, --page-requisites(页面必需元素)
-np, --no-parent(不追溯至父级)
- 下载完成后 , 进入下载的网站目录
- 利用命令 : git log 查看网站的提交记录
- 利用命令 : git reset --hard [log hash] 恢复到指定版本号 (一般如果只需要得到源码的话就恢复到最近的一次提交)
什么是stash
比如你正在dev 分支开发一个新需求,此时突发一个bug需要你紧急修复,但新的需求并没有开发完成还不想提交代码,怎么办?这时就是 git stash 发挥作用的时候了,它可以将没开发完的代码保存到 堆栈区,切换到新的分支修复bug,等 bug 修复完可以再切换为 dev 分支,释放保存的代码继续之前未完的开发。
git stash
//将当前未提交的修改(即,工作区的修改和暂存区的修改)先暂时储藏起来
git checkout dev
//可以切换到新分支修复bug
git stash pop
//修复完之后再次切回 dev 分支继续开发,此时需要释放之前保存的代码
git stash list
//下列命令可以查看缓存的列表
//有时我们会发现因冲突导致 git stash pop 命令并没有消除 list 的记录,这样对我们操作造成一些干扰,这时我们可以执行以下操作,清除记录
git stash drop
Git索引(Index)
Git索引有时也被称为缓存区(Cache),它用于暂存将要提交到版本控制系统的文件。在执行git add .命令后,文件将被添加到索引中,Git将对这些添加到索引中的文件进行监视。索引保存了工作目录中的文件的元数据,包括文件名、文件的类型(文本文件或二进制文件)、文件的权限等。索引还保存了文件的内容快照,以便之后可以生成提交对象。
每次执行git add
命令后,索引文件都会被更新。当我们对文件进行修改时,索引中的相应条目将会被更新,以反映文件的最新状态。这就是为什么在执行git commit
命令之前需要使用git add
命令将文件添加到索引中的原因
git ls-files --stage
- 上面的这个指令列出index文件中的内容
Git文件目录结构
- .git目录:使用git init初始化git仓库的时候,生成的隐藏目录,git会将所有的文件,目录,提交等转化为git对象,压缩存储在这个文件夹当中。
- COMMIT_EDITMSG:保存最新的commit message,Git系统不会用到这个文件,用户一个参考文件
- config:Git仓库的配置文件
- description:仓库的描述信息,主要给gitweb等git托管系统使用
- HEAD:这个文件包含了一个档期分支(branch)的引用,通过这个文件Git可以得到下一次commit的parent
- hooks:这个目录存放一些shell脚本,可以设置特定的git命令后触发相应的脚本;在搭建gitweb系统或其他git托管系统会经常用到hook script(钩子脚本)
- index:这个文件就是我们前面提到的暂存区(stage),是一个二进制文件
- info:包含仓库的一些信息
- logs:保存所有更新的引用记录
- objects:所有的Git对象都会存放在这个目录中,对象的SHA1哈希值的前两位是文件夹名称,后38位作为对象文件名
- refs:这个目录一般包括三个子文件夹,heads、remotes和tags,heads中的文件标识了项目中的各个分支指向的当前commit
- ORIG_HEAD:HEAD指针的前一个状态
Git中对象指向
漏洞修复
- 对.git目录的访问权限进行控制
- 在每次pull到web目录下之后删除.git文件夹
解题思路
- 先用dirsearch扫描,发现有.git后缀名,可能是git泄漏
- 使用GitHack扫描
python2 GitHack -u url/.git
- 扫描出来后
cd
进入dist文件夹中网页的文件夹使用指令git log
查看日志,可以看到操作记录和版本
- 注意:最上面的版本是最新版本即最近一次操作
(1)Log:发现有移除flag的操作,那么两个版本之间的差异就是flag
法一:使用指令git diff 版本一(即commit后面那一串) 版本二
对比版本差异即可
法二:由于flag就在上一个版本,所以git reset --hard 版本(要回退到的版本)
回退文件版本,然后发现dist中多了一个记事本,打开即可发现flag
(2)Stash:
法一:对比版本差异后发现有个.txt文件,直接指令more
或cat
打开即可
法二:使用git stash list
查看暂存的代码,然后使用git stash pop
将代码从暂存堆栈中拉出来
(3)Index(Git索引)
指令 | 作用 |
---|---|
git init |
以SpringBoot项目为例,当输入这个指令时就会生成 .git隐藏文件夹和.gitignore文件 |
git log |
显示从最近到最远的提交日志 |
git show |
命令用于显示各种类型的对象 |
git diff |
查看working tree与index的差别 |
git diff --cached |
查看index与repository的差别 |
git diff HEAD |
查看working tree和repository的差别。其中:HEAD代表的是最近的一次commit的信息 |
git reset |
可用于回退版本库 |
git reset --hard |
用于修复某版本的源代码 |
git stash |
能够将所有未提交的修改(工作区和暂存区)保存至堆栈中暂时储存,用于后续恢复当前工作目录 |
git stash list |
查看当前stash中储存的修改内容 |
git stash pop |
从git栈中获取到最近一次stash进去的内容,恢复工作区的内容.获取之后,会删除栈中对应的stash |
SVN泄漏
当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。
什么是SVN
SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。
特点
- 代码版本管理工具
- 多人共享同一的资源,并且可以对资源实现修改和更新。
- 记录资源的每一次变更,以及记录更改该资源的人,并且可以恢复到之前的任何一个修改点
- 目录级权限控制,企业安全必备(git没有目录级权限)
SVN经典目录结构
- trunk --- 主干:用于存放工程的主要代码及文档
- branches --- 分支:相对于主干的概念,来源于主干
- tags --- 标记:记录重要事件,阶段性成果
- bineexport --- 苹果:用于存放对外的二进制文件(非标配)
SVN详解
SVN漏洞详解
漏洞主要成因
- 在服务器上布署代码时。如果是使用 svn checkout 功能来更新代码,而没有配置好目录访问权限,则会存在此漏洞。黑客利用此漏洞,可以下载整套网站的源代码。
- 在使用SVN管理本地代码过程中,会自动生成一个隐藏文件夹,其中包含重要的源代码信息。但一些网站管理员在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使.svn隐藏文件夹被暴露于外网环境,使得渗透工程师可以借助其中包含版本信息追踪的网站文件,逐步摸清站点结构。
利用方式
- 利用用于版本信息追踪的 entries 文件(.svn/entries 文件),获取到服务器源码、svn服务器账号密码等信息。
- 利用== wc.db 数据库文件(.svn/wc.db 文件)==,获取到一些数据库信息。
- SVN产生的.svn目录下还包含了以
.svn-base
结尾的源代码文件副本(低版本SVN具体路径为text-base目录,高版本SVN为pristine目录),如果服务器没有对此类后缀做解析,则可以直接获得文件源代码。
漏洞修复
方案一、不要使用svn checkout和svn up更新服务器上的代码,使用svn export(导出)功能代替。
方案二、服务器软件(Nginx、apache、tomcat、IIS等)设置目录权限,禁止访问.svn和.git目录,下面示范为禁止访问点号开头的目录
需要工具 dvcs-ripper
- dvcs-ripper是一款perl的版本控制软件信息泄露利用工具,支持SVN, GIT, Mercurial/hg, bzr…
- git泄露推荐使用Githack,功能更强
- 可将泄露的文件恢复并克隆到本地目录中
- SVN示例:
./rip-svn.pl http://example/.svn
cd .svn
得到的各个文件的用处:- entries 和 format 文件:访问entries 里面会有数字 ,svn大于1.7版本是12,小于1.7版本是10
- wc.db-journal 和 tmp 文件:都是空的,也没什么价值;
- pristine 文件夹:有若干个 .svn-base 文件,这个文件夹是整个项目文件的一份备份,只是表现出来的是一堆哈希过的文件名
- wc.db文件:打开 wc.db文件
- 可以看到 NODES 表,遍历这个表里的每一行,就可以下载到整个项目里的代码了,而且还能得到对应的真实文件名。local relpath栏表示原始的文件名,checksum栏$后面那一串数字即pristine文件夹里那些文件的文件名
- 除了NODES表以外,还可以看到一个 REPOSITORY表,里面存储了svn的项目路径和 uuid,如果没有做访问IP限制的话,你可以直接使用此信息取得此项目的SVN权限
- SVN示例:
用法示例
# 1. 切换到dvcs-ripper的路径下
cd dvcs-ripper
# 2.执行脚本
#SVN
perl rip-svn.pl -v -u http://www.example.com/.svn/
//或
./rip-hg.pl -v -u http://example/.svn/
(下面的相同)
#HG
perl rip-hg.pl -v -u http://www.example.com/.hg/
#Git
perl rip-git.pl -v -u http://www.example.com/.git/
#bzr
perl rip-bzr.pl -v -u http://www.example.com/.bzr/
#CVS
perl rip-cvs.pl -v -u http://www.example.com/CVS/
HG泄漏
当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞
漏洞产生原因
Mercurial(hg)是一种分布式版本控制系统,它与Git类似也可以用于管理代码的版本控制,如果Mercurial服务器的安全措施不当或用户不小心,可能会导致Mercurial源码的信息泄露的问题,而Mercurial源码信息泄露的原理是因为Mercurial服务器上的源代码未被正确保护,导致未经授权的用户可以轻易地访问和下载代码,这可能会导致以下问题
- 暴露源代码:未经授权的用户可以轻易地访问和下载源代码,包括敏感信息,例如密码、API密钥和凭据等
- 增加恶意攻击的风险:未经授权的用户可以轻易地访问和下载源代码,黑客可以使用这些代码来发起攻击,例如通过发现代码漏洞来入侵服务器或者应用程序
一般需要用dirsearch扫发现是什么类型的泄漏
使用示例:dirsearch -u "http://challenge-3d3ee9f6b46671b1.sandbox.ctfhub.com:10800/" -e* -i 200,300-399
- -u 目标url
- -e 包含的文件拓展名(逗号分隔) 如-e php,asp,这里*指所有类型
- -i 保留的响应状态码(以逗号分隔,支持指定范围) 如(-i 200,300-399)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析