CTF信息泄露入门题-Writeup


我们正式进入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。不管了,先扫一遍吧。

image-20260304下午40859117

扫到了,那么我们看看这个备份文件会不会有提示?

下载下来这个文件,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<title>CTFHub 备份文件下载 - bak</title>
</head>
<body>
<?php

// FLAG: ctfhub{75383dc2840905aced557092}

echo "Flag in index.php source code.";
?>
</body>
</html>

找到flag!本题搞定!

vim缓存

题目描述:当开发人员在线上环境中使用 vim 编辑器,在使用过程中会留下 vim 编辑器缓存,当vim异常退出时,缓存会一直留在服务器上,引起网站源码泄露。

打开页面,依旧提示flag的位置。当然,肯定没那么简单。直接开扫。

看起来并没有扫到什么有价值的信息。那么接下来,试试vim缓存吧。其文件名经常是:

1
2
3
4
5
正常文件:index.php
vim 缓存:.index.php.swp
.index.php.swo
.index.php.swn
index.php~(备份)

恰好在.index.php.swp中找到了,然后我们可以运行以下命令:

1
2
file index.php.swp
strings index.php.swp | grep -i "ctfhub"

找到flag了!

vim缓存解析

当你用 vim 编辑文件时,会产生三种类型的文件:

1
2
3
4
原始文件:index.php
├── 交换文件 (.swp) —— 编辑时产生的临时文件
├── 备份文件 (.bak) —— 保存时的备份
└── 撤销文件 (.un~) —— 用于撤销操作

交换文件 (Swap Files)

1
2
3
4
文件名格式:.filename.swp, .filename.swo, .filename.swn
产生时机:打开文件时立即创建
作用:保存编辑中的内容,防止数据丢失
特点:文件存在就说明正在编辑或异常退出

备份文件 (Backup Files)

1
2
3
4
文件名格式:filename~, filename.bak
产生时机:保存文件时(如果设置了备份)
作用:保留修改前的版本
特点:取决于 vim 配置

撤销文件 (Undo Files)

1
2
3
文件名格式:.filename.un~, .filename.un.swp
产生时机:启用持久撤销功能时
作用:保存编辑历史,支持跨会话撤销

viminfo 文件

1
2
3
文件名:.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/ 直接访问到这个目录 。

攻击者能干什么?

攻击者可以利用这个漏洞:

  1. 下载整个 .git 目录
  2. 重建完整的项目源代码
  3. 查看提交历史(commit log)
  4. 恢复被删除的敏感文件(比如 flag)
  5. 对比版本差异,找到隐藏的信息

GitHack工具

GitHack 的工作原理是 :

  1. 解析远程 .git/index 文件,找到所有文件名和对应的 SHA1 值
  2. 根据 SHA1 去 .git/objects/ 下载对应的文件
  3. 用 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
2
pip install GitHacker
githacker --url http://<target>/.git --output-folder <OUTPUT_FOLDER>

运行完此工具后,会在指定文件夹下看到.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
2
3
git stash list
git stash show stash@{0}
git stash show -p stash@{0}

返回

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
2
工作区 (Working Directory) → 暂存区 (Index) → 版本库 (Repository)
你修改的文件 git add 后的位置 git commit 后的位置

Index 里存的是:下一次要提交的内容快照。

依旧先扫一下。还是输出了很多git相关的,因此用GitHacker工具去下载一下。然后git log发现当前版本已经是增加了flag的。直接ls发现文本文件,这个就是flag了。

这个可能是因为GitHacker直接帮我从暂存区里恢复了文件。如果工具没有这么做,那么需要手动执行:

1
2
3
4
5
6
7
8
9
10
11
# 1. 先看暂存区有什么文件
git ls-files --stage

# 输出:
# 100644 fcdc85b6da930352e99e604b774f8a7dfbb97b6c 0 234392428823689.txt

# 2. 用 SHA1 取出文件内容
git cat-file -p fcdc85b6da930352e99e604b774f8a7dfbb97b6c

# 3. 直接就看到 flag 了!
ctfhub{XXX}

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
2
3
4
dir
https://svn-server...
index.php
flag.txt

低版本的话就很简单了,只需要下载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
2
3
4
5
6
7
8
9
10
11
.svn
├── entries
├── format
├── pristine
│   ├── 08
│   │   └── 08171693cbd333701b525415321f2a29715066c2.svn-base
│   └── bf
│   └── bf45c36a4dfb73378247a6311eac4f80f48fcb92.svn-base
├── text-base
├── tmp
└── wc.db

其中,pristine“原始的、未修改的” 的意思。在 SVN 中,pristine 目录就是 “文件的原始备份仓库”。SVN 会把所有文件的原始备份,用 SHA1 哈希值 作为文件名,存放在 pristine/ 目录下。

我们可以直接用grep命令在这里搜索一下有没有flag:

1
2
grep -a -r "flag\|ctfhub\|Cyberpeace" pristine/
pristine/08/08171693cbd333701b525415321f2a29715066c2.svn-base:ctfhub{51888007d75837dc89cbf1cb}

本题搞定!

HG泄露

题目描述:当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。

我们还是先扫一遍。

扫完之后,发现基本都是HG相关的,考虑HG泄漏。

值得注意的是,dvcs-ripper自带hg分析工具。

1
2
3
perl rip-hg.pl -u http://challenge-6040f85097a0280f.sandbox.ctfhub.com:10800/.hg/
[i] Getting correct 404 responses
cannot find hg: No such file or directory at rip-hg.pl line 140.

我们用grep搜索不到flag相关的内容,我们用grep manifest先查看一下。

1
2
3
4
5
6
(base) caiguu@JACKERZHANG-MB0 .hg % hg manifest
50x.html
flag_28468252.txt
index.html
(base) caiguu@JACKERZHANG-MB0 .hg % cat flag_28468252.txt
cat: flag_28468252.txt: No such file or directory

因为dvcs-ripper只下载元数据,但我们不妨直接在网络环境下访问这个文件:

本题搞定。后续如果遇到HG泄露相关的题目还会继续深入探索一下。而且官方题解也说了“不要过分迷信工具。”工具只能给提供一个方向,具体的细节,不要放弃动手解决!

题型总结

至此,把CTF Hub中关于信息泄露的题目全都过完了。包括目录遍历、PHPINFO、备份文件下载、Git泄漏、SVN泄露和HG泄漏。主要的思路就是先F12看看源代码有没有东西,然后拿dirsearch扫一遍,看有没有敏感文件。除了vim缓存以外,其他的泄漏基本都能扫出来。如果看到了扫出来的东西,那么使用对应工具去进行处理就好了。也看到了一些弯弯绕,例如git当前版本开了嘲讽,但是在暂存区里就是正解。所以如果能定位到信息泄露的话,结合相关的工具去多试一试,一般就能找到结果了。

这也是我学习CTF的第一个专题,进展还是很快的。万事开头难,我觉得这个开头可以说是非常不错了!


文章作者: Jack Zhang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Zhang !
  目录