Exploiting Broken Crypto to SSRF On PHP-Proxy

Muh. Fani Akbar
3 min readSep 6, 2021

PHP-Proxy sebenarnya adalah project yang sudah tidak dikembangkan lagi, tapi disini saya melihat masih ada banyak orang yang menggunakan PHP-Proxy sebagai Web Proxy.

Project PHP-Proxy https://www.php-proxy.com/

PHP-Proxy Overview

Url yang disubmit di form, akan di-encrypt dan dilakukan redirect ke /?q=<ENCRYPTED_URL>.

add_http adalah fungsi yang akan menambahkan http:// apabila $url tidak diawali dengan https:// atau http://

Apabila yang disubmit adalah file:///etc/passwd, oleh fungsi add_http akan me-return http://file:///etc/passwd sehingga kita tidak bisa exploit dengan cara men-submit URL lewat form.

proxify_url adalah fungsi yang digunakan untuk membuild redirect URL, lalu bisa dilakukan proxying

Setelah form url disubmit, akan masuk ke logic ini, dimana disini proses fetch remote resource dilakukan.

Method fordward dari class Proxy secara internal menggunakan curl sebagai Requester nya.

PHP-Proxy Conclusion

Dari hasil overview tersebut, tidak ditemukan adanya filter apapun dalam url, sehingga ada kemungkinan kita bisa meng-abuse url untuk SSRF Attack. Agar bisa melakukan SSRF Attack, Payload harus di submit melalui GET /?q=, karena apabila lewat form submit URL, fungsi add_http akan menambahkan http:// sebagai schemal dari URL yang disubmit. Jadi agar bisa melakukan SSRF dengan memanfaatkan file:// ataupun gopher://, kita harus men-generate Encrypted_URL dengan payload SSRF kita.

Broken Cryptography

Key yang digunakan untuk proses enkripsi adalah dari Config::get("encryption_key").

encryption_key key di set dari md5(app_key + URL_MODE) , yang dimana app_key ini digenerate menggunakan fungsi openssl_random_pseudo_bytes(100) sehingga tidak dapat ditebak.

Algoritma Crypto yang digunakan untuk meng-enkripsi URL adalah Caesar Cipher, dimana Caesar Cipher adalah algoritma Crypto classic dan Key nya sangat mudah didapatkan dengan cara Brute Force atau dengan Known Plaintext Attack.

Agar bisa membuat URL yang digunakan untuk SSRF, pertama harus didapatkan terlebih dahulu encryption_key. encryption_key bisa didapatkan dari menggunakan fungsi str_rot_pass dengan parameter $str=ENCRYPTED_URL dan key=KNOWN_URL.

$ php exploit.php                                                           
KEY : c96442dc36b61ebce28b02c537b9ad7c

Dengan memanfaatkan Known Plaintext kita dengan mudah bisa mendapatkan encryption_key.

SSRF

PHP-Proxy menggunakan curl sebagai Requester nya, seperti yang diketahui curl support berbagai macam protokol termasuk file:// dan gopher:// yang biasa dimanfaatkan untuk SSRF Attack.

Local File Read

Local File Read sangat memungkinkan dengan memanfaatkan schema file://, sebagai contoh disini saya mencoba membaca isi file dari /etc/passwd

❯ php exploit.php read '/etc/passwd'
KEY : c96442dc36b61ebce28b02c537b9ad7c
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

SSRF FastCGI RCE

Mendapatkan RCE dengan me-forge protokol FastCGI hanya bisa dilakukan apabila fastcgi menggunakan TCP Socket.

❯ php exploit.php fastcgi 'id'
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Note : Detail mengenai SSRF FastCGI akan saya jelaskan pada postingan lain.

--

--