OWASP Top 10: Kerentanan Web Paling Umum dan Cara Mencegahnya

Kalau Anda bertanya ke security engineer mana pun tentang dokumen paling wajib dibaca sebelum menulis kode aplikasi web, jawabannya hampir pasti sama: OWASP Top 10. Ini bukan daftar arbitrer — ia disusun dari analisis data ribuan aplikasi nyata, ratusan organisasi, dan jutaan kerentanan yang ditemukan di lapangan oleh Open Web Application Security Project (OWASP), organisasi nirlaba yang sudah jadi rujukan standar industri keamanan aplikasi selama lebih dari dua dekade.
Artikel ini membahas tuntas OWASP Top 10 versi 2021 (revisi terbaru yang berlaku saat ini), lengkap dengan contoh kode rentan, cara kerja tiap kerentanan, dan yang terpenting — strategi mitigasi konkret yang bisa langsung diterapkan tim development. Ini bukan sekadar daftar untuk dihafal, tapi kerangka berpikir untuk membangun aplikasi yang aman sejak desain awal.
Apa Itu OWASP dan Mengapa Top 10 Ini Penting
OWASP Top 10 diperbarui secara berkala (versi terakhir 2021, sebelumnya 2017) berdasarkan data kontribusi dari perusahaan security testing dan bug bounty di seluruh dunia. Daftar ini bukan cuma kategori teknis, tapi representasi risiko yang paling sering ditemukan dan paling berdampak dalam praktik nyata. Memahami OWASP Top 10 penting bukan hanya untuk security engineer, tapi untuk setiap developer — karena kebanyakan kerentanan ini lahir dari kesalahan pemrograman sehari-hari yang sebenarnya bisa dicegah dengan kebiasaan koding yang benar.
A01:2021 – Broken Access Control
Kategori ini naik ke posisi pertama di revisi 2021, menggantikan Injection yang sebelumnya memimpin. Broken Access Control terjadi ketika sistem gagal membatasi apa yang boleh diakses atau dilakukan user sesuai perannya — misalnya user biasa bisa mengakses fungsi admin, atau seorang user bisa melihat data user lain hanya dengan mengubah ID di URL.
Contoh klasik disebut Insecure Direct Object Reference (IDOR):
// Rentan: tidak ada verifikasi apakah invoice ini milik user yang login
app.get("/api/invoices/:id", authenticate, (req, res) => {
const invoice = db.query("SELECT * FROM invoices WHERE id = ?", [req.params.id]);
res.json(invoice);
});
// Aman: verifikasi kepemilikan sebelum mengembalikan data
app.get("/api/invoices/:id", authenticate, (req, res) => {
const invoice = db.query(
"SELECT * FROM invoices WHERE id = ? AND user_id = ?",
[req.params.id, req.user.id]
);
if (!invoice) return res.status(404).json({ error: "Not found" });
res.json(invoice);
});
Mitigasi: terapkan prinsip deny by default, verifikasi otorisasi di setiap request di sisi server (jangan pernah percaya kontrol akses yang hanya diterapkan di sisi client/UI), gunakan model kontrol akses yang konsisten (RBAC atau ABAC), dan lakukan pengujian otorisasi secara sistematis untuk setiap endpoint yang mengakses data spesifik user.
A02:2021 – Cryptographic Failures
Sebelumnya disebut "Sensitive Data Exposure", kategori ini kini fokus pada akar masalahnya: kegagalan kriptografi. Ini mencakup penyimpanan data sensitif tanpa enkripsi, penggunaan algoritma enkripsi yang lemah atau usang (MD5, SHA1 untuk password, DES), hardcoded encryption key, serta transmisi data sensitif tanpa TLS.
Mitigasi: klasifikasikan data mana yang sensitif dan enkripsi saat disimpan (encryption at rest) maupun saat transit (TLS 1.2 ke atas), gunakan algoritma modern yang direkomendasikan (AES-256 untuk symmetric, bcrypt/argon2 untuk password hashing), jangan pernah membuat algoritma kriptografi sendiri, dan kelola key secara terpisah dari kode lewat key management service (AWS KMS, HashiCorp Vault), bukan hardcode di source code atau environment variable yang mudah terekspos.
A03:2021 – Injection
Injection terjadi ketika input yang tidak dipercaya dikirim sebagai bagian dari perintah atau query tanpa validasi/sanitasi yang tepat, membuat interpreter (database, OS shell, LDAP) mengeksekusi perintah yang tidak diinginkan. SQL Injection adalah contoh paling terkenal:
// Rentan: string concatenation langsung ke query SQL
const query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`;
db.execute(query);
// Input username: admin' -- akan membuat kondisi password diabaikan
// Aman: parameterized query / prepared statement
const query = "SELECT * FROM users WHERE username = ? AND password_hash = ?";
db.execute(query, [username, hashPassword(password)]);
Mitigasi: selalu gunakan parameterized query atau prepared statement, jangan pernah membangun query lewat string concatenation dari input user, gunakan ORM yang aman secara default, terapkan input validation dengan allowlist (bukan blocklist), dan escape output sesuai konteksnya (SQL, HTML, shell command, LDAP masing-masing punya aturan escaping berbeda).
A04:2021 – Insecure Design
Kategori baru di revisi 2021 ini menyoroti kerentanan yang berakar dari kelemahan desain arsitektur, bukan sekadar bug implementasi. Contohnya: sistem reset password yang tidak membatasi jumlah percobaan, alur checkout yang tidak memvalidasi ulang harga di server (hanya mengandalkan harga yang dikirim client), atau arsitektur yang tidak mempertimbangkan skenario penyalahgunaan sejak awal.
Mitigasi: terapkan threat modeling di fase desain, sebelum satu baris kode ditulis — pertanyakan "bagaimana fitur ini bisa disalahgunakan?" untuk setiap fitur baru. Gunakan secure design pattern yang sudah terbukti, terapkan rate limiting dan business logic validation di sisi server, dan libatkan security review sebagai bagian dari proses design review, bukan hanya code review setelah implementasi selesai.
A05:2021 – Security Misconfiguration
Kategori ini sangat umum karena mencakup banyak skenario: permission default yang tidak diubah, error message yang terlalu detail (menampilkan stack trace ke user), fitur atau service yang tidak perlu tapi tetap aktif, header keamanan yang tidak diset, cloud storage bucket yang salah konfigurasi permission-nya sehingga terbuka ke publik, dan software yang tidak di-patch.
Mitigasi: terapkan proses hardening yang konsisten dan otomatis (infrastructure as code membantu memastikan konfigurasi konsisten di semua environment), nonaktifkan fitur/service yang tidak dipakai, jangan tampilkan detail error teknis ke end user di production, terapkan security header (Content-Security-Policy, Strict-Transport-Security, X-Content-Type-Options), dan audit konfigurasi cloud storage secara rutin.
A06:2021 – Vulnerable and Outdated Components
Aplikasi modern dibangun di atas puluhan hingga ratusan dependency pihak ketiga. Jika salah satu dependency punya kerentanan yang diketahui publik (CVE) dan tidak segera diperbarui, aplikasi ikut rentan meski kode sendiri tidak bermasalah. Insiden besar seperti Equifax breach (2017) yang membocorkan data 147 juta orang berakar dari kegagalan memperbarui satu library Apache Struts yang sudah punya patch tersedia berbulan-bulan sebelumnya.
Mitigasi: inventarisasi seluruh dependency dan versinya (Software Bill of Materials/SBOM), gunakan automated dependency scanning (Dependabot, Snyk, npm audit) yang terintegrasi ke pipeline CI/CD, tetapkan proses rutin untuk mengevaluasi dan menerapkan patch keamanan, dan hapus dependency yang tidak lagi dipakai untuk mengurangi permukaan serangan.
A07:2021 – Identification and Authentication Failures
Mencakup kelemahan pada proses login, manajemen sesi, dan verifikasi identitas — misalnya tidak ada rate limiting pada percobaan login (membuka celah brute force), session ID yang predictable atau tidak di-invalidate setelah logout, kebijakan password yang lemah, dan tidak tersedianya multi-factor authentication (MFA).
Mitigasi: implementasikan MFA untuk akses sensitif, terapkan rate limiting dan account lockout progresif pada percobaan login gagal, gunakan session management yang aman (session ID random dengan entropi tinggi, invalidate saat logout, set expiry yang wajar), dan terapkan kebijakan password modern mengacu NIST 800-63B (panjang lebih diutamakan dibanding kompleksitas karakter yang memaksa, cek terhadap daftar password yang bocor).
A08:2021 – Software and Data Integrity Failures
Kategori baru yang menyoroti risiko dari infrastruktur CI/CD dan proses update yang tidak memverifikasi integritas kode/data — misalnya auto-update aplikasi yang tidak memverifikasi signature, dependency yang diambil dari repository tidak tepercaya, atau proses deserialization data yang tidak divalidasi (insecure deserialization) sehingga bisa dimanipulasi untuk eksekusi kode arbitrer.
Mitigasi: verifikasi digital signature untuk update software dan dependency, gunakan repository resmi dan terverifikasi, terapkan integrity check (checksum, signature) pada pipeline CI/CD, dan hindari deserialization data dari sumber tidak tepercaya tanpa validasi ketat terhadap struktur dan tipe data yang diharapkan.
A09:2021 – Security Logging and Monitoring Failures
Banyak organisasi baru menyadari sudah kena breach berbulan-bulan setelah kejadian — rata-rata waktu deteksi breach di industri masih terhitung dalam hitungan bulan, bukan hari, karena logging dan monitoring yang tidak memadai. Tanpa log yang cukup detail dan sistem alerting yang aktif dipantau, tim security tidak akan tahu ada serangan sedang berlangsung sampai dampaknya sudah terlanjur besar.
Mitigasi: catat log untuk semua event keamanan penting (login gagal, perubahan hak akses, akses data sensitif), pastikan log tidak bisa dimanipulasi/dihapus penyerang (kirim ke sistem terpusat yang terpisah), integrasikan dengan SIEM untuk deteksi anomali secara real-time, dan buat playbook respons yang jelas ketika alert muncul — log yang tidak pernah dilihat siapa pun sama saja tidak ada gunanya.
A10:2021 – Server-Side Request Forgery (SSRF)
SSRF terjadi ketika aplikasi mengambil resource dari URL yang bisa dikontrol/dimanipulasi user tanpa validasi memadai, memungkinkan penyerang memaksa server melakukan request ke tujuan yang tidak seharusnya — termasuk ke internal network yang seharusnya tidak bisa diakses dari luar, atau ke metadata service cloud yang bisa membocorkan kredensial.
// Rentan: URL diambil langsung dari input user tanpa validasi
app.post("/fetch-preview", (req, res) => {
const response = fetch(req.body.url); // bisa diarahkan ke internal service
res.json(response);
});
// Lebih aman: validasi terhadap allowlist domain dan blokir target internal
app.post("/fetch-preview", (req, res) => {
const url = new URL(req.body.url);
if (!ALLOWED_DOMAINS.includes(url.hostname) || isPrivateIP(url.hostname)) {
return res.status(400).json({ error: "URL not allowed" });
}
// lanjutkan fetch dengan timeout dan pembatasan redirect
});
Mitigasi: validasi dan sanitasi URL input dengan allowlist domain yang ketat, blokir akses ke IP range internal/private dan metadata endpoint cloud (misalnya 169.254.169.254), nonaktifkan HTTP redirect otomatis pada request ke URL eksternal, dan terapkan network segmentation agar server aplikasi tidak punya akses langsung ke resource internal sensitif.
Apa yang Berubah dari OWASP Top 10 2017 ke 2021
Membandingkan revisi lama dan baru memberi gambaran bagaimana lanskap ancaman aplikasi web bergeser seiring waktu:
| Perubahan | Detail |
|---|---|
| Broken Access Control naik ke #1 | Sebelumnya #5, kini kategori paling sering ditemukan berdasarkan data kontribusi terbaru |
| Injection turun ke #3 | Sebelumnya #1, penurunan terjadi karena adopsi ORM dan prepared statement yang lebih luas, meski tetap kritikal |
| Insecure Design (baru) | Kategori baru yang menyoroti kelemahan arsitektural, bukan hanya bug implementasi |
| Software and Data Integrity Failures (baru) | Merefleksikan meningkatnya risiko rantai pasok software (supply chain) dan pipeline CI/CD |
| XML External Entities (XXE) digabung | Sekarang bagian dari Security Misconfiguration, bukan kategori terpisah |
| Cross-Site Scripting (XSS) digabung | Sekarang bagian dari Injection sebagai sub-kategori |
Pergeseran ini penting dipahami: kerentanan seperti XSS dan XXE tidak hilang atau jadi kurang berbahaya, hanya direklasifikasi ke kategori yang lebih luas. Tim security tetap perlu menguji dan memitigasi keduanya secara spesifik meski namanya tidak lagi muncul sebagai baris terpisah di daftar Top 10.
Kesalahan Umum Developer dalam Menyikapi OWASP Top 10
Dari pengalaman banyak tim engineering, ada beberapa pola kesalahan berulang dalam menerapkan OWASP Top 10 di proses development sehari-hari:
- Menganggap security scanner otomatis cukup. SAST/DAST tools sangat membantu menangkap kerentanan yang polanya sudah dikenal, tapi tidak bisa mendeteksi business logic flaw seperti IDOR yang kontekstual terhadap alur bisnis spesifik aplikasi. Review manual tetap diperlukan untuk kategori seperti A01 dan A04.
- Menerapkan mitigasi di sisi client saja. Validasi input di JavaScript sisi browser memang baik untuk UX, tapi bisa dilewati sepenuhnya dengan mengirim request langsung ke API. Setiap kontrol keamanan wajib divalidasi ulang di server.
- Memperbaiki gejala, bukan akar masalah. Menambal satu instance SQL Injection yang ditemukan pentest tanpa mengaudit pola kode serupa di seluruh codebase — kerentanan yang sama biasanya berulang di banyak tempat jika akar penyebabnya (kebiasaan koding) tidak diperbaiki secara sistematis.
- Mengabaikan dependency yang "sudah lama jalan tanpa masalah". Library yang sudah tidak di-maintain bertahun-tahun sering dianggap aman karena "tidak pernah ada masalah", padahal justru berisiko tinggi karena kerentanan baru yang ditemukan di kemudian hari tidak akan pernah dipatch oleh maintainer-nya.
Melampaui Top 10: OWASP ASVS untuk Kebutuhan Lebih Tinggi
Untuk aplikasi dengan kebutuhan keamanan tinggi, OWASP juga menerbitkan Application Security Verification Standard (ASVS) yang jauh lebih rinci dibanding Top 10. ASVS membagi kebutuhan verifikasi keamanan ke dalam tiga level:
- Level 1 — baseline yang berlaku untuk semua aplikasi, mencakup kontrol dasar yang bisa diverifikasi secara otomatis.
- Level 2 — untuk aplikasi yang menangani data sensitif signifikan (data pribadi, transaksi finansial), mencakup kontrol yang butuh verifikasi manual lebih mendalam.
- Level 3 — untuk aplikasi kritikal tinggi (infrastruktur kritis, kesehatan, militer) dengan kebutuhan assurance paling ketat.
Sementara OWASP Top 10 menjawab "apa saja risiko paling umum", ASVS menjawab pertanyaan lebih operasional: "kontrol keamanan spesifik apa yang perlu diverifikasi ada dan berfungsi dengan benar di aplikasi saya". Kombinasi keduanya — Top 10 sebagai kesadaran risiko, ASVS sebagai checklist verifikasi — memberi fondasi program keamanan aplikasi yang jauh lebih matang dibanding hanya mengandalkan salah satu.
Membangun Program Keamanan Berkelanjutan, Bukan Checklist Sekali Jalan
OWASP Top 10 paling bermanfaat ketika diintegrasikan ke Secure Development Lifecycle (SDLC), bukan sekadar checklist yang dicek sekali saat audit tahunan:
- Design phase — threat modeling untuk fitur baru, mempertimbangkan A04 (Insecure Design) sejak awal.
- Development phase — secure coding guideline, code review dengan security checklist, SAST terintegrasi di IDE atau pre-commit hook.
- CI/CD phase — dependency scanning otomatis (A06), SAST/DAST di pipeline sebelum deploy.
- Production phase — logging dan monitoring aktif (A09), patch management rutin, pentest berkala untuk validasi independen.
Penting dicatat, OWASP Top 10 adalah baseline minimum, bukan standar keamanan lengkap. Aplikasi dengan kebutuhan keamanan tinggi (fintech, healthcare, sistem pemerintahan) perlu melangkah lebih jauh dengan kerangka kerja tambahan seperti OWASP Application Security Verification Standard (ASVS) yang jauh lebih detail dan bertingkat sesuai level risiko aplikasi.
Kesimpulan
OWASP Top 10 bukan daftar untuk ditakuti, tapi peta jalan praktis untuk memahami di mana risiko keamanan paling sering muncul dalam pengembangan aplikasi web. Yang menyatukan hampir semua kategori di atas adalah prinsip yang sama: jangan pernah mempercayai input dari luar tanpa validasi, terapkan defense in depth (jangan bergantung pada satu lapis pertahanan saja), dan pastikan kontrol keamanan diterapkan di sisi server, bukan hanya di sisi client yang mudah dimanipulasi. Developer yang memahami OWASP Top 10 bukan hanya lebih baik dalam mencegah kerentanan, tapi juga menjadi lebih efektif berkolaborasi dengan tim security — berbicara dalam bahasa dan kerangka yang sama saat mendiskusikan risiko. Jadikan daftar ini sebagai bagian dari kebiasaan development sehari-hari, bukan dokumen yang hanya dibuka saat audit.

Ditulis oleh
@nopal
Ruang Iklan Tersedia
Hubungi Admin untuk menempatkan banner iklan atau Adsense Anda di sini.
Bagaimana pendapat Anda tentang artikel ini?
Komentar Pembaca (0)
Belum ada komentar. Jadilah yang pertama!