Beberapa Tips WordPress Security Hardening

March 18, 2012 by · Leave a Comment 

Saya melihat sebuah email pada milis di kampus yang memberitakan adanya website kampus yang di-deface oleh orang yang tidak bertanggung jawab. Website tersebut menggunkan WordPress sebagai content management system (CMS).

Ngomong-ngomong masalah hack, dulu blog ini juga pernah kebobolan. Pengguna mengganti .htaccess dan efek yang dihasilkan adalah redirect ke url lain begitu kita membuka blog ini. Juga pernah kejadian craker mengganti username dan mengganti password di database, tapi syukurlah tidak sampai merusak data-data yang ada.

Sejak saat itu, saya jadi sedikit concern pada sekuritas web terutama wordpress. Banyak sumber yang menyebutkan jika 3rd party pada wordpress seperti themes dan plugin rentan pada serangan-serangan tersebut. Intinya, jika plugin dan themes tidak pernah di-update, maka blog atau web rentan terhadap serangan hacking.

Saya akan memberikan beberapa tips untuk mengamankan website berbasis wordpress dan menurut saya tips ini sudah lebih dari cukup. Cukup bermodalkan htaccess, kita bisa membatasi setiap pergerakan orang yang berniat iseng pada website kita.

  • Buatlah sebuah file .htaccess pada root direktori web, jika sudah ada, silahkan ditambahkan pada bagian bawah baris yang sudah ada.
############
# Disallow #
############
<Files wp-config.php>
  Order allow,deny
  Deny from all
</Files>
<Files readme.html>
  Order allow,deny
  Deny from all
</Files>
<Files install.php>
  Order allow,deny
  Deny from all
</Files>
 
#########
# Allow #
#########
<Files index.php>
  Order allow,deny
  Allow from all
</Files>
  • Buat juga sebuah file .htaccess pada wp-content/plugins
<Files *.php>
  Order allow,deny
  Deny from all
</Files>
<Files smiley.php>
  Order allow,deny
  Allow from all
</Files>
  • Sebuah file .htaccess pada wp-content/themes
<Files *.php>
  Order allow,deny
  Deny from all
</Files>
  • Sebuah lagi pada wp-includes
<Files *.php>
  Order allow,deny
  Deny from all
</Files>
<Files wp-tinymce.php>
  Order allow,deny
  Allow from all
</Files>
  • Sebuah lagi pada wp-includes
<Files *.php>
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
  Allow from 74.79.0.0/16
  Allow from 179.15.22.0/24
</Files>

Filosofi dari baris-baris tersebut adalah kita membatasi gerakan peretas yang ingin merusak website kita. Kebanyakan file-file wordpress tidak dipanggil secaa langsung ketika dibuka dari browser, melainkan melalui induk file index.php. File inilah yang memanggil file-file yang lainnya. Oleh karena itu, kita bisa memproteksinya dengan menggunakan htacces di atas. Namun ada juga file-file yang diakses secara langsung dan jika kita memproteksinya, otomatis website kita tidak akan berjalan dengan baik. Pengecekan mana file-file yang diakses langsung bisa menggunakan fitur inspect elemen pada google chrome, lalu membuka tab Console. Jika tidak ada error, maka proteksi yang digunakan berjalan dengan baik. Efek dari kode di atas adalah ketika mengakses langsung file yang telah diproteksi, blog akan mengeluarkan kode 404 yang menyatakan bahwa file tidak ada.

Untuk artikel kali ini, saya hanya akan membahas trik dengan htaccess. Untuk menambah keamanan, jangan lupa untuk mengganti permission htaccess menjadi 444. Ini untuk memastikan bahwa file htaccess tidak bisa ditulis secara langsung.

Invite Massal dengan Cross Site Request Forgery pada Facebook

April 23, 2011 by · Leave a Comment 

Malam ini, saya melihat status teman saya di Facebook yang isinya seperti ini:

Saya juga menerima undangan yang sama seperti di atas. Namun, orang-orang yang mengirimkan undangan tersebut tidak tahu kalo dia mengirimkan undangan tersebut. Saya dari awal sudah menduga, kalo ini adalah serangan yang memanfaatkan API pada Facebook. Dari judul event nya saja, saya sudah tau kalau event tersebut tidak ada.  Baca tentang melihat siapa yang mengunjungi profil facebook kita.

Saya akhirnya penasaran dengan serangan tersebut, lalu mencari tau bagaimana serangan itu dilakukan.

Dugaan awal saya adalah serangan yang dilakukan adalah Cross Site Request Forgery. Ini adalah serangan yang menyebabkan kita melakukan tindakan yang tidak kita inginkan ketika mengeklik sebuah link. Link tersebut berisi perintah atau akan mengarahkan kita menuju sebuah halaman dengan kode yang isinya menyuruh kita melakukan sesuatu pada aplikasi web yang saat itu kita sedang login.

