Skenario 26 / 26PASS

Path Traversal - Profile Picture - Upload Filename

Lingkungan lab — bukan sistem produksi

Tangkapan layar dan trafik mentah tidak diterjemahkan; teks di dalamnya mungkin menggunakan bahasa lain.

vuln-bank/Evidence/[PASS] Path Traversal - Profile Picture - Upload Filename

01 — Catatan

Catatan pengujian

Kerentanan

[PASS] Path Traversal - Profile Picture - Upload Filename

Deskripsi

Pengujian berupaya menulis berkas di luar direktori unggahan dengan menyisipkan urutan ../ pada nama berkas yang dikirim klien. Komentar pada kode sumber menyatakan path traversal dimungkinkan, sehingga endpoint ini diuji secara khusus.

Dampak

Tidak ada dampak. Kontrol bertahan: fungsi secure_filename dari Werkzeug meratakan nama berkas sehingga urutan ../ dihapus dan berkas tetap tersimpan di dalam direktori static/uploads. Penulisan berkas ke lokasi arbitrer tidak berhasil dicapai. Catatan: endpoint yang sama tetap bermasalah karena tidak memvalidasi tipe berkas; hal tersebut dilaporkan terpisah pada temuan Unrestricted File Upload.

CWE

CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)

OWASP

A01:2021 - Broken Access Control

Skenario

Berkas diunggah dengan nama ../../../../tmp/pwned.txt yang bertujuan keluar dari direktori unggahan. Hasil: nama berkas diratakan oleh secure_filename dan berkas tersimpan di dalam static/uploads, bukan di /tmp. Verifikasi dilakukan dengan mengambil kembali berkas tersebut pada lokasi penyimpanan yang sebenarnya.

Endpoint

POST http://127.0.0.1:5001/upload_profile_picture

Fitur terdampak

Unggah foto profil (penanganan nama berkas)

Rekomendasi perbaikan

- Pertahankan penggunaan secure_filename. - Abaikan sepenuhnya nama berkas dari klien dan hasilkan nama acak di sisi server. - Verifikasi bahwa path akhir berada di dalam direktori unggahan sebelum menulis berkas.

Bukti konsep

1) (Screenshot 1) PERCOBAAN: berkas diunggah dengan nama ../../../../tmp/pwned.txt -> nama diratakan, berkas tersimpan di dalam static/uploads. 2) (Screenshot 2) HASIL: berkas diambil kembali pada lokasi penyimpanan sebenarnya di dalam static/uploads, membuktikan traversal tidak terjadi dan kontrol bertahan.
Lihat catatan sumber (bahasa Indonesia)
Vulnerability:
[PASS] Path Traversal - Profile Picture - Upload Filename

Description:
Pengujian berupaya menulis berkas di luar direktori unggahan dengan menyisipkan urutan ../ pada nama berkas yang dikirim klien. Komentar pada kode sumber menyatakan path traversal dimungkinkan, sehingga endpoint ini diuji secara khusus.

Impact:
Tidak ada dampak. Kontrol bertahan: fungsi secure_filename dari Werkzeug meratakan nama berkas sehingga urutan ../ dihapus dan berkas tetap tersimpan di dalam direktori static/uploads. Penulisan berkas ke lokasi arbitrer tidak berhasil dicapai.

Catatan: endpoint yang sama tetap bermasalah karena tidak memvalidasi tipe berkas; hal tersebut dilaporkan terpisah pada temuan Unrestricted File Upload.

CWE:
CWE-22: Improper Limitation of a Pathname to a Restricted Directory (Path Traversal)

OWASP:
A01:2021 - Broken Access Control

Scenario:
Berkas diunggah dengan nama ../../../../tmp/pwned.txt yang bertujuan keluar dari direktori unggahan. Hasil: nama berkas diratakan oleh secure_filename dan berkas tersimpan di dalam static/uploads, bukan di /tmp. Verifikasi dilakukan dengan mengambil kembali berkas tersebut pada lokasi penyimpanan yang sebenarnya.

Endpoint:
POST http://127.0.0.1:5001/upload_profile_picture

Affected Feature:
Unggah foto profil (penanganan nama berkas)

Remediation:
- Pertahankan penggunaan secure_filename.
- Abaikan sepenuhnya nama berkas dari klien dan hasilkan nama acak di sisi server.
- Verifikasi bahwa path akhir berada di dalam direktori unggahan sebelum menulis berkas.

POC:
1) (Screenshot 1) PERCOBAAN: berkas diunggah dengan nama ../../../../tmp/pwned.txt -> nama diratakan, berkas tersimpan di dalam static/uploads.
2) (Screenshot 2) HASIL: berkas diambil kembali pada lokasi penyimpanan sebenarnya di dalam static/uploads, membuktikan traversal tidak terjadi dan kontrol bertahan.

02 — Tangkapan layar

Tangkapan layar (2)

01 / 1
02 / 2

03 — Request dan response

Rekaman HTTP

Sebagian nilai kredensial disamarkan pada tampilan HTML publik ini. Penyamaran ini tidak menjamin bahwa seluruh data sensitif atau berkas tertaut sudah disamarkan.

REKAMAN 01 / 1
HTTP request
POST /upload_profile_picture HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive
Authorization: Bearer [REDACTED-LAB-TOKEN]
Content-Length: 214
Content-Type: multipart/form-data; boundary=9f1167246e65c3b70584c79ad4a00969

--9f1167246e65c3b70584c79ad4a00969
Content-Disposition: form-data; name="profile_picture"; filename="../../../../tmp/pwned.txt"
Content-Type: text/plain

PWNED-BY-PENTEST
--9f1167246e65c3b70584c79ad4a00969--
HTTP response
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 136
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25
Date: Wed, 30 Sep 2026 03:13:08 GMT

{
  "file_path": "static/uploads/533021_tmp_pwned.txt",
  "message": "Profile picture uploaded successfully",
  "status": "success"
}
REKAMAN 02 / 2
HTTP request
GET /static/uploads/533021_tmp_pwned.txt HTTP/1.1
User-Agent: python-requests/2.33.1
Accept-Encoding: gzip, deflate, br, zstd
Accept: */*
Connection: keep-alive

HTTP response
HTTP/1.1 200 OK
Content-Disposition: inline; filename=533021_tmp_pwned.txt
Content-Type: text/plain; charset=utf-8
Content-Length: 16
Last-Modified: Wed, 30 Sep 2026 03:13:08 GMT
Cache-Control: no-cache
Date: Wed, 30 Sep 2026 03:13:09 GMT
Access-Control-Allow-Origin: *
Server: Werkzeug/2.0.1 Python/3.9.25

PWNED-BY-PENTEST