*Apa itu SSRF?*
(SSRF) mengacu pada serangan di mana di penyerang dapat mengirim permintaan yang dibuat dari aplikasi web yang rentan. SSRF biasanya digunakan untuk menargetkan sistem internal di belakang firewall yang biasanya tidak dapat diakses oleh penyerang dari jaringan eksternal. Selain itu, mungkin juga bagi penyerang untuk memanfaatkan SSRF untuk mengakses layanan dari server yang sama yang hanya bisa diakses dari antarmuka loopback (127.0.0.1).
Celah SSRF sendiri bisa dimanfaatkan untuk membaca file konfigurasi di sistem target seperti membaca file /etc/passwd. SSRF juga bisa dieksploitasi lebih lanjut hingga menjadi celah RCE.
*Eksploitasi SSRF Melalui URL Scheme*
Berikut beberapa url scheme yang dapat digunakan dalam ssrf.
file://
http://
dict://
sftp://
tftp://
ldap://
gopher://
*Contoh SSRF*
Berikut adalah kode PHP yang memiliki celah SSRF
<?php if (isset($_GET['url'])){ $url = $_GET['url']; $image = fopen($url, 'rb'); header("Content-Type: image/png"); fpassthru($image); }
Oke, dalam contoh di atas, karena penyerang memiliki kontrol penuh terhadap parameter url, selain mampu membuat permintaan GET secara bebas ke situs web apa pun di internet, seorang penyerang juga dapat membuat permintaan ke sumber daya di server.
Sebagai contoh, mungkin bagi penyerang untuk mengakses layanan di localhost. Dalam contoh berikut, penyerang dapat membuat permintaan berikut pada Server HTTP Apache dengan mengaktifkan mod_status (diaktifkan secara default).
GET /?url=http://localhost/server-status HTTP/1.1
Host: example.com
Demikian pula, Server Side Request Forgery (SSRF) dapat digunakan untuk membuat permintaan ke sumber daya internal lain yang memiliki akses ke server web, tetapi tidak menghadap ke publik. Contoh seperti itu akan mengakses metadata instan di instance Amazon EC2 dan OpenStack. Layanan ini hanya tersedia untuk server dan jaringan internal. Seorang penyerang bahkan dapat berkreasi dengan SSRF dan menjalankan pemindaian port pada jaringan internal dengan pendekatan ini.
GET /?url=http://169.254.169.254/latest/meta-data/ HTTP/1.1
Host: example.com
Terlepas dari skema http:// dan https://, penyerang dapat memanfaatkan skema URL lain yang tidak difilter untuk mengakses file di sistem lokal atau di jaringan internal.
Contoh permintaan tersebut adalah yang berikut menggunakan file:/// skema URL.
GET /?url =file:///etc/passwd HTTP / 1.1
Host: example.com
Tergantung pada bagaimana aplikasi membuat permintaan, skema URL selain file dan HTTP dapat tersedia untuk digunakan penyerang. Misalnya, jika cURL digunakan untuk membuat permintaan (contoh di atas menggunakan fopen() untuk membuat permintaan), kalian dapat menggunakan skema URL dict untuk membuat permintaan ke host mana pun di port mana pun dan mengirim data khusus.
GET /?url = dict://localhost:11211/stat HTTP / 1.1
Host: example.com
Permintaan di atas akan menyebabkan aplikasi untuk terhubung ke localhost pada port 11211 dan mengirim string "stat". Port 11211 adalah port default yang digunakan oleh Memcached, yang biasanya tidak terekspos.
(SSRF) mengacu pada serangan di mana di penyerang dapat mengirim permintaan yang dibuat dari aplikasi web yang rentan. SSRF biasanya digunakan untuk menargetkan sistem internal di belakang firewall yang biasanya tidak dapat diakses oleh penyerang dari jaringan eksternal. Selain itu, mungkin juga bagi penyerang untuk memanfaatkan SSRF untuk mengakses layanan dari server yang sama yang hanya bisa diakses dari antarmuka loopback (127.0.0.1).
Celah SSRF sendiri bisa dimanfaatkan untuk membaca file konfigurasi di sistem target seperti membaca file /etc/passwd. SSRF juga bisa dieksploitasi lebih lanjut hingga menjadi celah RCE.
*Eksploitasi SSRF Melalui URL Scheme*
Berikut beberapa url scheme yang dapat digunakan dalam ssrf.
file://
http://
dict://
sftp://
tftp://
ldap://
gopher://
*Contoh SSRF*
Berikut adalah kode PHP yang memiliki celah SSRF
<?php if (isset($_GET['url'])){ $url = $_GET['url']; $image = fopen($url, 'rb'); header("Content-Type: image/png"); fpassthru($image); }
Oke, dalam contoh di atas, karena penyerang memiliki kontrol penuh terhadap parameter url, selain mampu membuat permintaan GET secara bebas ke situs web apa pun di internet, seorang penyerang juga dapat membuat permintaan ke sumber daya di server.
Sebagai contoh, mungkin bagi penyerang untuk mengakses layanan di localhost. Dalam contoh berikut, penyerang dapat membuat permintaan berikut pada Server HTTP Apache dengan mengaktifkan mod_status (diaktifkan secara default).
GET /?url=http://localhost/server-status HTTP/1.1
Host: example.com
Demikian pula, Server Side Request Forgery (SSRF) dapat digunakan untuk membuat permintaan ke sumber daya internal lain yang memiliki akses ke server web, tetapi tidak menghadap ke publik. Contoh seperti itu akan mengakses metadata instan di instance Amazon EC2 dan OpenStack. Layanan ini hanya tersedia untuk server dan jaringan internal. Seorang penyerang bahkan dapat berkreasi dengan SSRF dan menjalankan pemindaian port pada jaringan internal dengan pendekatan ini.
GET /?url=http://169.254.169.254/latest/meta-data/ HTTP/1.1
Host: example.com
Terlepas dari skema http:// dan https://, penyerang dapat memanfaatkan skema URL lain yang tidak difilter untuk mengakses file di sistem lokal atau di jaringan internal.
Contoh permintaan tersebut adalah yang berikut menggunakan file:/// skema URL.
GET /?url =file:///etc/passwd HTTP / 1.1
Host: example.com
Tergantung pada bagaimana aplikasi membuat permintaan, skema URL selain file dan HTTP dapat tersedia untuk digunakan penyerang. Misalnya, jika cURL digunakan untuk membuat permintaan (contoh di atas menggunakan fopen() untuk membuat permintaan), kalian dapat menggunakan skema URL dict untuk membuat permintaan ke host mana pun di port mana pun dan mengirim data khusus.
GET /?url = dict://localhost:11211/stat HTTP / 1.1
Host: example.com
Permintaan di atas akan menyebabkan aplikasi untuk terhubung ke localhost pada port 11211 dan mengirim string "stat". Port 11211 adalah port default yang digunakan oleh Memcached, yang biasanya tidak terekspos.