4.3 Implementasi Konfigurasi Pencegahan SQL Injection pada PHP
4.3.1 Implementasi pada Code PHP dan Penyimpanan File Pada contoh coding seperti ini :
serangan SQL Injection dari berbagai macam celah yang mungkin saja terdapat pada sebuah web yang vulnerable. Implementasi konfigurasi pencegahan serangan SQL Injection dibahas pada 3 macam implementasi yaitu implementasi pada code PHP dan penyimpanan file, implementasi pada web server lokal dan implementasi pada web server melalui jasa web hosting.
4.3.1 Implementasi pada Code PHP dan Penyimpanan File Pada contoh coding seperti ini :
Gambar 4.57 Code PHP Vulnerable
Dapat menimbulkan permasalahan keamanan pada input username dan password, yang memungkinkan untuk di injeksi dengan suatu string yang biasa digunakan pada SQL Injection, yaitu ‘ OR ‘’=’ pada field username dan password yang kemudian akan dianggap true, karena pada $query=”SELECT * FROM user WHERE ‘username’=’$username’ AND ‘password=’$password’”; posisi
‘username’=’$username’ akan digantikan oleh ‘username’=’’ OR ‘ ’=’‘seperti pada kasus berikut:
Gambar 4.58 User Interface Web Test
Field pada username dan password diisi dengan ‘ OR ‘’=’ setelah itu klik submit.
Gambar 4.59 Login Sukses dengan SQL Injection
Berhasil melakukan login hanya dengan menggunakan ‘ OR ‘’=’ 1. Langkah – langkah konfigurasi untuk pencegahan terhadap celah
Gambar 4.60 Syntax mysql_real _escape_string
Saat code telah ditambahkan syntax mysql_real_escape_string(); seperti pada baris ke 11 yang berguna untuk melewatkan karakter spesial dari input pada field username dan password, maka ‘ OR ’’=’ akan dianggap false seperti berikut :
Gambar 4.61 User Interface Setelah Syntax mysql_real_escape_string
Untuk lebih jelasnya, cara keja yang dilakukan oleh mysql_real_escape_string(); adalah
Gambar 4.62 User Interface Logika Syntax mysql_real_escape_string
2. Langkah – langkah konfigurasi untuk pencegahan terhadap celah SQL Injection pada perubahan Return Value :
Pada contoh coding berikut :
Gambar 4.63 Kelemahan Coding PHP Return Value
Di baris ke 15, mysql_num_rows($quesy_run)>=1 terdapat kelemahan, yaitu >=1 karena tidak membatasi jumlah return value baris yang bisa diterima. Pada database terdapat > 1 baris.
Gambar 4.64 User Interface phpMyAdmin
Untuk meningkatkan keamanan dari celah ini, maka perlu dilakukan pembatasan dalam jumlah return value agar yang diterima hanyalah data yang sesuai dengan database. Jika data tidak tercantum pada database, maka login tidak akan berhasil. Hal ini dilakukan dengan mengganti return value menjadi ==1.
Saat return value diubah menjadi ==1 seperti pada baris ke 15, yang membatasi return value hanya pada satu baris, maka yang terjadi pada saat memasukkan input ‘ OR ‘’=’ adalah :
Gambar 4.66 User Interface Setelah Solusi Coding PHP
Login tersebut gagal karena OR tidak terdapat dalam database. Jika dimasukkan input yang benar dan sesuai dengan salah satu dari kolom yang ada didalam database, maka input akan diterima.
Gambar 4.67 User Interface Login Success
3. Langkah – langkah untuk menghindari Find Admin pada Havij : Havij dapat melakukan pencarian terhadap halaman administrator dengan melakukan pemeriksaan terhadap kemungkinan – kemungkinan penamaan pada halaman administrator yang biasa digunakan oleh web. Oleh karena itu, untuk melindungi halaman administrator agar tidak berhasil ditemukan oleh penyerang, maka halaman dapat dilindungi dengan cara :
M enghindari penamaan yang umum digunakan seperti
xxxx.com/admin.php; xxxx.com/cpanel; xxxx.com/admin/admin.php dan lain sebagainya. Halaman login
administrator dapat diletakkan ke dalam folder dengan nama yang lebih tidak umum, atau dengan menggunakan folder didalam folder yang juga menggunakan nama yang tidak umum, seperti berikut ini :
Gambar 4.68 Havij Find Admin
Havij gagal mendapatkan halaman administrator, karena halaman administrator berada pada folder pages/administrasi/login.php yang ditampilkan sebagai berikut :
Gambar 4.69 Halaman Login Administrator Target Setelah Dikonfigurasi
Dengan tingkat kerumitan penamaan yang hanya diketahui oleh pemilik web atau orang yang bersangkutan, maka pencarian halaman login administrator akan sulit untuk dilakukan, sehingga dapat mencegah penyusup untuk memasuki halaman administrator walaupun ia telah memiliki username dan password administrator.
4. Cara mengantisipasi password leak dengan menggunakan preg_match() dan enkripsi md5().
Dalam melakukan pencegahan terhadap serangan SQL Injection dan sebagai langkah antisipasi apabila penyerang berhasil menemukan isi database, maka melakukan enkripsi password merupakan langkah yang sangat penting dan hal yang paling mendasar, sehingga data yang diperoleh tidak dapat digunakan untuk mengakses halaman administrator maupun user dari suatu web. Penggunaan password pun harus gabungan dari huruf, angka, maupun spesial karakter agar menyulitkan penyerang jika hendak melakukan proses dekripsi password. Untuk password yang umum digunakan, proses dekripsi sangat mudah dilakukan karena kamus dari hasil enkripsi kata tertentu sudah banyak beredar secara online. Berikut contoh penggunaan
enkripsi password pada suatu web, dalam hal ini enkripsi yang digunakan adalah md5.
Gambar 4.70 User Interface Web yang Terenkripsi
Pada gambar diatas, password yang harus digunakan terdiri dari huruf kecil, huruf kapital, angka dan special karakter, dimana code validasi password menggunakan fungsi preg_match(); untuk menentukan pola tersebut adalah seperti berikut :
Gambar 4.72 Coding Enkripsi PHP Lanjutan
Sehingga, pada saat code dieksekusi, data yang tersimpan pada database menjadi seperti berikut :
Gambar 4.73 Tampilan Password Enkripsi pada Database
Password yang berisi “md5M D5!!” dienkripsi menjadi “dd1395672066fdd8a1c860f4464c2b30”, jika diuji dengan melakukan dekripsi melalui Havij yang memanfaatkan bermacam – macam decryptor online, maka hasilnya seperti berikut :
Gambar 4.74 Havij Decryptor
Dan apabila dilakukan pencarian melalui search engine, maka hasilnya seperti berikut :
Hal ini sangat berbeda jika menggunakan password yang umum digunakan, seperti “administrator123!” yang enkripsi md5nya adalah “10c4981bb793e1698a83aea43030a388”. Walaupun terkesan password tersebut kuat karena terdiri dari kombinasi huruf, angka dan spesial karakter, namun dekripsi untuk plain textnya sangat mudah ditemukan. Seperti yang ditemukan oleh Havij pada gambar berikut :
Gambar 4.76 Contoh Password yang Terlihat Strong
Oleh karena itu, menggunakan password yang terlihat kuat saja tidak cukup, tetapi harus menggunakan kombinasi yang sangat unik dan bervariasi agar password menjadi lebih kuat. Terutama password bagi administrator, karena username dan password administrator paling sering menjadi target dari penyerang.
4.3.2 Implementasi pada Web Server
Sub bab implementasi pada web server membahas mengenai konfigurasi apa saja yang mungkin diterapkan di pemilik web jika menggunakan server lokal milik sendiri atau pun menggunakan server yang telah disediakan oleh jasa web hosting.
4.3.2.1 Server Lokal
Field pada username dan password diisi dengan ‘ OR ‘’=’ setelah itu klik submit.
Gambar 4.77 Login Sukses dengan SQL Injection
Berhasil melakukan login hanya dengan menggunakan ‘ OR ‘’=’
1. Langkah – langkah konfigurasi untuk pencegahan terhadap celah SQL Injection menggunakan syntax magic_quotes_gpc pada file php.ini :
• Menggunakan sistem operasi Linux
1) Buka aplikasi terminal ataupun console pada Linux.
Gambar 4.78 Letak Terminal Pada Linux
2) Login sebagai root dengan cara ketik perintah su dan masukkan password root yang digunakan atau jika tidak dapat login sebagai root, harus menambah perintah “sudo” pada setiap awal baris dari perintah – perintah selanjutnya yang akan dilakukan.
Gambar 4.79 Login Terminal Linux
3) Buka file php.ini dengan cara mengetikan perintah pico /etc/php5/apache2/php.ini
4) M engaktifkan on pada syntax magic_quotes_gpc, lalu tekan Ctrl+X, Y kemudian enter untuk menyimpan hasil perubahan pada file php.ini
Gambar 4.81 Tampilan PHP.ini magic_quotes_gpc Pada Linux
• Menggunakan sistem operasi Windows
1) Buka file php.ini yang berada pada directory C:\xampp\php\php.ini
2) M engaktifkan on pada syntax magic_quotes_gpc, lalu tekan Ctrl+S atau klik File >> Save, untuk menyimpan hasil perubahan pada file php.ini
Gambar 4.83 Tampilan php.ini magic_quotes_gpc Pada Windows
Setelah syntax magic_quotes_gpc = On, maka pada saat dilakukan input ‘ OR ‘’=’ maka string akan diterima seperti berikut :
2. Langkah – langkah konfigurasi untuk pencegahan terhadap celah SQL Injection menggunakan syntax display_errors pada file php.ini :
• Menggunakan sistem operasi Linux
1) Buka aplikasi terminal ataupun console pada Linux.
Gambar 4.85 Letak Terminal Linux
2) Login sebagai root dengan cara ketik perintah su dan masukkan password root yang digunakan atau jika tidak dapat login sebagai root, harus menambah perintah sudo pada setiap awal baris dari perintah – perintah selanjutnya yang akan dilakukan.
3) Buka file php.ini dengan cara mengetikan perintah pico /etc/php5/apache2/php.ini
Gambar 4.87 Perintah M embuka File php.ini Pada Linux
4) M engaktifkan off pada syntax display_errors, lalu tekan Ctrl+X, Y kemudian enter untuk menyimpan hasil perubahan pada file php.ini
Gambar 4.88 Tampilan PHP.ini display_errors Pada Linux
• Menggunakan sistem operasi Windows
1) Buka file php.ini yang berada pada directory C:\xampp\php\php.ini
Gambar 4.89 Command Prompt Windows
2) M engaktifkan off pada syntax display_errors, lalu tekan Ctrl+S, untuk menyimpan hasil perubahan pada file php.ini
Setelah syntax display_errors = Off, maka pada saat dilakukan input ‘ maka halaman web tidak akan memunculkan pesan error seperti berikut :
Gambar 4.91 Halaman Web Vulnerable
3. Langkah – Langkah konfigurasi untuk pencegahan terhadap celah SQL Injection dengan melakukan instalasi M od Security :
• Menggunakan sistem operasi Linux
1) Buka aplikasi terminal ataupun console pada Linux.
2) Login sebagai root dengan cara ketik perintah su dan masukkan password root yang digunakan atau jika tidak dapat login sebagai root, harus menambah perintah sudo pada setiap awal baris dari perintah – perintah selanjutnya yang akan dilakukan.
Gambar 4.93 Login Terminal Linux
3) Ketik perintah apt-get install subversion untuk memulai instalasi mod security. Namun harus terkoneksi dengan jaringan internet untuk melakukan perintah tersebut.
Gambar 4.94 Perintah Install Subversion Pada Linux
4) Lalu ketik perintah svn co https://mod-
security.svn.sourceforge.net/svnroot/mod-security/m2/trunk modsecurity. Namun harus terkoneksi dengan jaringan internet untuk melakukan perintah tersebut.
5) Kemudian ketik perintah apt-get install libapache-mod-security. Namun harus terkoneksi dengan jaringan internet untuk melakukan perintah tersebut.
Gambar 4.96 Install libapache-mod-security Pada Linux
4.3.2.2 Server Jasa Web Hosting
1. Langkah – langkah konfigurasi untuk pencegahan terhadap celah SQL Injection menggunakan syntax magic_quotes_gpc pada file .htaccess :
Gambar 4.97 Konfigurasi htaccess magic_quotes_gpc Pada Hosting
2. Langkah – langkah untuk pencegahan terhadap celah SQL Injection menggunakan syntax display_errors pada file .htaccess :
Gambar 4.98 Konfigurasi htaccess display_errors Pada Hosting
4.4 Evaluasi
4.4.1 Evaluasi Hasil Serangan SQL Injection
Dari hasil evaluasi yang sudah didapatkan ada berberapa jenis celah terhadap serangan SQL Injection yang mungkin dilakukan pada sebuah web yang
berbasis PHP. Berikut ini adalah daftar tabel web yang telah dilakukan uji coba serangan SQL Injection dengan menggunakan Havij.
Tabel 4.1 Web yang Diserang dengan Havij
No URL SQLi Database Tabel Kolom Data Enkripsi Administrator /Halaman Administrator 1 http://www.oz onegaming.co m/product.php ?id=12 √ √ √ √ √ × × 2 http://spyderc o.com/catalog/ details.php?pr oduct=77 √ √ √ √ √ × × 3 http://www.se phiroth.it/file_ detail.php?id= 130 √ √ √ √ × √ ×
4 http://www.ac -psych.org/inde x.php?id=1 √ √ √ √ √ × × 5 http://www.ol dvictheatre.co m/whatson.ph p?id=63 √ √ √ √ √ × × 6 http://www.nu uo.com/produ ct.php?id=12 √ √ √ √ √ × × 7 http://www.co ppercraft.com/ product.php?p roduct=12 √ √ √ √ × √ × 8 http://www.lc oastpress.com/ journal.php?id =6 √ √ √ √ √ √ × 9 http://itsretha. com/_lookboo k-newcollection. php?id=144 √ √ √ √ √ × √ 10 http://puzzle-spot.co.cc/pro duk.tampilan. php?produkid =1 √ √ √ √ √ × √ 11 http://www.hp ol.org/transcri pt.php?id=72 √ √ √ √ √ × × 12 http://www.ru mahoutlet.co m/index.php? main_page=pr oduct_info&c Path=2_26&p roducts_id=31 28&zenid=76 765bfde63b75 9a892f901de0 732437 × × × × × √ × 13 http://www.gl odokshop.com /detail_katego × × × × × √ ×
ri.php?kat1= MTI 14 http://www.cit ra.net.id/servic e_detail.php?i d=12 × × × × × √ × Keterangan tabel :
√ SQLi Æ dapat dilakukan serangan SQL Injection pada web. × SQLi Æ tidak dapat dilakukan serangan SQL Injection pada web. √ Database Æ nama database pada web berhasil didapatkan. × Database Æ nama database pada web gagal didapatkan. √ Tabel Æ nama tabel pada web berhasil didapatkan. × Tabel Æ nama tabel pada web gagal didapatkan. √ Kolom Æ nama kolom pada web berhasil didapatkan. × Kolom Æ nama kolom pada web gagal didapatkan. √ Data Æ data pada web berhasil didapatkan.
× Data Æ data pada web gagal didapatkan.
√ Enkripsi Æ data password yang didapatkan terenkripsi. × Enkripsi Æ data password yang didapatkan tidak terenkripsi.
√ Administrator/Halaman Administrator Æ URL halaman administrator berhasil didapatkan.
× Administrator/Halaman Administrator Æ URL halaman administrator gagal didapatkan.
4.4.1.1 Keberhasilan Serangan
Pada berbagai web yang telah dilampirkan pada tabel diatas, terdapat 11 web yang berhasil dilakukan serangan SQL Injection. Namun
dari beberapa keberhasilan serangan tersebut, dapat dikelompokkan menjadi beberapa hasil keberhasilan serangan.
• web pertama, web kedua, web keempat, web kelima, web keenam dan web kesebelas :
SQL Injection dapat dilakukan, database, tabel, kolom dan data berhasil didapatkan. Selain itu data password tidak terenkripsi, tetapi halaman login administrator tidak didapatkan. Pada hasil seperti ini dapat disimpulkan bahwa pada penamaan database, tabel, kolom dan data menggunakan kata – kata yang sudah umum dan terdapat pada library Havij. Tetapi halaman login administrator tidak bisa didapatkan karena kemungkinan halaman login administrator sudah disembunyikan oleh pemilik web, menggunakan kata – kata yang tidak umum digunakan sebagai nama file halaman login administrator, atau halaman administrator dimasukkan ke dalam folder – folder tertentu dan menggunakan kata – kata yang tidak umum.
• web ketiga, dan web ketujuh :
SQL Injection dapat dilakukan, database, tabel dan kolom berhasil didapatkan. Namun datanya kosong dan halaman login administrator tidak didapatkan. Pada hasil seperti ini dapat disimpulkan bahwa pada penamaan database, tabel dan kolom menggunakan kata – kata yang sudah umum dan terdapat pada library Havij. Sedangkan datanya tidak bisa didapatkan karena kemungkinan isi database pada tabel tersebut datanya tidak ada atau datanya sudah
terenkripsi sehingga tidak bisa terbaca oleh library Havij. Selain itu halaman login administrator tidak bisa didapatkan karena kemungkinan halaman login administrator sudah disembunyikan oleh pemilik web, menggunakan kata – kata yang tidak umum digunakan sebagai nama file halaman login administrator, atau halaman administrator dimasukkan ke dalam folder – folder tertentu dan menggunakan kata – kata yang tidak umum.
• web kedelapan :
SQL Injection dapat dilakukan, database, tabel, kolom dan data berhasil didapatkan. Tetapi data password yang didapatkan sudah terenkripsi dan halaman login administrator tidak bisa didapatkan. Pada hasil seperti ini dapat disimpulkan bahwa pada penamaan database, tabel, kolom dan data menggunakan kata – kata yang sudah umum dan terdapat pada library Havij. Tetapi data password yang terdapat pada halaman web tersebut sudah dienkripsi menggunakan algoritma tertentu. Sedangkan halaman login administrator tidak bisa didapatkan karena kemungkinan halaman login administrator sudah disembunyikan oleh pemilik web, menggunakan kata – kata yang tidak umum digunakan sebagai nama file halaman login administrator, atau halaman administrator dimasukkan ke dalam folder – folder tertentu dan menggunakan kata – kata yang tidak umum.
• web kesembilan dan web kesepuluh :
SQL Injection dapat dilakukan, database, tabel, kolom, data dan halaman login administrator berhasil didapatkan. Pada hasil seperti ini dapat disimpulkan bahwa pada penamaan database, tabel, kolom, data dan penamaan file
pada halaman login administrator menggunakan kata – kata yang sudah umum dan terdapat pada library Havij.
4.4.1.2 Kegagalan Serangan
Pada berbagai web yang telah dilampirkan pada tabel diatas, terdapat 3 web yang gagal dilakukan serangan SQL Injection. Hasil evaluasi kegagalan serangan SQL Injection terdapat pada contoh web keduabelas, web ketigabelas dan web keempatbelas yang memiliki tipe kegagalan karena kemungkinan pada penamaan database, tabel, kolom, data dan halaman login administrator tidak menggunakan kata – kata yang umum dan tidak terdapat pada library Havij, atau URL pada web target tidak vulnerable karena setelah karakter = bukan angka yang langsung mengarah ke database web target tersebut.
4.4.2 Evaluasi Hasil Konfigurasi Pencegahan SQL Injection pada PHP