1. 备份泄露CTF中的寻宝游戏在CTF比赛中备份文件泄露就像是一场精心设计的寻宝游戏。想象一下你走进一个布满灰尘的图书馆管理员不小心把珍贵的藏书目录遗落在了公共阅览区——这就是备份泄露的本质。我参加过几十场CTF赛事至少有30%的Web题会涉及这类漏洞新手往往因为缺乏系统性的探测方法而错失良机。备份泄露通常发生在开发人员将.zip、.bak等备份文件遗留在Web目录时。去年某次比赛中我就遇到一个典型场景目标网站首页只有简单的登录框用dirsearch扫描后发现了/wwwroot.zip解压后直接获得了包含flag的数据库配置文件。这类问题之所以高频出现是因为开发环境与生产环境的配置差异——开发时为了方便调试保留的备份文件上线时却忘了删除。常见的备份文件藏匿点就像图书馆的不同书架根目录/就像大厅的展示台经常放着www.zip、backup.tar.gz/admin目录类似管理区书架可能有db_backup.sql/tmp目录相当于临时储物柜可能藏着session.bak2. 自动化探测工具链实战2.1 扫描器双雄ihoneyBakFileScan vs dirsearch在最近的一次AWD比赛中我同时使用了ihoneyBakFileScan和dirsearch进行横向对比。前者专为备份文件扫描优化后者则是全能型选手。实测结果很有意思# ihoneyBakFileScan 专用扫描Python3环境 python3 ihoneyBakFileScan.py -u http://target.com -t 50ihoneyBakFileScan的优势在于内置200备份文件特征从.swp到.git智能状态码判断不仅看200还校验文件大小结果自动分类存储而dirsearch更适合全面探测# dirsearch 综合扫描需提前安装 python3 dirsearch.py -u http://target.com -e php,bak,zip -x 403,404建议的实战策略是先用ihoneyBakFileScan快速扫描备份文件再用dirsearch做深度探测。上周帮学弟调试时就通过这种组合发现了藏在/vendor/.env.bak中的数据库凭证。2.2 自建字典的黄金法则现成工具虽好但遇到定制化CMS就捉襟见肘。我整理了一套字典构建方法基础字典包含通用名称如web、backup、dumpCMS特供比如WordPress用wp-content、themes时间戳变异backup_20230615.zip这类命名很常见这是我常用的字典生成脚本import itertools base [web,site,backup] dates [2023,202306,20230615] suffixes [.zip,.tar.gz,.bak] with open(custom_dict.txt,w) as f: for combo in itertools.product(base, dates, suffixes): f.write(f{combo[0]}_{combo[1]}{combo[2]}\n)3. 从下载到审计的完整链路3.1 智能下载与预处理下载到备份文件只是开始。有次比赛下载了2GB的site.tar.gz解压后发现是伪加密。这时可以用binwalk进行分析binwalk -Me site.tar.gz # 自动递归解压对于非常见格式我准备了应急方案.7z用p7zip处理.rar需要unrar损坏文件用dd修复dd ifcorrupt.zip offixed.zip bs1M convsync3.2 源码审计的三重过滤获得源码后我习惯用三级过滤法快速定位漏洞关键词速查grep -rn password\|secret\|key src/敏感函数扫描danger_funcs [system(, eval(, exec(] for root,_,files in os.walk(src): for f in files: if f.endswith(.php): with open(os.path.join(root,f)) as fd: if any(func in fd.read() for func in danger_funcs): print(f危险函数存在于 {os.path.join(root,f)})配置文件追踪数据库配置config.php、.envAPI密钥constants.py路由规则routes/web.php4. 高级技巧与防御策略4.1 对抗性扫描技术有些CTF会设置陷阱。有次遇到扫描返回200但下载失败的情况后来发现是检测了User-Agent。改进后的扫描脚本headers { User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36, X-Forwarded-For: 127.0.0.1 } response requests.get(url, headersheaders, timeout3) if len(response.content) 500: # 过滤小文件 with open(os.path.basename(url),wb) as f: f.write(response.content)4.2 企业级防护方案根据OWASP建议生产环境应该在nginx配置中阻断备份文件请求location ~* \.(bak|swp|old)$ { deny all; }设置自动化清理脚本每日执行find /var/www -name *.bak -mtime 1 -delete使用git hooks防止误提交# .git/hooks/pre-commit if git diff --cached --name-only | grep -qE \.(bak|swp); then echo 拒绝提交备份文件! exit 1 fi在CTF赛题设计方面可以加入多层混淆。去年我出过一道题将备份文件藏在/static/js/utils.js.map中只有通过源码映射分析才能发现线索。这种设计既考验选手的细致程度也避免了暴力破解的侥幸成功。
CTF——从备份泄露到源码审计:实战工具链与自动化脚本解析
发布时间:2026/7/16 22:41:59
1. 备份泄露CTF中的寻宝游戏在CTF比赛中备份文件泄露就像是一场精心设计的寻宝游戏。想象一下你走进一个布满灰尘的图书馆管理员不小心把珍贵的藏书目录遗落在了公共阅览区——这就是备份泄露的本质。我参加过几十场CTF赛事至少有30%的Web题会涉及这类漏洞新手往往因为缺乏系统性的探测方法而错失良机。备份泄露通常发生在开发人员将.zip、.bak等备份文件遗留在Web目录时。去年某次比赛中我就遇到一个典型场景目标网站首页只有简单的登录框用dirsearch扫描后发现了/wwwroot.zip解压后直接获得了包含flag的数据库配置文件。这类问题之所以高频出现是因为开发环境与生产环境的配置差异——开发时为了方便调试保留的备份文件上线时却忘了删除。常见的备份文件藏匿点就像图书馆的不同书架根目录/就像大厅的展示台经常放着www.zip、backup.tar.gz/admin目录类似管理区书架可能有db_backup.sql/tmp目录相当于临时储物柜可能藏着session.bak2. 自动化探测工具链实战2.1 扫描器双雄ihoneyBakFileScan vs dirsearch在最近的一次AWD比赛中我同时使用了ihoneyBakFileScan和dirsearch进行横向对比。前者专为备份文件扫描优化后者则是全能型选手。实测结果很有意思# ihoneyBakFileScan 专用扫描Python3环境 python3 ihoneyBakFileScan.py -u http://target.com -t 50ihoneyBakFileScan的优势在于内置200备份文件特征从.swp到.git智能状态码判断不仅看200还校验文件大小结果自动分类存储而dirsearch更适合全面探测# dirsearch 综合扫描需提前安装 python3 dirsearch.py -u http://target.com -e php,bak,zip -x 403,404建议的实战策略是先用ihoneyBakFileScan快速扫描备份文件再用dirsearch做深度探测。上周帮学弟调试时就通过这种组合发现了藏在/vendor/.env.bak中的数据库凭证。2.2 自建字典的黄金法则现成工具虽好但遇到定制化CMS就捉襟见肘。我整理了一套字典构建方法基础字典包含通用名称如web、backup、dumpCMS特供比如WordPress用wp-content、themes时间戳变异backup_20230615.zip这类命名很常见这是我常用的字典生成脚本import itertools base [web,site,backup] dates [2023,202306,20230615] suffixes [.zip,.tar.gz,.bak] with open(custom_dict.txt,w) as f: for combo in itertools.product(base, dates, suffixes): f.write(f{combo[0]}_{combo[1]}{combo[2]}\n)3. 从下载到审计的完整链路3.1 智能下载与预处理下载到备份文件只是开始。有次比赛下载了2GB的site.tar.gz解压后发现是伪加密。这时可以用binwalk进行分析binwalk -Me site.tar.gz # 自动递归解压对于非常见格式我准备了应急方案.7z用p7zip处理.rar需要unrar损坏文件用dd修复dd ifcorrupt.zip offixed.zip bs1M convsync3.2 源码审计的三重过滤获得源码后我习惯用三级过滤法快速定位漏洞关键词速查grep -rn password\|secret\|key src/敏感函数扫描danger_funcs [system(, eval(, exec(] for root,_,files in os.walk(src): for f in files: if f.endswith(.php): with open(os.path.join(root,f)) as fd: if any(func in fd.read() for func in danger_funcs): print(f危险函数存在于 {os.path.join(root,f)})配置文件追踪数据库配置config.php、.envAPI密钥constants.py路由规则routes/web.php4. 高级技巧与防御策略4.1 对抗性扫描技术有些CTF会设置陷阱。有次遇到扫描返回200但下载失败的情况后来发现是检测了User-Agent。改进后的扫描脚本headers { User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36, X-Forwarded-For: 127.0.0.1 } response requests.get(url, headersheaders, timeout3) if len(response.content) 500: # 过滤小文件 with open(os.path.basename(url),wb) as f: f.write(response.content)4.2 企业级防护方案根据OWASP建议生产环境应该在nginx配置中阻断备份文件请求location ~* \.(bak|swp|old)$ { deny all; }设置自动化清理脚本每日执行find /var/www -name *.bak -mtime 1 -delete使用git hooks防止误提交# .git/hooks/pre-commit if git diff --cached --name-only | grep -qE \.(bak|swp); then echo 拒绝提交备份文件! exit 1 fi在CTF赛题设计方面可以加入多层混淆。去年我出过一道题将备份文件藏在/static/js/utils.js.map中只有通过源码映射分析才能发现线索。这种设计既考验选手的细致程度也避免了暴力破解的侥幸成功。