bak文件 — 考点精讲

前置知识:HTTP 协议基础 — 先了解 HTTP 协议基础再来看本考点

原理精讲 — 备份文件是怎么来的?

编辑器/工具自动生成

备份文件是开发者在编辑/部署过程中留下的”痕迹”:

flowchart LR
 A[编辑器/工具保存文件] --> B[自动留下备份]
 B --> C[index.php.bak]
 B --> D[index.php~]
 B --> E[.index.php.swp]
 B --> F[部署时打包备份]
 F --> G[index.php.tar.gz / www.zip]
 C --> H[备份留在 Web 目录]
 D --> H
 E --> H
 G --> H
 H --> I[攻击者直接下载源码]
备份来源典型文件名说明
文本编辑器另存备份index.php.bak / index.php.old编辑器手动另存留档
Vim 交换文件.index.php.swpVim 编辑中断残留,见 vim缓存
Vim 备份index.php~开启备份选项后自动生成
压缩工具打包index.php.zip / www.zip手动打包整个站点,见 网站源码
版本管理残留.git/ / .svn/完整历史源码

为什么 .bak 直接能看到源码?

.bak(backup)是纯文本备份,没有 .php 扩展名,Web 服务器不会交给 PHP 解析器,直接当静态文本返回。这跟 .php 文件”服务器执行后再输出”完全不同:

文件服务器行为攻击者看到
index.php交给 PHP 执行只有渲染后的 HTML
index.php.bak当静态文本返回原始 PHP 源码(含注释、密码、逻辑)

源码泄露的危害

拿到源码等于拿到网站的设计图:数据库连接密码、SQL 语句、过滤逻辑、后门路径、以及写在注释里的 flag。

命名规律

单文件备份的后缀有规律:bak / old / ~ / swp / txt,对应不同的编辑器或工具。提示点名的文件名(如 index.php)直接配后缀试,命中率极高。

注意事项

易错点说明
先看提示首页点名 index.php → 值空间就是文件名,只剩后缀维度
后缀带全bak old ~ swp txt 都试;编辑器不同后缀不同
.bak 是纯文本直接 curl 就能看,不需要 strings/vim 恢复(那是 .swp 才要)
flag 在注释里源码里的 // FLAG: ... 注释,grep flag 搜出来
没提示时文件名也要枚举(index/website/www/backup),trav 两维组合

题目解法

CTFHub 技能树位置:CTFHub → Web → Web 信息泄露 → 备份文件下载 → bak文件

提示:后缀枚举也可以用 trav 一行搞定(trav "目标/" "index.php" "!=404" --ext ".bak&.old&~&.swp&.txt")。trav 的源码与完整用法见首次引入处 基本认证遍历脚本

解法(curl 终端):

# 1. 后缀枚举(提示已点名 index.php)
for ext in bak old ~ swp txt; do
 code=$(curl -s -o /dev/null -w "%{http_code}" "http://目标/index.php.$ext")
 [ "$code" != "404" ] && echo "HIT: /index.php.$ext -> $code"
done
# 命中 index.php.bak
 
# 2. 直接下载看源码(.bak 是文本文件,原样返回)
curl -s "http://目标/index.php.bak"
# 源码注释里就是 flag:
# <?php
# // FLAG: ctfhub{5cbfbfc0439df8b55abda7fc}
# echo "Flag in index.php source code.";
# ?>

解法(浏览器):直接访问 http://目标/index.php.bak,浏览器显示纯文本源码,Ctrl+F 搜 flag。

同类变式(备份文件下载大类)

考点说明终端提取
bak 文件(本题)index.php.bak 直接泄露源码,flag 在注释里curl 目标/index.php.bak
编辑器备份index.php~ 同理泄露源码curl 后 grep
整站压缩包www.zip 打包整个站点网站源码
vim 交换文件.index.php.swp 二进制,需 strings/vim 恢复vim缓存
DS_Store 泄露macOS 目录元数据,泄露完整文件清单dsstore --notes URL/.DS_Store,见 DS_Store
.old / .txt改名备份,内容相同但更隐蔽后缀枚举时多带几个
.git / .svn 泄露版本库可下载,还原完整历史gitdump URL,见 Git泄露
备份文件下载-命令执行备份里含可执行代码变种CTFHub 同类进阶题

核心知识点总结

概念说明
备份文件编辑器/工具/部署留下的 .bak~.swpzip 等文件
非 PHP 扩展名.bak 不会被 PHP 解析,源码原样返回
源码泄露注释、密码、逻辑全部暴露,flag 常见藏身处
页面提示首页提示指向文件,先猜名字再枚举后缀
trav 组合文件名 × 后缀用 --ext 一把扫完
与 .swp 区别.bak 纯文本直接看;.swp 二进制要 strings/vim 恢复
防御角度部署后删除备份文件;备份放 Web 目录外

关联教程