我们正式进入Web攻防的学习!首先学习的第一个专题是信息泄露。目前的学习原则是,按照技能树进行推进,并通过这些题目掌握常见工具的使用方法。
题单
本次题目来自CTF Hub的技能树的Web->信息泄露部分,包括目录遍历、PHPINFO、备份文件下载、Git泄露、SVN泄露和HG泄露。

目录遍历
题目
打开之后有一个按钮,写着“点击开始寻找flag”。点击一下,给了我们一个/flag_in_here的文件夹。显然这是需要进行目录遍历了。当然去手动一个一个试肯定没问题,但如果文件很庞大呢?所以使用工具:dirserach,先扫一遍。由于我们重点关注特定的状态码,因此可以用下面的命令:
1 | dirserach -u http://<靶场URL>/flag_in_here -i 200,301,302,403 |
这样就可以让结果显示得比较简单,方便观察。

这样其实就锁定到了两个文件里,分别在2和4中。我们手动进去找,总能找到。果然在这里:

flag就是ctfhub{4a3c1a58ac30322ea60e1af0}。官方题解其实给得特别简单,直接手动去搜就行了!当然,我看也有人写了个python脚本,挨个去找。
PHPINFO
题目
这道题目进去以后,可以查看phpinfo,flag就藏在这里。

这道题应该是想说明phpinfo的重要性,所以我们也扫一下,看这个文件会不会被提示出来。

果然这个文件能够被提示出来!也就是说,我们需要关注这种搜索出来的、作用比较大的文件。
备份文件下载
网站源码
题目描述:当开发人员在线上环境中对源代码进行了备份操作,并且将备份文件放在了 web 目录下,就会引起网站源码泄露。
打开这个页面,给了一些提示。不过不管咋样,先扫一遍。当然,这个页面给的这些提示还是值得记录下来的:
常见的网站源码备份文件后缀
- tar
- tar.gz
- zip
- rar
常见的网站源码备份文件名
- web
- website
- backup
- back
- www
- wwwroot
- temp
还真扫到了:

那么,看来这个备份文件不简单!我们给它下载下来!
可是,当我们下载下来,发现这三个文件都并不直接包含flag。有一个文件flag_1768531291.txt直接在文件里写道,Where is flag?,还开了嘲讽?我们要不按着这个路径回现网看看呢?果然!就是这样!找到flag了!

bak文件
题目描述:当开发人员在线上环境中对源代码进行了备份操作,并且将备份文件放在了 web 目录下,就会引起网站源码泄露。
打开题目,醒目的一句话:Flag in index.php source code.。那我们就先找找这个文件呗?没有!这就是index.php。不管了,先扫一遍吧。

扫到了,那么我们看看这个备份文件会不会有提示?
下载下来这个文件,其内容如下:
1 |
|
找到flag!本题搞定!
vim缓存
题目描述:当开发人员在线上环境中使用 vim 编辑器,在使用过程中会留下 vim 编辑器缓存,当vim异常退出时,缓存会一直留在服务器上,引起网站源码泄露。
打开页面,依旧提示flag的位置。当然,肯定没那么简单。直接开扫。

看起来并没有扫到什么有价值的信息。那么接下来,试试vim缓存吧。其文件名经常是:
1 | 正常文件:index.php |
恰好在.index.php.swp中找到了,然后我们可以运行以下命令:
1 | file index.php.swp |
找到flag了!

vim缓存解析
当你用 vim 编辑文件时,会产生三种类型的文件:
1 | 原始文件:index.php |
交换文件 (Swap Files)
1 | 文件名格式:.filename.swp, .filename.swo, .filename.swn |
备份文件 (Backup Files)
1 | 文件名格式:filename~, filename.bak |
撤销文件 (Undo Files)
1 | 文件名格式:.filename.un~, .filename.un.swp |
viminfo 文件
1 | 文件名:.viminfo |
为什么会存在.swp文件?一般是因为没有正常退出vim。如果正常退出了,那么这个.swp文件是会被删除掉的。而且这个不一定能被扫出来,所以如果感觉像是文件泄露的话,可以思考一下是不是和vim有关。
.DS_Store
题目描述:.DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件。通过.DS_Store可以知道这个目录里面所有文件的清单。
相同的流程,先扫一遍。