Misalnya saja, kita sedang login di sebuah bank online. Kita mendapat sebuah link dari teman kita. Tanpa mengecek link tersebut, kita langsung mengeklik link tersebut. Ternyata, link tersebut menyebabkan account kita yang sedang login pada bank online tersebut untuk mentransfer sejumlah uang ke rekening lain tanpa sepengetahuan dan seijin kita. Itulah serangan Cross Site Request Forgery.

Kembali ke permasalahan, akhirnya, saya membuka event tersebut dan melihat isinya.

Isinya biasa saja, tidak ada yang aneh. Namun saya tertarik pada sebuah link pada halaman event tersebut : http://x.co/Wl—

Saya membuka alamat http://checkshorturl.com. Site ini berguna untuk mengecek alamat asli dari sebuah short URL. Alamat web http://x.co/Wl— mengarah ke alamat http://maggiona.blogspot.c–/

Saya logout dari facebook agar terhindar dalam serangan ketika membuka link tersebut.

Saya melihat source-code halaman tersebut. Isinya berisi kode javascript.

Saya melihat sebuah link dengan ekstensi php. Saya membuka alamat tersebut dan melihat isinya yang ternyata adalah kode javascript yang memanfaatkan API pada Facebook untuk mengeksploitasi account kita, seperti memberikan undangan otomatis, menulis wall kita, dll. Ini bisa terjadi karena kita sedang login.

Inti dari kode di atas adalah, ketika kita membuka halaman tersebut, kita akan otomatis membuka jalur penyerang pada account facebook kita. Satu cara lagi adalah ketika kita mengikuti instruksi pada halaman depan tulisan di blogspot untuk mengcopy code dan membukanya melaui url address bar.

Kasus di atas adalah salah satu kasus serangan Cross Site Request Forgery. Pencegahan yang bisa dilakukan adalah jangan asal mengeklik sebuah link yang tidak jelas asalnya. Penggunaan Short URL sudah memasuki jaman untrusted link. Periksa kembali link sepeti itu agar tidak terkena jebakan yang merugikan kita.

 

Sistem Login yang Aman dengan PHP

November 15, 2010 by · Leave a Comment 

Saya pertama kali belajar PHP, saya bingung dengan bagaimana sistem login di web. Saya mencari-cari artikel di internet dan banyak sekali variasi kode untuk halaman dan verifikasi login agar bisa masuk ke halaman tertentu, baik itu halaman admin atau halaman yang dilindungi oleh pembuatnya. Skema login sebenarnya sederhana dan pada tulisan ini saya juga hanya memberikan skema yang sederhana. Urutan autentikasi login ada 4:

  1. User melihat halaman dengan form untuk mengisi username dan password disertai dengan tombol untuk login, bisa juga ditambahkan dengan form lain misalnya Captcha berupa gambar. Kadang kala, form login tidak harus username dan password, bisa saja hanya form password saja yang ditampilkan.
  2. User memasukkan data dan memberikan data ke server untuk diproses.
  3. Data input username dan password diproses. Data ini dicocokan dengan database yang ada, misalnya database MySQL. Jika username dan password yang diberikan dari input user sama dengan username dan password pada database, maka login berhasil. Jika tidak ada data yang  cocok, maka login tidak berhasil.
  4. Buat session untuk akses file yang diproteksi. Session digunakan untuk keperluan yang kita inginkan. Session adalah variabel global yang bisa menyimpan data penanda bahwa seorang user telah berhasil login sehingga file yang diproteksi bisa diakses.

Skema login yang lebih kompeks bisa ditambahkan sesuai dengan kebutuhan, misalnya saja memeriksa IP, membatasi jumlah user yang login, dll. Pertama, kita harus membuat halaman login, kode-kode html di bawah ini adalah bagian dari keseluruhan html yang ada.

login.php

1
2
3
4
5
<form action="auth.php" method="post">
	<label for="username">Username</label><input type="text" name="username"  class="input" size="10" autocomplete="off" /><br /><br />
	<label for="password">Password</label><input type="text" name="password" class="input" size="20" autocomplete="off" /><br />
	<input type="submit" value="Login" class="btn" />
</form>

auth.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
	session_start();
	$user       = mysql_real_escape_string($_POST["user"]);
	$user       = substr($user, 0, 10);
	$password   = mysql_real_escape_string($_POST["password"]);
	$password   = substr($password, 0, 20);
	$q          = "SELECT * FROM user WHERE user='$user'";
	$r          = mysql_query($q);
	$d          = mysql_fetch_object($r);
 
	if($d->user == $user AND $d->password == md5($password))
	{
		$_SESSION["user"] = $data->user;
		$_SESSION["nama"] = $data->nama;
	}
	else
	{
		header("location: login.php");
	}
?>

