
1. 项目概述一次典型的Web备份文件泄露漏洞挖掘最近在带新人入门CTFCapture The Flag时我常常会拿一些经典的Web题目作为案例。今天要拆解的这道“[ACTF2020 新生赛]BackupFile1”就是一个非常典型的、旨在考察基础信息收集与备份文件泄露漏洞的入门级题目。它没有复杂的代码审计也没有绕来绕去的逻辑核心就是考察一个渗透测试人员或安全爱好者最基础的习惯你是否会去尝试寻找那些本不该被公开访问的备份文件。这道题目的场景非常贴近真实环境。在真实的网站开发与运维过程中开发者为了方便可能会在Web目录下留下诸如.bak、.swp、.tar.gz、.zip甚至是index.php.bak、www.zip这样的备份文件或临时文件。如果服务器配置不当没有禁止访问这些后缀那么攻击者就可以直接下载这些文件从而获取到网站的源代码、配置文件甚至是数据库连接信息。这道题就是模拟了这样一个场景它的价值在于用一个极其简单的入口引导新手建立起“信息收集是第一步”以及“常见漏洞往往源于疏忽”这两个关键的安全意识。对于刚接触CTF Web方向的新手来说这道题是一个完美的起点。它不要求你掌握复杂的编程语言也不需要你理解深奥的加密算法只需要你有一个浏览器一点好奇心和一套基础的“三板斧”操作流程。接下来我就带你完整地走一遍这道题的解题思路、实操过程并分享一些我在实战和教学中总结出来的、关于备份文件泄露漏洞的深度技巧与避坑指南。2. 解题思路拆解与信息收集方法论面对任何一道CTF Web题或者一次真实的渗透测试授权评估我们都不能像无头苍蝇一样乱撞。一个清晰的思路能极大提升效率。对于这道“BackupFile1”题目名称已经给出了最强烈的暗示——“备份文件”。我们的解题思路可以非常直接地分为三步访问目标、寻找备份文件、分析备份文件获取Flag。但这三步之中每一步都有值得深究的细节和方法论。2.1 初始访问与基础观察首先我们访问题目给出的目标地址在BUUCTF平台中这会是一个随机的域名或IP:端口。通常这类入门题的Web界面会非常简洁可能只有一个简单的登录框、一句提示语或者干脆就是一个默认的Apache/Nginx欢迎页面。关键动作查看页面源代码CtrlU这是必须做的第一步。开发者有时会把提示、注释甚至是隐藏的路径直接写在HTML注释里。比如可能会看到!-- Try to find source file! --或!-- /index.php.bak --这样的提示。观察URL与参数留意地址栏的URL结构。是http://target/还是http://target/index.php有没有任何GET参数如?pagehome这些信息虽然在此题可能用不上但养成观察习惯很重要。使用浏览器开发者工具F12查看“网络”Network选项卡刷新页面观察加载了哪些额外的资源js、css、图片。有时备份文件可能以静态资源的形式被引用或者从加载过程中能发现目录结构线索。实操心得很多新手会忽略查看源代码这一步直接上工具扫描。其实人工观察往往能最快发现出题人留下的“善意”提示尤其是在新生赛题目中。工具是辅助人的判断才是核心。2.2 备份文件命名规律与常见位置题目叫“BackupFile”那么备份文件可能叫什么名字会放在哪里这里就需要一些经验积累和思维发散。常见备份文件名需要逐一尝试通用备份backup、backup.tar、backup.tar.gz、backup.zip、www.zip、website.zip、src.zip。源码备份index.php.bak、index.bak、index.php~、.index.php.swp(vim临时文件)、index.php.save。数据库备份dump.sql、database.sql、backup.sql。配置备份config.bak、.config.php.swp、web.config.bak。目录列表尝试访问/backup/、/admin/、/tmp/等目录看是否开启了目录浏览可能直接看到备份文件。常见存放位置Web根目录最直接的位置也就是我们访问/时所在的目录。直接尝试http://target/backup.zip。上级或隐藏目录如/www/backup/、/var/www/backup/。但在CTF中由于通常只映射了Web根目录这类绝对路径可能无法直接访问。通过参数或路由暗示的目录如果题目有其他功能点可能会暗示路径。为什么是这些名字这源于开发者的常见操作习惯。bak是“backup”的缩写~是许多文本编辑器如nano保存的备份文件后缀.swp是vim编辑器的交换文件在编辑文件时产生如果vim非正常退出这个文件就会留在原地www.zip可能是开发者为了方便将整个网站目录打包后随手放在Web目录下。2.3 工具辅助与自动化探测手动尝试几个常见文件名是可行的但如果没找到或者想更全面就需要借助工具。这里不涉及复杂漏洞扫描主要是目录和资源枚举。常用工具Dirsearch一个强大的命令行Web路径扫描器。命令示例python3 dirsearch.py -u http://target -e php,bak,tar,gz,zip,sql,swp,~。-e参数指定扩展名针对备份文件扫描非常有效。Gobuster另一个高效的目录爆破工具。命令示例gobuster dir -u http://target -w /path/to/wordlist -x php,bak,zip。浏览器插件如Wappalyzer可以快速识别网站技术栈间接判断可能的后缀如识别出ThinkPHP则可以尝试.bak。自定义字典工具的效率取决于字典。你可以维护一个自己的“备份文件字典”包含上述常见命名并不断从实战和题目中积累新的名称。注意事项在CTF平台或授权测试中使用扫描工具时要注意速率限制避免对服务器造成压力。有些CTF平台会封禁过于频繁的请求IP。在真实环境中未经授权的扫描是违法行为。3. 核心漏洞原理备份文件泄露的深度解析找到备份文件只是开始理解其背后的安全原理才能举一反三。备份文件泄露漏洞本质上是一个“信息泄露”漏洞属于OWASP Top 10中“安全配置错误”和“敏感信息泄露”的范畴。3.1 漏洞产生的原因链条这个漏洞的产生通常是一条松懈的开发-部署链条的结果开发阶段程序员A在本地调试index.php编辑器自动生成了index.php.bak或.index.php.swp。他为了方便将整个目录打包成www.zip准备上传到测试服务器。部署阶段程序员A通过FTP/SFTP将文件上传到生产服务器的Web目录/var/www/html/。他可能直接拖拽了整个文件夹无意中将备份文件也一并上传。服务器配置阶段运维人员B配置了Nginx/Apache但只关注了主要PHP文件的解析没有在配置中禁止访问某些敏感后缀。例如Nginx中缺少了对.bak、.swp、.zip文件的访问限制规则。访问阶段攻击者C通过猜测或扫描直接访问了http://target/www.zip。服务器配置没有拒绝该请求于是将该文件作为普通静态文件如application/zip返回给了攻击者。关键配置缺失示例以Nginx为例一个安全的配置应该显式地阻止某些文件的访问。location ~* \.(bak|swp|save|~|zip|tar|gz|sql)$ { deny all; return 404; }如果缺少了这样的规则漏洞就产生了。3.2 泄露信息的危害等级根据备份文件类型的不同危害程度也不同高危源代码备份.zip.tar.gz。直接暴露所有业务逻辑、数据库配置可能含密码、API密钥、加密盐等。相当于把房子的设计图和钥匙都给了攻击者。中危单个源码备份文件.php.bak。暴露特定文件的逻辑可能包含关键功能点的漏洞。低危编辑器临时文件.swp~。可能包含未保存的修改内容或部分源代码信息可能不完整但仍有价值。对于这道CTF题我们获取的备份文件假设是index.php.bak或一个zip包里就藏着下一步的线索通常是包含flag的PHP代码逻辑。4. 实战解题过程全记录假设我们通过上述方法发现并下载了目标网站上的index.php.bak文件。现在进入实战分析阶段。4.1 获取与初步分析备份文件下载文件在浏览器地址栏输入http://[目标地址]/index.php.bak浏览器会提示下载。保存到本地。确定文件类型使用file命令Linux/Mac或通过查看文件扩展名/编辑器识别。.bak文件通常是纯文本文件可能是PHP、Python、Java等源代码的备份。在本题中它应该是一个PHP文件。使用合适的工具打开用文本编辑器如VS Code、Sublime Text、Notepad打开。切勿在未检查的情况下直接在Web服务器环境或敏感主机上打开未知文件。4.2 源代码审计与Flag定位打开index.php.bak我们可能会看到类似如下的代码?php error_reporting(0); highlight_file(__FILE__); // 假想的题目代码开始 $flag flag{this_is_a_fake_flag_for_example}; if (isset($_GET[key])) { $key $_GET[key]; if ($key 123456) { echo Congratulations! The flag is: . $flag; } else { echo Wrong key!; } } else { echo Please provide a key parameter.; } // 假想的题目代码结束 ?代码分析error_reporting(0);关闭错误显示防止信息泄露。highlight_file(__FILE__);高亮显示当前文件源代码。这是一个非常重要的线索这意味着出题人可能希望我们通过某种方式看到这个备份文件的源代码。但通常直接访问.bak文件服务器不会把它当作PHP解析而是当作纯文本下载所以我们才能看到源码。如果直接访问index.php这个highlight_file函数会显示index.php自己的源码如果存在的话但通常真正的index.php可能被修改或重定向了。核心逻辑代码定义了一个$flag变量然后检查GET参数key。如果key的值等于123456就输出Flag。解题操作根据代码逻辑我们只需要访问http://[目标地址]/index.php?key123456即可。但请注意这里有一个常见的陷阱我们分析的是index.php.bak而我们要访问的是index.php。index.php是服务器实际执行的脚本。bak文件里的逻辑就是index.php文件的逻辑在备份时刻的样子。所以我们的操作对象是index.php。4.3 另一种常见题型ZIP压缩包中的源码如果找到的不是.bak文件而是一个www.zip或backup.zip呢下载并解压得到完整的网站源码目录。寻找入口文件通常解压后会有index.php、flag.php、config.php等文件。代码审计用编辑器逐一查看关键文件。Flag可能直接写在某个PHP文件中如flag.php里就是?php $flag“flag{...}”; ?直接访问这个文件就能看到。需要通过逻辑判断获取比如在index.php中包含include了flag.php但需要满足特定条件如POST一个正确的密码才会显示$flag变量。藏在数据库或远程资源中代码显示连接数据库获取flag或从某个远程地址读取。这时你需要根据代码中的配置数据库IP、端口、用户名、密码这些可能写在config.php里且在CTF中通常是假的或本地的在本地或题目环境中进行交互。但在此类备份文件题目中为了简化Flag更可能直接硬编码在源码里。实操示例假设找到www.zip解压后目录结构www.zip ├── index.php ├── flag.php └── style.css查看index.php?php include(‘flag.php’); if ($_POST[‘password’] ‘admin123’) { echo $flag; } else { highlight_file(__FILE__); } ?那么我们只需要用HackBar、curl或者构造一个HTML表单向index.php提交一个POST请求字段password的值为admin123即可获得Flag。踩坑记录曾经遇到一个题目解压zip后flag就在一个叫flag.txt的文件里。但很多同学解压后习惯性地只去看PHP文件用编辑器打开各种.php找半天却忽略了最简单的文本文件。信息收集一定要全面解压后先用tree或ls -la命令看看所有文件对每个文件都保持好奇。5. 工具使用技巧与深度优化虽然这道题手动就能解决但掌握工具能让你在更复杂的环境中游刃有余。5.1 Dirsearch 深度使用指南Dirsearch不是简单跑一下默认字典就完事的。针对备份文件扫描可以这样优化1. 定制扩展名列表 (-e)python3 dirsearch.py -u http://target -e php,bak,swp,~,zip,tar,gz,sql,rar,7z,txt,log,json,yml,yaml,conf,config,inc,old,backup,save2. 使用递归扫描 (-r)有时备份文件不在根目录而在子目录下。-r参数可以递归扫描但要注意深度避免请求过多。python3 dirsearch.py -u http://target -e zip,bak -r -R 2-R 2表示递归深度为23. 调整线程与延迟 (-t,--delay)在CTF平台或敏感环境中降低线程数并增加延迟是礼貌且安全的。python3 dirsearch.py -u http://target -e bak,zip -t 10 --delay 0.54. 使用自定义字典 (-w)自己整理一个backup_wordlist.txt包含各种可能的备份文件名和目录名效果远好于通用字典。backup www website src source back db database dump sql ...5.2 浏览器开发者工具的进阶用法除了看源码和网络请求开发者工具还能做更多检查“源代码”面板中的“页面”文件树有些网站是单页应用SPA其“源代码”看起来很简单。但在开发者工具的“源代码”Sources面板中左侧文件树可能会列出服务器上所有可访问的静态资源有时能意外发现/backup/目录或.zip文件。监控非常规请求在“网络”面板中勾选“保留日志”Preserve log然后进行页面交互。有时点击某个按钮或提交表单会触发对某个资源文件如/api/backup.php的请求这可能是隐藏的备份功能点。查看JS文件前端JS代码中有时会包含硬编码的API路径、调试信息甚至是不该出现的内部路径如const backupUrl ‘/admin/backup.zip’;。6. 防御策略与安全开发建议作为攻击者我们找到了漏洞作为开发者或运维我们必须堵上漏洞。以下是一些切实可行的防御措施1. 开发环境与生产环境严格分离使用.gitignore在版本控制中忽略备份文件、编辑器临时文件、日志文件等。例如在.gitignore中添加*.bak *.swp *.~ .DS_Store *.log /vendor/ .env构建与部署流程化使用CI/CD如Jenkins, GitLab CI进行自动化部署。部署的产物应该是经过构建如npm run build后的纯净文件而不是直接从开发目录复制。2. 服务器配置加固Web服务器配置在Nginx/Apache配置中显式禁止访问敏感文件类型。Nginx示例在server块内location ~* \.(bak|swp|save|~|zip|tar|gz|sql|log|inc|conf|config|env)$ { deny all; access_log off; log_not_found off; return 404; } # 同时隐藏常见的隐藏文件/目录 location ~ /\.(git|svn|ht) { deny all; access_log off; log_not_found off; return 404; }文件系统权限确保Web根目录下的文件权限最小化。通常目录设置为755文件设置为644。避免使用777权限。3. 安全扫描与自查定期进行漏洞扫描使用自动化工具如Nessus, OpenVAS或专用Web扫描器如Acunetix, Nikto对自身网站进行扫描Nikto尤其擅长发现这类配置错误和暴露的文件。人工复查定期在浏览器中尝试访问http://yoursite.com/robots.txt、http://yoursite.com/.git/、http://yoursite.com/www.zip等常见敏感路径进行快速自查。4. 安全意识培训让开发团队了解备份文件泄露的风险养成不在Web目录存放临时文件、及时清理测试文件的好习惯。7. 举一反三相关漏洞场景扩展掌握了备份文件泄露你可以将其思路扩展到其他类似的信息泄露漏洞版本控制信息泄露.git/、.svn/、.hg/目录泄露。如果这些目录能被访问攻击者可以下载整个版本库获取所有历史代码和提交记录。工具GitHack,dvcs-ripper。配置文件泄露web.config、.env、config.php、application.properties等配置文件直接可访问泄露数据库密码、API密钥、加密盐等。日志文件泄露access.log、error.log、debug.log。日志中可能包含用户会话ID、SQL查询语句甚至密码、程序错误信息泄露路径和代码片段。目录遍历与目录列表如果服务器配置了Options IndexesApache或autoindex on;Nginx且没有对目录进行访问控制攻击者可以直接浏览目录看到所有文件名。备份文件变种文件名可能不是常见的bak而是时间戳如backup_20231027.zip或者是带hash值的名字如source_4a3b2c1d.tar.gz。这需要结合字典爆破和一定的运气。这道“[ACTF2020 新生赛]BackupFile1”就像一把钥匙它打开的不是一道题的门而是通往Web安全基础领域的一扇窗。它用最直接的方式告诉你安全往往始于最细微的疏忽而强大的攻击者也始于最基础的信息收集。下次当你访问一个网站时不妨在地址栏后随手加上一个/robots.txt或/www.zip试试看仅限授权测试环境你可能会对“安全”二字有更直观的理解。在实战中这种漏洞往往不会单独给你一个Flag但它通常是进入内网、获取源码进行白盒审计、发现其他高危漏洞的完美起点。