扫出来了,直接下载这个文件,并调用工具去分析。

找到了一个txt文件,看看是什么,打开就是flag!本题搞定!
Git泄露
Git泄露
漏洞是怎么产生的?
当开发者使用 Git 进行版本控制时,会在项目根目录生成一个 .git 隐藏文件夹,里面记录了:
- 所有的代码历史版本
- 每次提交的改动(diff)
- 提交者的信息
- 甚至可能包含被删除的敏感文件
如果网站上线时,直接把 .git 文件夹也上传到了服务器,且没有做访问限制,那么任何人都可以通过 http://target.com/.git/ 直接访问到这个目录 。
攻击者能干什么?
攻击者可以利用这个漏洞:
- 下载整个
.git目录 - 重建完整的项目源代码
- 查看提交历史(commit log)
- 恢复被删除的敏感文件(比如 flag)
- 对比版本差异,找到隐藏的信息
GitHack工具
GitHack 的工作原理是 :
- 解析远程
.git/index文件,找到所有文件名和对应的 SHA1 值 - 根据 SHA1 去
.git/objects/下载对应的文件 - 用 zlib 解压,按原始目录结构重建源代码
优点:不需要在本地安装 Git,只要有 Python 就能跑。
Log
题目描述:当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题。
打开这道题,什么都没有,可以先扫一遍。直接就扫出来了一大堆和Git相关的文件。

然后根据题目提示使用GitHack工具,其下载地址为https://github.com/BugScanTeam/GitHack,使用方法是直接运行`GitHack.py`,无需安装其他依赖项。
既然扫到了这么多git相关的内容,那么我们运行如下命令:
1 | python GitHack.py http://<target>/.git |
但是我们会发现,BugScan的GitHack只支持Python2,在我们的Python3环境下已经是不可用状态了。所以我们找了一个替换工具:GitHacker,地址为https://github.com/WangYihang/GitHacker。
1 | pip install GitHacker |
运行完此工具后,会在指定文件夹下看到.git文件,我们就可以在这个文件夹里寻找一些有用的东西了。
最常见的题型就是查看git log。

所以我们可以看到8dcf那次提交是存在flag的!我们现在需要变更到8dcf这次提交!
1 | git reset --hard <commit_id> |

变更之后,就发现了flag文件!本题搞定!
Stack
题目描述:当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题。
git stash 是 Git 的一个非常有用的命令,用于临时保存当前工作目录的修改,让你可以切换到其他分支(或者做其他操作),稍后再回来恢复这些修改。
通俗理解:
你正在写代码,写到一半突然要去修一个紧急 bug,但又不想提交现在的半成品。于是你
git stash把当前修改存到“抽屉”里,等修完 bug 再git stash pop从抽屉里拿出来继续写。
这题我们也可以先扫一下。也是扫出来了好多和Git相关的文件。所以我们还是用GitHacker下载一下。下载后,查看git log,和上一道题目一样,所以我们也需要先恢复到那个分支。但是!就在那个类似的文件下,居然内容变了,开了嘲讽:

问得好,where is flag?既然最常见的git log不行,就要考虑git stash了。
1 | git stash list |
返回
stash@{0}: WIP on master: 42e8390 add flag
这就是很关键的信息,我们接下来查看一下这个stash:

找到flag了!
这个题目可以说是还用了假flag来增加挑战性。值得注意的是git stash是全局的,因此无需切换分支,可以直接执行这个命令。也就是说,出题者加了那个txt后,把内容是where is flag的版本正式提交到了master,后来把这个文件内容改成了正确的flag,但并没实际提交,而是使用stash做了个暂存。这就是我们能在stash中看到它的原因。
Index
题目描述:当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题。
什么是 Git Index?
Index(也叫暂存区)是 Git 的三个组成部分之一:
1 | 工作区 (Working Directory) → 暂存区 (Index) → 版本库 (Repository) |
Index 里存的是:下一次要提交的内容快照。
依旧先扫一下。还是输出了很多git相关的,因此用GitHacker工具去下载一下。然后git log发现当前版本已经是增加了flag的。直接ls发现文本文件,这个就是flag了。

