Diberikan sebuah Python source code, kita diminta untuk bypass validasi yang berlaku. Mari kita lihat codingannya.
1 2 3 4 5 6 7 8 9 10 11 12 |
from hashlib import md5 hp = input("Enter plaintext: ") p = bytes.fromhex(hp) h = md5(p).hexdigest() if h[6:-6] == "25255fb1a26e4bc422ae" and hp != "d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70": print("Correct! Submit ictf{your_input_here}") else: print("Wrong!") |
Jadi cara kerja code ini sebagai berikut :
- Menerima input hexadecimal dari user
- Mengubah input menjadi bytes (‘\x’)
- Hash input dengan algoritma MD5
- Validasi hasil MD5 pada array posisi ke 6 sampai 6 karakter sebelum array terakhir dan input user tidak boleh sama dengan validasi yang diberikan (d131dd…..).
Untuk bypass validasi ini cukup simple, dengan menambahkan spasi pada akhir input. Karena spasi pada hexadecimal yang dihashing dengan MD5 itu dianggap kosong jadi hasil MD5 itu pasti sama dengan string tanpa spasi di akhir. Berikut visualisasinya supaya lebih mudah dimengerti.
1 2 3 4 5 6 7 8 |
Plaintext String Normal MD5 "abc" (tanpa spasi) 900150983cd24fb0d6963f7d28e17f72 "abc " (dengan spasi) 28a53e303da9f5742476fd6b62434540 Hexadecimal MD5 "\x61\x62\x63" (tanpa spasi) 900150983cd24fb0d6963f7d28e17f72 "\x61\x62\x63 " (dengan spasi) 900150983cd24fb0d6963f7d28e17f72 |
1 2 3 |
Z:\!CTF-NEW\ICTF\Juli 2021> C:/Users/Bryan/AppData/Local/Programs/Python/Python36/python.exe z:/!CTF-NEW/ICTF/challenge.py Enter plaintext: d131dd02c5e6eec4693d9a0698aff95c2fcab58712467eab4004583eb8fb7f8955ad340609f4b30283e488832571415a085125e8f7cdc99fd91dbdf280373c5bd8823e3156348f5bae6dacd436c919c6dd53e2b487da03fd02396306d248cda0e99f33420f577ee8ce54b67080a80d1ec69821bcb6a8839396f9652b6ff72a70 Correct! Submit ictf{your_input_here} |
Sekian untuk writeup yang singkat ini 😀