Jika dilihat kode di atas, ada beberapa isu keamanan yang perlu diperhatikan.

  1. Gunakan $_POST, bukan $_GET, atau $_REQUEST. Metoda ini digunakan agar data dikirim lewat metoda POST yang tidak kelihatan lewat browser. REQUEST dicegah karena metoda ini masih menerima data dari GET.
  2. Gunakan fungsi mysql_real_escape_string(). Fungsi ini berguna untuk mengilangka tanda quote pada data input username dan password yang bisa membahayakan fungsi login kita dengan serangan sql injection. SQL injection adalah metode serangan pada halaman login dengan memasukkan inputan data yang salah sehingga sql kita menjadi tidak logis sesuai dengan tujuan awal, hasilnya bisa saja user mendapatkan akses admin tanpa harus mengetahui password admin tersebut.
  3. Ambil data username dari database terlebih dahulu. Pengecekan passwor dilakukan setelah mengambil data username terlebih dahulu. Sebisa mungkin hindari penggunaan perintah sql :
    1
    
    "SELECT * FROM user WHERE user='$user' and password='$password'";

    Kode sql di atas bisa rentan terhadap serangan sql injection.

  4. Batasi penggunaan input karakter pada form login. Form input bisa dibatasi dengan penggunaan tag size=”10″ pada kode html. Lakukan proteksi juga di sisi server dengan fungsi substr()
  5. Jangan simpan password pada $_SESSION. Session bisa saja disalahgunakan, oleh karena itu simpanlah data yang memang pentin pada session dan jangan menyimpan password.

Selamat mengamankan halaman login 🙂

Adakah Cara Mengetahui Siapa yang Melihat Profil Facebook Kita?

October 5, 2009 by · 17 Comments 

Anda mungkin pernah  melihat group ini pada facebok atau mungkin saja Anda sedang masuk di dalam grup yang menamakan diri dengan “CARA MENGETAHUI SIAPA YANG MELIHAT PROFIL FACEBOOK KITA”.

Ada info basic yang bisa kita peroleh di halaman depan grup ini. Berikut isi infonya:

SERING KALI KITA TIDAK TAHU SIAPA SAJA YANG MELIHAT PROFILE FACEBOOK KITA, SEPERTI WALL / DINDING, INFORMASI PRIBADI, BAHKAN FOTO-FOTO PRIBADI KITA… MUNGKIN BISA TEMAN DEKAT, BISA JUGA TEMAN YANG TIDAK KITA KENAL, APALAGI KALAU KITA SEDANG DIMATA-MATAI OLEH ORANG LAIN!

CARANYA MUDAH SEKALI, IKUTI LANGKAH-LANGKAH BERIKUT:

===================================

=============== 

Lihat LINK di sebelah kanan tulisan ini atau di bawah gambar sebelah ini ———–►

1 ► KLIK “Join this Group” ATAU “Gabung ke Grup Ini”
(hanya anda yang telah bergabung yang bisa menggunakan fasilitas ini!)

2 ► KLIK “Invite People to Join” ATAU “Undang Orang untuk Bergabung”

3 ► CENTANG Semua teman anda, minimal 100 orang agar bisa berjalan!
(hanya teman anda yang telah di undang yang bisa anda lihat segala aktivitasnya di facebook anda!)

4 ► KLIK Tombol “Send Invitations” ATAU “Kirim Undangan”

==================================================

JANGAN LUPA MELAKUKAN LANGKAH-LANGKAH DIATAS! DAN LIHAT APA YANG NANTI AKAN TERJADI KEMUDIAN SETELAH ANDA KLIK TOMBOL “Send Invitations” ATAU “Kirim Undangan” !!!

grup
Nah, bisakah grup ini mengantar kita melihat orang-orang yang pernah melihat profil kita? Jawabnya sudah pasti tidak. Kenapa? Karena facebook tidak mengijinkannya. Trus gmana dong? Ya emang ga bisa.
Kenapa facebook melakukan ini? Ini dikarenakan agar privasi setiap orang yang melihat profile orang lain tetap terjaga. Kan malu dong kalo kita ketahuan liat-liat profil orang lain? Trus gmana dong kalo ada foto-foto yang ga seharusnya dilihat oleh orang lain? Ya tentu saja fotonya jangan diupload di facebook. Beres kan?
Yang pasti grup ini menyesatkan banyak orang yang mengatakan dengan mengikuti grup ini dan mengajak minimal 100 orang teman kita, kita akan mendapatkan fasilitas tambahan ini. Kalo ga percaya, liat nih kutipan dari FAQ Facebook:

Facebook currently does not provide an application that allows users to track profile views or statistics on the views of any specific user content. Third party developers, however, may offer applications that provide some of this functionality. Please keep a few things in mind for these applications:

Applications CANNOT track profile visits for users who simply go to another person’s profile; Facebook has made this technically impossible.In order to be tracked by an application, you will need to specifically agree to allow the application to track your actions. 

Adding an application that provides this functionality is purely optional. If you do not want to participate, please do not add the application to your account.

Nah, sudah jelas kan? Setiap aplikasi dan grup di facebook tidak dapat digunakan untuk mengetahui siapa saja yang melihat profil facebook kita.