这个可能是因为GitHacker直接帮我从暂存区里恢复了文件。如果工具没有这么做,那么需要手动执行:
1 | # 1. 先看暂存区有什么文件 |
SVN泄露
题目描述:当开发人员使用 SVN 进行版本控制,对站点自动部署。如果配置不当,可能会将.svn文件夹直接部署到线上环境。这就引起了 SVN 泄露漏洞。
SVN(Subversion)是程序员常用的集中式版本控制系统。当你使用 svn checkout 检出代码时,会在项目目录下自动生成一个 .svn隐藏文件夹,里面记录了:
- 所有文件的版本历史
- 源代码的完整副本
- 提交记录、作者信息
- 服务器地址、用户名等元数据
先扫一下。能够扫出来和svn相关的东西。

可以扫到好多和SVN相关的东西,所以本题肯定是考虑SVN泄露了。
对于这种SVN的题,第一步是确认版本,高版本和低版本对应着不同的方法。我们先访问一下http://http://challenge-15c62b156835dbb5.sandbox.ctfhub.com:10800/.svn/entries。如果文件内容是一个数字,如12,那就是高版本。如果返回类似如下内容,就是低版本:
1 | dir |
低版本的话就很简单了,只需要下载curl http://目标/.svn/text-base/flag.txt.svn-base目标文件就行了。
但如果是高版本的话,就会麻烦很多,建议使用工具来做。
DVCS-Ripper工具:https://github.com/kost/dvcs-ripper
这个工具是Perl构造的,能够下载wc.db并解析;根据哈希值构造下载路径并恢复完整的目录结构。
1 | perl rip-svn.pl -v -u http://<target>/.svn |
我们运行这个工具,让它解析一下。然后我们发现在当前文件夹下多了个.svn,这就是下载下来的。
我们可以运行tree命令看一下这个.svn的结构:
1 | .svn |
其中,pristine 是 “原始的、未修改的” 的意思。在 SVN 中,pristine 目录就是 “文件的原始备份仓库”。SVN 会把所有文件的原始备份,用 SHA1 哈希值 作为文件名,存放在 pristine/ 目录下。
我们可以直接用grep命令在这里搜索一下有没有flag:
1 | grep -a -r "flag\|ctfhub\|Cyberpeace" pristine/ |
本题搞定!
HG泄露
题目描述:当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。
我们还是先扫一遍。

扫完之后,发现基本都是HG相关的,考虑HG泄漏。
值得注意的是,dvcs-ripper自带hg分析工具。
1 | perl rip-hg.pl -u http://challenge-6040f85097a0280f.sandbox.ctfhub.com:10800/.hg/ |
我们用grep搜索不到flag相关的内容,我们用grep manifest先查看一下。
1 | (base) caiguu@JACKERZHANG-MB0 .hg % hg manifest |
因为dvcs-ripper只下载元数据,但我们不妨直接在网络环境下访问这个文件:

本题搞定。后续如果遇到HG泄露相关的题目还会继续深入探索一下。而且官方题解也说了“不要过分迷信工具。”工具只能给提供一个方向,具体的细节,不要放弃动手解决!
题型总结
至此,把CTF Hub中关于信息泄露的题目全都过完了。包括目录遍历、PHPINFO、备份文件下载、Git泄漏、SVN泄露和HG泄漏。主要的思路就是先F12看看源代码有没有东西,然后拿dirsearch扫一遍,看有没有敏感文件。除了vim缓存以外,其他的泄漏基本都能扫出来。如果看到了扫出来的东西,那么使用对应工具去进行处理就好了。也看到了一些弯弯绕,例如git当前版本开了嘲讽,但是在暂存区里就是正解。所以如果能定位到信息泄露的话,结合相关的工具去多试一试,一般就能找到结果了。
这也是我学习CTF的第一个专题,进展还是很快的。万事开头难,我觉得这个开头可以说是非常不错了!