OWASP Top Ten

OWASP Top 10 adalah dokumen standar yang meningkatkan kesadaran developer mengenai risiko keamanan paling kritis pada aplikasi web.


A01:2021 - Broken Access Control

Kontrol akses yang rusak terjadi ketika penyerang dapat mengakses fungsionalitas atau data yang seharusnya tidak dapat mereka akses. Ini adalah kerentanan paling umum dan kritis.

Contoh Skenario: Seorang pengguna biasa bisa mengakses halaman admin hanya dengan menebak URL, atau melihat data pengguna lain dengan mengubah ID di parameter URL.

Contoh Kode (Go)

Misalkan kita memiliki sebuah handler untuk melihat profil pengguna berdasarkan ID.

Kode Rentan:

package main

import (
	"fmt"
	"net/http"
)

// User struct
type User struct {
	ID   string
	Name string
	Role string
}

// Simple in-memory user database
var users = map[string]User{
	"1": {ID: "1", Name: "Alice", Role: "user"},
	"2": {ID: "2", Name: "Bob", Role: "user"},
	"3": {ID: "3", Name: "Admin", Role: "admin"},
}

// Handler ini rentan karena tidak memeriksa siapa yang membuat permintaan.
func GetUserProfile(w http.ResponseWriter, r *http.Request) {
	// Ambil ID pengguna dari URL, misalnya /user?id=1
	userID := r.URL.Query().Get("id")

	// Langsung ambil data dari database berdasarkan ID dari input
	user, ok := users[userID]
	if !ok {
		http.Error(w, "User not found", http.StatusNotFound)
		return
	}

	// Tampilkan data pengguna
	fmt.Fprintf(w, "User ID: %s, Name: %s", user.ID, user.Name)
}

func main() {
	http.HandleFunc("/user", GetUserProfile)
	http.ListenAndServe(":8080", nil)
}

