# XSS (跨站脚本攻击)
如果你对**黑客职业**感兴趣并想要攻克不可攻克的目标 - **我们正在招聘!**(_需要流利的波兰语书写和口语能力_)。
{% embed url="https://www.stmcyber.com/careers" %}
## 方法论
1. 检查**你控制的任何值**(_参数_,_路径_,_头部_?,_cookies_?)是否在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 Hoisting
Javascript Hoisting 指的是**在使用后声明函数、变量或类的机会,因此您可以利用未声明的变量或函数的 XSS 场景。**\
**有关更多信息,请查看以下页面:**
{% content-ref url="js-hoisting.md" %}
[js-hoisting.md](js-hoisting.md)
{% endcontent-ref %}
### Javascript Function
一些网页有端点**接受作为参数的要执行的函数名称**。在实际中常见的例子是类似于:`?callback=callbackFunc`。
找出用户直接提供的内容是否尝试被执行的一个好方法是**修改参数值**(例如改为 'Vulnerable'),并在控制台中查找错误,例如:
![](<../../.gitbook/assets/image (711).png>)
如果它是脆弱的,您可以通过发送值**`?callback=alert(1)`**来**触发一个警报**。然而,这些端点通常会**验证内容**,只允许字母、数字、点和下划线(**`[\w\._]`**)。
然而,即使有这个限制,仍然可以执行一些操作。这是因为您可以使用这些有效字符来**访问 DOM 中的任何元素**:
![](<../../.gitbook/assets/image (747).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