1. 从一道LitCTF题看源码泄露的“门道”前段时间在复盘LitCTF 2023的题目时遇到一道Web题它没有复杂的逻辑漏洞也没有花里胡哨的绕过核心考点就是“信息泄露”。这让我想起在CTF的Web赛道上尤其是入门和中等难度的题目里源码泄露相关的套路几乎成了“送分题”的常客但同时也是很多新手最容易忽略的“隐形杀手”。很多队伍在复杂的SQL注入、反序列化上绞尽脑汁却可能在一个简单的.git目录泄露上栽跟头白白丢了分数。今天我就借这道题和大家系统性地聊聊CTF中那些“藏”在源码里的常见信息泄露套路以及我们该如何像猎人一样敏锐地发现并利用这些痕迹。这道题目的场景很典型给你一个看起来功能简单的Web应用界面可能就是个登录框或者信息展示页。题目描述往往语焉不详只给一个目标“找到flag”。这时候有经验的选手第一反应不是去盲目测试功能点而是会先进行一波“资产侦察”。这里的资产指的就是那些可能被无意间部署到生产环境的源码、备份文件或版本控制信息。攻击者拿到这些就相当于拿到了建筑的“设计图纸”不仅能直接发现硬编码的敏感信息如flag、密码、API密钥还能通过代码审计挖掘出更深层次的漏洞路径。在真实世界的渗透测试中这类问题也极为普遍是许多安全事件的起点。2. 常见源码与配置信息泄露套路全解析信息泄露的途径五花八门但归根结底大多是开发或运维人员在部署时疏忽将本应留在开发环境的文件带到了线上。下面我们就来逐一拆解这些“套路”并说明它们的原理、利用方式及在CTF中的出题形式。2.1 版本控制系统泄露.git与.svn这是最高频也最重要的考点之一。版本控制系统如Git、SVN的元数据目录如果被直接部署到了Web根目录下攻击者就可以通过直接访问来下载整个代码仓库的历史记录。.git目录泄露原理很简单git init会在项目根目录创建一个.git文件夹里面包含了所有的版本历史、分支、提交记录和对象数据库。如果这个文件夹能被Web服务器直接访问例如通过http://target.com/.git/那么攻击者就可以使用git-dumper、GitHack等工具尝试恢复整个源码树。在CTF中出题人可能会直接泄露让你访问/.git/目录如果能列出文件返回403 Forbidden但目录存在或配置错误返回200并列出文件列表就是强烈的提示。部分功能可用可能禁用了目录列表但/.git/index、/.git/HEAD等关键文件仍可读取这足以让工具进行恢复。藏在非常规路径不一定在根目录可能在/admin/.git、/backup/.git等子目录下。实操心得遇到疑似.git泄露先用浏览器访问/robots.txt或/.git/HEAD试试。如果HEAD文件能访问并返回ref: refs/heads/master之类的内容基本就实锤了。接下来别手动一个个下载直接用自动化工具成功率更高。.svn目录泄露SubversionSVN的元数据存储在.svn目录中其entries文件或wc.db新版本数据库包含了工作副本的文件列表和内容。通过访问/.svn/entries可能直接看到文件名甚至在某些旧版本配置下能直接访问/.svn/pristine/目录下的文件原始内容。利用工具示例对于.git最常用的是git-dumper。假设目标URL是http://ctf.example.com基本命令如下# 安装git-dumper pip install git-dumper # 递归下载.git目录并尝试重建项目 git-dumper http://ctf.example.com/.git/ ./output_dir下载完成后进入output_dir执行git log查看提交历史git diff对比提交寻找flag或敏感信息git checkout .恢复所有文件到最新状态进行审计。2.2 备份文件与临时文件泄露开发者在修改文件前后可能会习惯性地创建备份比如index.php.bak、index.php.swp、index.php~等。Web服务器对于这些后缀的文件可能没有配置正确的处理程序从而直接以纯文本形式返回其内容。.bak、.old、.backup后缀这是最直接的备份文件命名。Vim交换文件.swp当Vim编辑器非正常退出时产生包含未保存的更改。通过访问.index.php.swp可能获取到正在编辑的源码。.DS_StoreMac与Thumbs.dbWindows系统自动生成的目录元数据文件可能泄露目录结构甚至文件名。CTF常见玩法题目可能是一个正常的页面但flag就写在源码注释里而真正的考点是让你找到index.php的备份文件index.php.bak。直接访问这个备份文件就能看到包含flag的源码。2.3 配置文件与敏感文件泄露这类泄露直接暴露了应用的核心配置危害极大。robots.txt虽然本身是正常文件但其中Disallow的路径往往暗示着敏感目录或文件的存在如/admin/、/backup/、/flag.txt。这相当于给了攻击者一张“藏宝图”。www.zip、site.tar.gz、backup.zip网站整站打包的压缩文件可能被粗心地放在Web根目录下。phpinfo.php一个显示PHP服务器详细配置信息的页面如果遗留在线上会暴露大量系统路径、扩展、环境变量等敏感信息。WEB-INF/web.xml对于Java Web应用如果存在目录遍历漏洞可能能读取到这个文件从而暴露内部类路径和配置。.env、config.inc.php、application.yml现代框架的配置文件常包含数据库密码、API密钥、加密盐值等。注意事项在CTF中flag有时就直接写在config.php的某个变量里或者通过数据库连接配置间接引出。拿到配置文件后要仔细查看每一个定义常量的地方。2.4 目录遍历与目录列表这不算严格意义上的“源码”泄露但属于信息泄露的经典类型常作为获取源码的前置步骤。目录遍历Path Traversal通过参数控制文件路径如?file../../../../etc/passwd。如果题目存在文件包含、文件读取功能且未过滤../就可能利用此漏洞读取服务器上的任意文件包括Web应用的源码如/var/www/html/index.php。目录列表Directory Listing当Web服务器如Apache、Nginx配置不当某个目录下没有index.html等默认文件时服务器可能会自动生成一个列出该目录下所有文件的页面。攻击者可以借此发现备份文件、日志、上传目录等。2.5 注释与前端源码中的信息有时flag或提示就“明目张胆”地藏在HTML、JavaScript或CSS的注释里。这要求选手具备仔细查看页面源码的习惯。HTML注释右键查看网页源代码搜索!--和--。JavaScript注释在引入的JS文件或内联脚本中搜索//或/* */可能藏有API地址、调试标志甚至部分逻辑。CSS与前端框架较少见但偶尔会有出题人将信息编码后藏在伪类内容或自定义属性中。3. 系统化的信息泄露挖掘流程知道了有哪些套路下一步就是如何高效地、系统化地去发现它们。盲目乱试效率极低我们需要一套侦察流程。3.1 初始侦察与枚举手动浏览与观察首先正常使用网站的所有功能观察URL结构、参数、表单、Cookie、响应头。任何不寻常的参数名或路径都值得记录。查看前端源码这是零成本的第一步。按F12打开开发者工具仔细查看ElementsHTML结构特别是注释。Sources加载的所有静态资源JS、CSS逐一查看。Network观察所有请求和响应特别注意响应头中的信息如Server、X-Powered-By可能泄露中间件和语言版本。检查robots.txt和sitemap.xml这是标准动作往往最先做。3.2 使用自动化工具进行扫描手动检查基础信息后使用自动化工具进行广谱扫描能极大提高效率。目录/文件爆破工具这类工具使用预定义的字典尝试猜测可能存在但未链接的隐藏文件或目录。dirsearch速度快字典强大。常用命令python3 dirsearch.py -u http://ctf.example.com -e php,bak,txt,git,svngobusterGo语言编写同样高效。命令gobuster dir -u http://ctf.example.com -w /path/to/wordlist.txt -x php,bak,zipffuf非常灵活可用于目录、子域名、参数Fuzz等。命令示例ffuf -u http://ctf.example.com/FUZZ -w /path/to/wordlist.txt -e .php,.bak,.zip字典的选择很关键。对于CTF可以组合使用common.txt、directory-list-lowercase-2.3-medium.txt以及针对备份文件bak.txt、敏感文件sensitivefiles.txt的专项字典。针对特定泄露的专用工具GitHack用于利用.git泄露。dvcs-ripper一个集成了针对Git、SVN、Mercurial等多种版本控制系统泄露利用的工具包。GitTools其中的gitdumper.sh脚本也很常用。3.3 分析响应与状态码工具扫描会返回大量结果需要快速判断哪些是真正有价值的。状态码200 OK文件存在且可读。最理想的情况。403 Forbidden通常意味着路径存在但无权访问。对于目录这可能意味着目录列表被禁用但目录本身是存在的比如/.git/返回403就是一个强信号。404 Not Found路径不存在。特别注意200和403它们通常比404更有趣。响应长度Size同一个路径返回200但长度异常小比如只有几个字节可能是一个空文件或默认页面长度异常大可能包含了数据。对比不同请求的响应长度变化有时能发现规律。响应内容即使返回403响应体里也可能包含有用的错误信息比如Web服务器类型、PHP版本等。3.4 组合利用与逻辑推理信息泄露的线索往往不是孤立的。你需要像拼图一样把它们组合起来。从robots.txt发现/admin-backup/目录。用目录扫描工具扫描/admin-backup/发现存在/admin-backup/index.php.bak。下载该备份文件发现其中包含数据库连接代码但密码被替换成$flag FLAG{...}。或者在备份文件的注释里发现提示“测试功能请访问/dev_test.php”。访问/dev_test.php发现一个文件读取功能结合备份文件中泄露的绝对路径如/var/www/html/config.php利用目录遍历读取到真正的配置文件里面含有flag。这个流程体现了从信息泄露到漏洞利用的完整链条。4. 以LitCTF 2023为例的实战推演虽然我无法还原原题的所有细节但我们可以构建一个符合其精神的典型场景进行推演。假设场景题目是一个简单的“公司内部通讯录”查询系统首页只有一个搜索框输入员工ID查询信息。题目描述“找到管理员留下的flag”。我们的攻击推演流程初始观察访问网站查看页面源码。在HTML注释中发现一行!-- 临时备份文件已移至 /backup_2023上线前记得删除 --。这是一个关键线索目录枚举使用dirsearch对根目录进行扫描同时重点关注/backup_2023/目录。python3 dirsearch.py -u http://litctf.example.com/backup_2023/ -e zip,gz,bak,php,git,svn,txt扫描结果发现http://litctf.example.com/backup_2023/www.zip(200, 大小可观)http://litctf.example.com/backup_2023/.git/(403)下载并分析备份直接下载www.zip解压后发现是网站源码。快速搜索“flag”关键词grep -r flag\|FLAG\|ctf\|LitCTF ./解压目录/可能在config.php中发现?php // 数据库配置 define(DB_HOST, localhost); define(DB_USER, ctf_user); define(DB_PASS, weak_password_123); define(DB_NAME, litctf_db); // 测试用flag正式环境请移除 $debug_flag LitCTF{This_1s_Not_The_Real_Flag}; ?这里拿到一个假flag常见干扰项说明方向对了但需要更深层的信息。利用.git泄露虽然.git目录返回403但说明它存在。使用git-dumper尝试恢复git-dumper http://litctf.example.com/backup_2023/.git/ ./git_backup cd ./git_backup git status git log --oneline查看提交历史发现一条记录“fix: remove real flag from config”。我们对比这次提交和上一次提交的差异git diff HEAD~1 HEAD config.php在差异中我们看到被删除的真实flagLitCTF{Real_Flag_In_Git_History}。代码审计寻找其他路径同时审计下载的源码。在search.php中发现查询逻辑$id $_GET[id]; $sql SELECT * FROM employees WHERE id . $id . ;存在明显的SQL注入漏洞。但题目要求是信息泄露可能flag不在数据库里。继续审计在admin目录下发现一个notes.txt文件通过目录扫描或源码中发现路径内容为“新API密钥已设置flag作为密钥一部分LitCTF{API_Key_Leak_Here}”。通过这个推演我们综合运用了注释线索、备份文件泄露、.git历史泄露和源码审计最终找到了多个flag。在实际CTF中可能只需要其中一条路径即可解题。5. 防御思路与给开发者的建议聊了这么多攻击面从防御角度其实原则很简单不该留在生产环境的东西坚决清理干净。部署前清理建立严格的部署清单。在构建最终部署包时务必删除或忽略所有版本控制系统的元数据目录.git,.svn,.hg等。编辑器临时文件和备份文件*.swp,*~,*.bak等。系统无关文件.DS_Store,Thumbs.db,desktop.ini。开发调试文件phpinfo.php,test.php,debug.log。Web服务器配置配置服务器禁止访问以点开头的隐藏文件如.git。关闭不必要的目录列表功能。对于静态文件服务器严格限制可访问的文件后缀。使用robots.txt的Disallow指令时要意识到这反而可能暴露路径。代码层面敏感信息密钥、密码、flag绝不硬编码在源码中应使用环境变量或安全的配置管理服务。生产环境关闭详细的错误回显避免泄露路径和堆栈信息。安全扫描将目录扫描、敏感文件检测纳入CI/CD流水线或定期的安全扫描中主动发现潜在泄露。对于CTF选手而言理解这些防御措施能帮助你更好地预测出题人可能在哪里“埋”下flag。通常flag会放在开发者“以为”安全但实际上已经泄露的地方。6. 高级技巧与疑难排查在实际操作中你可能会遇到一些棘手的情况。情况一.git目录能访问但git-dumper恢复失败。可能原因关键对象文件objects/下的文件缺失或不可读。服务器对.git目录做了部分限制如通过.htaccess禁止访问某些文件。应对策略尝试使用wget或curl手动递归下载整个.git目录结构看哪些文件能下。重点检查/.git/index文件它包含了文件树信息。如果能下载可以用git ls-files --stage命令离线查看。尝试使用GitTools中的extractor.sh脚本它有时比git-dumper更鲁棒。情况二扫描出大量疑似备份文件如何快速筛选当字典很大时可能会扫出很多index.php.bak、index.php.old等但大部分返回404或403。应对策略优先关注返回状态码200且响应内容长度Content-Length大于一定值如100字节的文件空文件或默认错误页意义不大。使用工具如ffuf的过滤功能只显示状态码为200、长度特定的结果。ffuf -u http://target/FUZZ -w wordlist.txt -e .php,.bak -mc 200 -fs 0,12 # -mc 200 只匹配状态码200 # -fs 0,12 过滤掉大小为0和12字节的响应可能是默认页对返回200的文件用curl或浏览器快速查看内容开头看是否是文本源码通常以?php、!DOCTYPE、{等开头。情况三通过目录遍历读取源码但被WAF或简单过滤拦截。常见过滤过滤../、etc/passwd等关键字。绕过技巧编码绕过..%2f(URL编码),..%252f(双重URL编码)。绝对路径如果知道Web绝对路径直接读取/var/www/html/index.php。特殊字符....//、..\Windows路径分隔符在PHP on Windows下可能有效。从已知文件包含如果存在本地文件包含LFI可以尝试包含php://filter来读取源码例如?filephp://filter/convert.base64-encode/resourceindex.php这样返回的是base64编码后的源码能绕过一些显示限制。信息泄露是Web安全的基石性技能它成本低、收益高往往是打开复杂漏洞大门的“第一把钥匙”。在CTF中熟练掌握这些套路能让你在比赛中快速拿下基础分在真实的安全评估中它能帮你高效地发现系统的“薄弱面”。最重要的是养成一种思维习惯永远假设开发者会留下痕迹而你的任务就是成为那个最细心的发现者。多练、多刷题、多总结各种泄露的变形你的“搜商”自然会越来越高。