2024年第九届“楚慧杯”湖北省网络与数据安全实践能力竞赛 WP
字数 1384 2025-08-22 12:22:30

"楚慧杯"湖北省网络与数据安全竞赛WP教学文档


一、Web题目解析

  1. 速算比赛(SSTI漏洞)

    • 漏洞点:Jinja2模板注入,通过{{config.__class__.__init__.__globals__.os.popen('tac /flag').read()}}直接读取系统文件。
    • 关键技巧
      • 利用__globals__获取Python全局对象,调用os.popen执行命令。
      • 绕过过滤:确保payload无空格或特殊字符(如{{config|attr(...)}})。
  2. popmart反序列化

    • 漏洞代码
      class popmart {
          public function __wakeup() {
              if ($this->molly === $this->yuki) echo $flag;
          }
      }
      
    • 利用步骤
      1. 构造序列化数据:O:7:"popmart":3:{s:4:"yuki";s:13:"dont_tell_you";s:5:"molly";s:13:"dont_tell_you";...}
      2. 触发条件:通过unserialize($_POST['pucky'])触发__wakeup,需满足$pucky="二仙桥"且POST两次。

二、Misc题目解析

  1. 不良劫(图片隐写)

    • 步骤
      1. 文件分离:binwalk提取隐藏文件,得到残缺二维码。
      2. 修复二维码:补全定位符后扫描,获flag第一部分DASCTF{014c6e74-0c4a-48fa...}
      3. 盲水印:合并面具图片,使用stegsolve提取完整flag。
  2. gza_Cracker(字典爆破)

    • 解法
      • 从TCP流11提取字典,暴力破解编码数据。
      • Flag格式:DASCTF{M0Y_W1sh_Y0u_LogF1le_Usg32WEM}
  3. ds-findphone(数据提取)

    • 脚本关键:正则匹配734等前缀的电话号码:
      pattern = rb'73[4-9]\d{8}'  # 匹配734-739开头的号码
      
    • 输出CSV后拼接flag:DASCTF{66079048478833352585733002322295}

三、Crypto题目解析

  1. ddd(Wiener攻击)

    • 攻击条件:RSA中私钥d较小(满足d < 1/3 * N^(1/4))。
    • 实现代码
      def wienerAttack(e, n):
          cf = continuedFra(e, n)  # 计算连分数展开
          for d, k in getGradualFra(cf):
              if (e*d - 1) % k == 0:
                  phi = (e*d - 1) // k
                  p, q = solve_pq(1, n - phi + 1, n)  # 解方程
                  if p*q == n: return d
      
    • 结果:解密得明文。
  2. QAQTAT(离散对数)

    • 非预期解
      1. 计算矩阵行列式,转化为GF(p)上的DLP问题。
      2. 使用cado-nfs求解离散对数:
        ./cado-nfs.py -dlp -ell $r target=$t $p
        
      3. 通过crt组合结果恢复密钥s
  3. Mypow(自定义幂函数)

    • 漏洞点pow(m, e, n)e为奇数时实际计算pow(m, e-1, n)
    • 解法
      1. 分解n(通过hint构造方程2x² - hint*x + 7n = 0p)。
      2. GF(p)GF(q)上开e-1次方根,CRT组合后筛选含DASCTF的明文。

四、Reverse题目解析

  1. bouquet(逆向爆破)
    • 关键逻辑:逐字符校验输入,错误时输出行数减少。
    • 爆破脚本
      for i in range(25):
          for c in 'j7aw_sC3addq4TAo}8_Fda{SD':
              f[i] = c
              output = subprocess.run(f, input=''.join(f), capture_output=True)
              if len(output.stdout.splitlines()) == 49 - i*2:
                  print(c, end='')
                  break
      
    • FlagDASCTF{...}(具体值由爆破结果确定)。

五、总结

  • Web:SSTI、反序列化利用需熟悉语言特性。
  • Misc:综合考察文件分析、隐写工具和数据处理能力。
  • Crypto:Wiener攻击、离散对数、非标RSA是高频考点。
  • Reverse:动态调试与爆破结合,注意输出反馈。

附录:完整代码和工具链(如stegsolvecado-nfs)需提前配置。

"楚慧杯"湖北省网络与数据安全竞赛WP教学文档 一、Web题目解析 速算比赛(SSTI漏洞) 漏洞点 :Jinja2模板注入,通过 {{config.__class__.__init__.__globals__.os.popen('tac /flag').read()}} 直接读取系统文件。 关键技巧 : 利用 __globals__ 获取Python全局对象,调用 os.popen 执行命令。 绕过过滤:确保payload无空格或特殊字符(如 {{config|attr(...)}} )。 popmart反序列化 漏洞代码 : 利用步骤 : 构造序列化数据: O:7:"popmart":3:{s:4:"yuki";s:13:"dont_tell_you";s:5:"molly";s:13:"dont_tell_you";...} 。 触发条件:通过 unserialize($_POST['pucky']) 触发 __wakeup ,需满足 $pucky="二仙桥" 且POST两次。 二、Misc题目解析 不良劫(图片隐写) 步骤 : 文件分离: binwalk 提取隐藏文件,得到残缺二维码。 修复二维码:补全定位符后扫描,获flag第一部分 DASCTF{014c6e74-0c4a-48fa...} 。 盲水印:合并面具图片,使用 stegsolve 提取完整flag。 gza_ Cracker(字典爆破) 解法 : 从TCP流11提取字典,暴力破解编码数据。 Flag格式: DASCTF{M0Y_W1sh_Y0u_LogF1le_Usg32WEM} 。 ds-findphone(数据提取) 脚本关键 :正则匹配734等前缀的电话号码: 输出CSV后拼接flag: DASCTF{66079048478833352585733002322295} 。 三、Crypto题目解析 ddd(Wiener攻击) 攻击条件 :RSA中私钥 d 较小(满足 d < 1/3 * N^(1/4) )。 实现代码 : 结果 :解密得明文。 QAQTAT(离散对数) 非预期解 : 计算矩阵行列式,转化为 GF(p) 上的DLP问题。 使用 cado-nfs 求解离散对数: 通过 crt 组合结果恢复密钥 s 。 Mypow(自定义幂函数) 漏洞点 : pow(m, e, n) 在 e 为奇数时实际计算 pow(m, e-1, n) 。 解法 : 分解 n (通过 hint 构造方程 2x² - hint*x + 7n = 0 求 p )。 在 GF(p) 和 GF(q) 上开 e-1 次方根,CRT组合后筛选含 DASCTF 的明文。 四、Reverse题目解析 bouquet(逆向爆破) 关键逻辑 :逐字符校验输入,错误时输出行数减少。 爆破脚本 : Flag : DASCTF{...} (具体值由爆破结果确定)。 五、总结 Web :SSTI、反序列化利用需熟悉语言特性。 Misc :综合考察文件分析、隐写工具和数据处理能力。 Crypto :Wiener攻击、离散对数、非标RSA是高频考点。 Reverse :动态调试与爆破结合,注意输出反馈。 附录 :完整代码和工具链(如 stegsolve 、 cado-nfs )需提前配置。