# XSS(跨站脚本)
如果您对**黑客职业**感兴趣并想要黑掉无法黑掉的东西 - **我们正在招聘!**(需要流利的波兰语书面和口头表达能力)。
{% embed url="https://www.stmcyber.com/careers" %}
## 方法论
1. 检查您控制的**任何值**(_参数_,_路径_,_标头_?,_Cookie_?)是否在 HTML 中**反射**或被 **JS** 代码使用。
2. 找到它被反射/使用的**上下文**。
3. 如果**反射**
1. 检查您可以使用**哪些符号**,并根据此准备有效载荷:
1. 在**原始 HTML**中:
1. 您能创建新的 HTML 标签吗?
2. 您能使用支持 `javascript:` 协议的事件或属性吗?
3. 您能绕过保护措施吗?
4. HTML 内容是否由任何客户端 JS 引擎(_AngularJS_,_VueJS_,_Mavo_...)解释,您可以滥用[**客户端模板注入**](../client-side-template-injection-csti.md)。
5. 如果您无法创建执行 JS 代码的 HTML 标签,您能滥用[**悬挂标记 - HTML 无脚本注入**](../dangling-markup-html-scriptless-injection/)吗?
2. 在**HTML 标签**内:
1. 您能退出到原始 HTML 上下文吗?
2. 您能创建新的事件/属性来执行 JS 代码吗?
3. 您被困在的属性是否支持 JS 执行吗?
4. 您能绕过保护措施吗?
3. 在**JavaScript 代码**内:
1. 您能转义 ``** 标签之间,在一个 `.js` 文件内,或者在使用 **`javascript:`** 协议的属性内部:
- 如果被反射在 **``** 标签之间,即使您的输入被放在任何引号内,您可以尝试注入 `` 并从这个上下文中逃脱。这是因为**浏览器首先解析 HTML 标签**,然后解析内容,因此,它不会注意到您注入的 `` 标签在 HTML 代码内部。
- 如果被反射在 **JS 字符串内部**,并且上一个技巧不起作用,您需要**退出**字符串,**执行**您的代码并**重构**JS代码(如果有任何错误,它不会被执行):
- `'-alert(1)-'`
- `';-alert(1)//`
- `\';alert(1)//`
- 如果被反射在模板文字内部,您可以使用 `${ ... }` 语法**嵌入 JS 表达式**:`` var greetings = `Hello, ${alert(1)}` ``
- **Unicode 编码**可用于编写**有效的 JavaScript 代码**:
```javascript
\u{61}lert(1)
\u0061lert(1)
\u{0061}lert(1)
```
#### Javascript 提升
Javascript 提升指的是**在使用后声明函数、变量或类的机会,因此您可以利用 XSS 正在使用未声明的变量或函数的情况。**\
**查看以下页面获取更多信息:**
{% content-ref url="js-hoisting.md" %}
[js-hoisting.md](js-hoisting.md)
{% endcontent-ref %}
### Javascript 函数
一些网页端点**接受函数名称作为参数来执行**。在实际中常见的示例是类似这样的:`?callback=callbackFunc`。
要找出用户直接提供的内容是否尝试执行,一个好方法是**修改参数值**(例如为'Vulnerable'),并在控制台中查看是否有错误,如:
![](<../../.gitbook/assets/image (708).png>)
如果存在漏洞,您可以通过发送值**`?callback=alert(1)`**来**触发警报**。然而,这些端点通常会**验证内容**,只允许字母、数字、点和下划线(**`[\w\._]`**)。
然而,即使有这种限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符来**访问 DOM 中的任何元素**:
![](<../../.gitbook/assets/image (744).png>)
一些有用的函数包括:
```
firstElementChild
lastElementChild
nextElementSibiling
lastElementSibiling
parentElement
```
您还可以尝试直接**触发Javascript函数**:`obj.sales.delOrders`。
然而,通常执行指定函数的端点是**没有太多有趣DOM**的端点,**同一源中的其他页面**将具有**更有趣的DOM**以执行更多操作。
因此,为了在不同DOM中**滥用此漏洞**,开发了**同源方法执行(SOME)**利用:
{% content-ref url="some-same-origin-method-execution.md" %}
[some-same-origin-method-execution.md](some-same-origin-method-execution.md)
{% endcontent-ref %}
### DOM
有一些**JS代码**正在**不安全地**使用一些**由攻击者控制的数据**,如`location.href`。攻击者可以利用这一点执行任意JS代码。
{% content-ref url="dom-xss.md" %}
[dom-xss.md](dom-xss.md)
{% endcontent-ref %}
### **通用XSS**
这种类型的XSS可以在**任何地方**找到。它们不仅仅依赖于对Web应用程序的客户端利用,而是依赖于**任何** **上下文**。这种**任意JavaScript执行**甚至可以被滥用以获得**RCE**,在客户端和服务器上**读取** **任意** **文件**等。\
一些**示例**:
{% content-ref url="server-side-xss-dynamic-pdf.md" %}
[server-side-xss-dynamic-pdf.md](server-side-xss-dynamic-pdf.md)
{% endcontent-ref %}
{% content-ref url="../../network-services-pentesting/pentesting-web/electron-desktop-apps/" %}
[electron-desktop-apps](../../network-services-pentesting/pentesting-web/electron-desktop-apps/)
{% endcontent-ref %}
## WAF绕过编码图像
![来源 https://twitter.com/hackerscrolls/status/1273254212546281473?s=21](<../../.gitbook/assets/EauBb2EX0AERaNK (1).jpg>)
## 在原始HTML中注入
当您的输入被反映在**HTML页面**中或者您可以转义并在此上下文中注入HTML代码时,**第一**件事是检查您是否可以滥用`<`来创建新标签:尝试**反映**该**字符**并检查它是否被**HTML编码**或**删除**,或者是否**未经更改地反映**。**只有在最后一种情况下,您才能利用这种情况**。\
对于这些情况,还要**记住**[**客户端模板注入**](../client-side-template-injection-csti.md)**。**\
_**注意:HTML注释可以使用**** ****`-->`**** ****或**** ****`--!>`**_
在这种情况下,如果没有使用黑名单/白名单,您可以使用如下有效负载:
```html