“鹏云杯”第十二届山东省大学生网络安全技能大赛 初赛wp
题目不算难,但比赛py似乎有点严重
web1_fix
JWT 验证绕过与提权
受影响版本的python-jwt会同时接受 JSON JWS 与 compact JWS。将一枚合法签名的 compact JWT拆成header.payload.signature,再构造一个 JSON 形式的 JWS,把这三个字段原样放在"protected"|"payload"|"signature",同时在 JSON 的最前面再放入一个假的 compact 片段:"header.fake_payload."。库在验签时使用 JSON 部分的签名通过校验,但在返回 claims 时却读取前面的假 payload,从而实现不改签名的 claim 覆写(把role提升为admin)。Jinja2 模板注入(SSTI)
/api/report/generate在template非空时把整页交给render_template_string。代码只对template参数检查{{,但未过滤title与用户姓名。可在title注入表达式读取本地文件。
打cve-2022-39227
(过程有点懒得写了,所以就不写了)
1 | BASE='http://119.45.255.233:29665' |
ezcrypto

1 | from Crypto.Util.number import long_to_bytes, inverse |
rsaaa
当 p 和 q 很大时,n4 是这个表达式中的绝对主导项,而 p4+q4 相对于 n4 是一个较小的项。所以,我们可以做出一个关键的近似:
ϕ≈n4
题目给出的核心关系是:
e⋅d≡1(modϕ)
这等价于存在一个整数 k,使得:
e⋅d−k⋅ϕ=1
现在,我们用 n4 来近似 ϕ:
e⋅d−k⋅n4≈1
由于 e⋅d 和 k⋅n4 都非常大,这个 “1” 可以忽略不计,所以:
e⋅d≈k⋅n4

一把梭https://g.co/gemini/share/78a8a156a7f5
1 | from Crypto.Util.number import long_to_bytes |
game
ida打开到main,反编译

进sub_136D发现是迷宫的初始化
sub_1992是读取输入内容
sub_171E是判断,所以进去看
1 | __int64 __fastcall sub_171E(char a1) |
进入sub_1805
1 | int sub_1805() |
看到byte_4020,byte_4060有异或
sub_14FA:
1 | int __fastcall sub_14FA(int a1, int a2) |
这里对进行了4次操作,-1-2+3+4,所以在脚本上加上,提出来byte_4020和byte_4060
1 | a=[0x22,0xC6,0x39,0x8E,0xDC,0x0B,0x59,0x4C,0xFA,0xA3,0x05,0x86,0xCF,0x3D,0xB7,0x1D,0x63,0xAC,0x2E,0xEF,0x44,0x97,0x5C,0x7B,0xD2,0x08,0x89,0xB9,0x36,0xC9,0x4A,0x13,0x9C,0xDE,0x29,0x6C,0xF7,0x53,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00] |
error
ida打开到main,反编译

发现这里对s1和s2进行了比较
提出来s2=’d2e7f6d2f17123532dd8996ec04d94a6912dafd6f1b37c1d264d43a91d804d63542ef89b’
看sub_127E是加密操作,所以让gpt写,但是乱码,观察汇编,发现loc_12A7中

所以把12AE这里改成1

之后代码就完整了,扔给gpt
1 | __int64 __fastcall sub_127E(__int64 a1, int a2) |
写解密脚本
解密需按 i=2→0 逆序执行,先还原置换(i 偶数:两两交换;i 奇数:整体反转),再对每字节做inv_sub_1249(x, i+1),最后异或同一轮密钥 byte_2060[j%16]。下面给出 Python 脚本,默认把 sub_1249 视为“左循环位移 ROL n”,其逆为“右循环位移 ROR n”
拿byte_2060=[
0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F, 0x70, 0x81, 0x92, 0xA3,
0xB4, 0xC5, 0xD6, 0xE7, 0xF8, 0x09, 0x10, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00]
1 | # -*- coding: utf-8 -*- |