Kelemahan: Pengguna mana pun (termasuk yang tidak login) dapat melihat profil pengguna lain hanya dengan mengubah nilai id di URL (misalnya, http://localhost:8080/user?id=2).

Kode Aman:

Pada versi aman, kita akan memeriksa sesi pengguna yang sedang login dan memastikan mereka hanya bisa melihat profilnya sendiri, kecuali jika mereka adalah admin.


A02:2021 - Cryptographic Failures

Kerentanan ini berkaitan dengan kegagalan dalam melindungi data sensitif. Ini mencakup penggunaan algoritma kriptografi yang lemah, manajemen secret (kunci, password) yang buruk, atau tidak mengenkripsi data sensitif sama sekali.

Contoh Skenario: Menyimpan password pengguna dalam bentuk plain text di database atau menggunakan algoritma hashing yang sudah usang seperti MD5.

Contoh Kode (Go)

Kode Rentan:

Kelemahan: Jika database bocor, semua password pengguna akan terekspos.

Kode Aman:

Gunakan algoritma hashing yang kuat dan modern seperti bcrypt atau Argon2 untuk menyimpan password.


A03:2021 - Injection

Injection terjadi ketika data yang tidak dipercaya dikirim ke interpreter sebagai bagian dari perintah atau query. Yang paling umum adalah SQL Injection, tetapi bisa juga terjadi pada OS Command, LDAP, atau NoSQL.

Contoh Skenario: Penyerang menyisipkan query SQL berbahaya melalui form input untuk mencuri atau memanipulasi data di database.

Contoh Kode (Go)

Kode Rentan:

Kelemahan: Jika seorang penyerang memasukkan '; DROP TABLE users; -- pada parameter category, query-nya akan menjadi SELECT name FROM products WHERE category = ''; DROP TABLE users; --'.

Kode Aman:

Selalu gunakan parameterized queries (juga dikenal sebagai prepared statements). Dengan cara ini, input dari pengguna diperlakukan sebagai data, bukan sebagai bagian dari perintah SQL.


A04:2021 - Insecure Design

Ini adalah kategori baru yang berfokus pada kelemahan pada level desain atau arsitektur aplikasi. Ini bukan kesalahan implementasi, melainkan kelemahan fundamental dalam cara sistem dirancang.

Contoh Skenario: Sebuah situs e-commerce tidak membatasi berapa kali pengguna bisa mencoba memasukkan kode diskon. Akibatnya, penyerang bisa melakukan brute-force untuk menemukan kode diskon yang valid.

Contoh Kode (Go)

Desain Rentan:

Kelemahan: Tidak ada yang menghentikan penyerang untuk mengirim ribuan permintaan dengan kode kupon yang berbeda-beda.

Desain Aman:

Terapkan rate limiting pada fungsionalitas yang sensitif.


A05:2021 - Security Misconfiguration

Kesalahan konfigurasi keamanan adalah salah satu isu yang paling sering ditemui. Ini bisa berupa apa saja, mulai dari membiarkan cloud storage bucket terbuka untuk publik, menggunakan konfigurasi default yang tidak aman, hingga menampilkan pesan error yang terlalu detail.

Contoh Skenario: Sebuah aplikasi Go berjalan dalam mode debug di lingkungan produksi, yang mungkin membocorkan informasi sensitif melalui pesan error.

Contoh Kode (Go)

Konfigurasi Rentan:

Kelemahan: Jika terjadi panic, Gin akan merespons dengan stack trace lengkap, yang bisa memberikan informasi internal aplikasi kepada penyerang.

Konfigurasi Aman:

Selalu atur mode aplikasi ke ReleaseMode di lingkungan produksi.


A06:2021 - Vulnerable and Outdated Components

Kerentanan ini terjadi saat Anda menggunakan library, framework, atau komponen perangkat lunak lain yang memiliki kerentanan keamanan yang sudah diketahui publik.

Contoh Skenario: Menggunakan versi lama dari sebuah library Go yang ternyata memiliki kerentanan Remote Code Execution (RCE).

Contoh Kode (Go)

Ini lebih tentang manajemen dependensi daripada kode spesifik.

Praktik Rentan:

  • Tidak pernah memperbarui file go.mod dan go.sum.

  • Tidak menggunakan tool untuk memindai kerentanan pada dependensi.

Praktik Aman:

  1. Gunakan Go Modules: Go modules membantu mengelola versi dependensi.

  2. Audit Dependensi Secara Berkala: Gunakan tool seperti govulncheck (tool resmi dari Go) untuk memindai proyek Anda.

Cara Menjalankan govulncheck:

Tool ini akan menganalisis kode Anda dan melaporkan jika Anda menggunakan fungsi dari paket yang memiliki kerentanan yang diketahui.


A07:2021 - Identification and Authentication Failures

Ini terjadi ketika fungsi yang terkait dengan identifikasi dan autentikasi pengguna tidak diimplementasikan dengan benar, memungkinkan penyerang untuk menyamar sebagai pengguna lain.

Contoh Skenario: Sebuah aplikasi tidak menginvalidasi ID sesi setelah pengguna logout. Penyerang yang mendapatkan ID sesi tersebut bisa menggunakannya kembali untuk mengakses akun pengguna.

Contoh Kode (Go)

Implementasi Rentan:

Kelemahan: Sesi tidak benar-benar dihancurkan di server. Jika ID sesi bocor sebelum cookie di-overwrite, sesi itu masih bisa digunakan.

Implementasi Aman:

Invalidasi sesi sepenuhnya saat logout.

Tips Tambahan:

  • Terapkan multi-factor authentication (MFA).

  • Gunakan rate limiting pada halaman login untuk mencegah brute-force.

  • Jangan pernah mengekspos ID sesi di URL.


A08:2021 - Software and Data Integrity Failures

Kerentanan ini berfokus pada kegagalan dalam memverifikasi integritas perangkat lunak dan data. Contoh klasiknya adalah insecure deserialization.

Contoh Skenario: Sebuah aplikasi melakukan deserialization data dari sumber yang tidak terpercaya (misalnya, cookie atau input API) tanpa validasi. Penyerang bisa memanipulasi data yang diserialisasi untuk mengeksekusi kode di server.

Contoh Kode (Go)

Kode Rentan (Insecure Deserialization):

Meskipun Go tidak rentan terhadap deserialization seperti bahasa lain (Java, PHP), konsepnya tetap berlaku. Misalkan kita menggunakan gob untuk men-decode data dari cookie.

Kelemahan: Penyerang bisa membuat cookie prefs mereka sendiri, men-set IsAdmin menjadi true, lalu mengirimkannya ke server untuk mendapatkan hak akses admin.

Kode Aman:

Jangan pernah percaya data dari klien untuk keputusan keamanan. Jika perlu mengirim state, tanda tangani data tersebut menggunakan HMAC (Hash-based Message Authentication Code).


A09:2021 - Security Logging and Monitoring Failures

Kerentanan ini bukan tentang kode aplikasi secara langsung, tetapi tentang kurangnya kemampuan untuk mendeteksi dan merespons serangan.

Contoh Skenario: Seseorang mencoba melakukan brute-force pada halaman login, tetapi tidak ada log yang mencatat percobaan login yang gagal, sehingga tidak ada peringatan (alert) yang terpicu dan admin tidak menyadari adanya serangan.

Contoh Kode (Go)

Praktik Logging yang Buruk:

Praktik Logging yang Baik:

Gunakan structured logging dan catat semua peristiwa keamanan yang relevan, baik yang berhasil maupun yang gagal.


A10:2021 - Server-Side Request Forgery (SSRF)

SSRF terjadi ketika penyerang bisa memaksa server untuk membuat permintaan ke lokasi yang tidak diinginkan. Ini bisa digunakan untuk memindai jaringan internal, mengakses layanan internal, atau berinteraksi dengan layanan metadata cloud.

Contoh Skenario: Sebuah fitur "import gambar dari URL" memungkinkan penyerang memasukkan URL seperti http://169.254.169.254/latest/meta-data/ (alamat metadata AWS) dan server akan mengambil data sensitif dari sana.

Contoh Kode (Go)

Kode Rentan:

Kelemahan: Penyerang bisa memasukkan URL internal seperti http://localhost:8081/admin-stats atau file:///etc/passwd.

Kode Aman:

Terapkan allow-list untuk domain, validasi IP, dan batasi protokol yang diizinkan.

Last updated