1. 题目背景与初步分析
这道CTF题目展现了一个典型的PHP文件包含漏洞利用场景。当我第一次打开页面时,看到的是一个简单的用户名密码登录界面,页面提示"用户名密码错误"。这种看似普通的登录表单往往隐藏着玄机,作为安全研究人员,我的第一反应就是查看页面源代码。
在源代码中发现了关键线索:md5($secret.$name)===$pass。这意味着系统验证逻辑是将一个未知的$secret字符串与用户输入的name拼接后进行MD5哈希,然后与用户提交的pass值进行比较。由于我们不知道$secret的值,直接破解这个验证机制显然不太现实。
2. 认证机制分析与绕过
2.1 Cookie哈希值观察
我尝试输入name=1并抓包,发现响应中Set-Cookie头部包含一个哈希值。当我把name改为7时,这个哈希值也随之改变。这个现象让我意识到:服务器可能在Cookie中返回了md5($secret.$name)的计算结果。
提示:在实际渗透测试中,这种将计算结果直接返回给客户端的做法非常危险,相当于暴露了部分验证逻辑的内部状态。
2.2 构造有效认证
既然Cookie中的哈希值就是pass应有的值,那么我们可以:
- 先提交
name=1获取对应的哈希值 - 然后用这个哈希值作为
pass,name保持为1再次提交
实际操作后发现返回404错误,看似失败了。但通过检查响应包,发现了一个重要线索:服务器在响应头中泄露了flflflflag.php文件的存在。
3. 文件包含漏洞利用
3.1 初步文件包含测试
访问flflflflag.php并抓包分析,发现这个文件存在文件包含漏洞。尝试使用常见的PHP伪协议(如php://filter)时,服务器只是返回首页面,没有显示预期内容。
3.2 目录信息收集
使用dirsearch进行目录扫描后发现了dir.php,访问它显示:
array(2) { [0]=> string(1) "." [1]=> string(2) ".." }这是PHP的scandir()函数输出,表明当前目录为空。这种情况通常出现在/tmp目录下,提示我们可能需要利用PHP临时文件机制。
4. PHP临时文件包含攻击
4.1 攻击原理分析
PHP处理文件上传时会创建临时文件,通常在以下两种情况下这些临时文件可能被利用:
- 通过向phpinfo页面发送大量数据,使临时文件未被及时删除
- 在PHP版本<7.2时,利用PHP崩溃留下的临时文件
4.2 实际攻击实施
我编写了以下Python脚本进行攻击:
import requests from io import BytesIO payload = "<?php phpinfo()?>" file_data = { 'file': BytesIO(payload.encode()) } url = "http://target/flflflflag.php?"\ +"file=php://filter/string.strip_tags/resource=/etc/passwd" r = requests.post(url=url, files=file_data, allow_redirects=False)这个脚本的关键点在于:
- 通过
php://filter绕过文件包含限制 - 利用POST上传创建临时文件
string.strip_tags过滤器会导致PHP崩溃,留下临时文件
4.3 验证攻击效果
执行脚本后再次访问dir.php,发现多出了一个随机命名的临时文件(如phpFuLK0i)。由于无法直接访问/tmp目录下的文件,需要通过路径遍历来包含这个文件:
http://target/flflflflag.php?file=../../../tmp/phpFuLK0i成功执行后,在phpinfo页面中找到了隐藏的flag。
5. 技术细节与防御建议
5.1 漏洞成因深度分析
这道题目综合了多个安全漏洞:
- 敏感信息泄露(Cookie中返回哈希值)
- 文件包含漏洞(未对包含路径进行过滤)
- 临时文件竞争条件(PHP处理异常时未及时删除临时文件)
5.2 实际防御方案
对于开发人员,建议采取以下防护措施:
- 禁用危险函数:在php.ini中设置
disable_functions = scandir,exec,passthru... - 配置open_basedir限制文件访问范围
- 对文件包含参数进行严格白名单过滤
- 使用最新版PHP(>=7.4)并保持更新
6. 扩展思考与类似漏洞
这种攻击方式不仅限于CTF比赛,在真实Web应用中也存在类似风险。例如:
- WordPress插件中的文件包含漏洞
- 旧版PHP框架的模板注入问题
- 文件上传功能中的竞争条件漏洞
重要提示:在实际渗透测试中,使用这种技术前必须获得明确授权,未经授权的测试可能违反法律。