Skip to content

会赢吗?

本题考查的是网页和 JavaScript 的基础知识。

JavaScript 是现代网络开发中最重要的编程语言之一,它的历史充满了快速迭代、竞争、以及变革。它最早诞生于 1995 年,由 Brendan Eich 在短短 10 天内开发,并逐步演变成为如今的标准化、多功能的编程语言。

第一关

按下 F12,使用开发者工具查看源码

第一关

第二关

控制台是开发者调试 JavaScript 代码的利器,允许开发者在无需修改源代码的情况下,直接执行和测试代码。这种即时反馈机制使得开发者可以迅速验证假设、检查问题或尝试新的代码逻辑。

仔细看源代码:

html
<script>
  async function revealFlag(className) {
    try {
      const response = await fetch(`/api/flag/${className}`, {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
      });
      if (response.ok) {
        const data = await response.json();
        console.log(
          `恭喜你!你获得了第二部分的 flag: ${data.flag}\n……\n时光荏苒,你成长了很多,也发生了一些事情。去看看吧:/${data.nextLevel}`
        );
      } else {
        console.error("请求失败,请检查输入或服务器响应。");
      }
    } catch (error) {
      console.error("请求过程中出现错误:", error);
    }
  }

  // 控制台提示
  console.log("你似乎对这门叫做4cqu1siti0n的课很好奇?那就来看看控制台吧!");
</script>

根据控制台的提示,只需要执行 revealFlag('4cqu1siti0n')className 的值为 4cqu1siti0n)即可获得第二关的 flag。

第二关

第三关

根据源代码:

html
<script>
  document.addEventListener("DOMContentLoaded", function () {
    const form = document.getElementById("seal_him");
    const stateElement = document.getElementById("state");
    const messageElement = document.getElementById("message");

    form.addEventListener("submit", async function (event) {
      event.preventDefault();

      if (stateElement.textContent.trim() !== "解封") {
        messageElement.textContent = "如何是好?";
        return;
      }

      try {
        const response = await fetch("/api/flag/s34l", {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },
          body: JSON.stringify({ csrf_token: document.getElementById("csrf_token").value }),
        });

        if (response.ok) {
          const data = await response.json();
          messageElement.textContent = `第三部分Flag: ${data.flag}, 你解救了五条悟!下一关: /${data.nextLevel || "无"}`;
        } else {
          messageElement.textContent = "请求失败,请重试。";
        }
      } catch (error) {
        messageElement.textContent = "请求过程中出现错误,请重试。";
      }
    });
  });
</script>

修改前端,按下按钮得到一部分 flag.

第三关 1

第三关 2

第四关

源码中有 <noscript> 标签,可以使用浏览器插件或者浏览器设置禁用 JavaScript.

第三关 1

第三关 2

第三关 3

当然也可以直接根据前端逻辑去发送请求。


将 Flag 各个部分拼起来,随后 Base64 解密即可。