Melanjutkan dari posting sebelumnya tentang tutorial melakukan serangan SQL injection pada website (lih. di bagian SQL injection), pada kesempatan kali ini saya ingin memposting sebuah jawaban dari pertanyaan dari seorang pembaca: “lantas, bagaimana cara mencegah SQL injection pada aplikasi tersebut?” Hehehe pada kesempatan kali ini saya akan membongkar sedikit code PHP dari aplikasi vulnerable tersebut dan melakukan patch agar web app tsb tidak vulnerable lagi terhadap SQL injection.
Daann.. tahukah anda? (halah) kalau patch yang diperlukan agar web app tsb tidak lagi vulnerable terhadap SQL injection cukup dengan menambahkan 1 baris code saja?
Pieces of code sebelum vs sesudah di patch:
Hanya dengan menambahkan fungsi mysql_real_escape_string terhadap input dari variable ‘$email’, sudah dapat menyelamatkan aplikasi dari bug critical SQL injection. DiĀ postingan sebelumnya sudah saya perlihatkan dampaknya, yaitu:
- Dapat melihat struktur dan isi database
- Mengacak-acak database web aplikasi
- Mengakses shell server
- Hingga kehilangan data tentu saja…
Proof of concept, sebelum dilakukan patch ‘menambah 1 baris code’ tsb:
hacker@hackerhost:~$ sqlmap.py -u "https://www.sitarget.com/websitenet/searchguestbook.php" --data="email=1" -D websitenet -T users -C username,password --dump Database: websitenet Table: users [2 entries] +-----------+----------------------------------+ | username | password | +-----------+----------------------------------+ | admin | 57e8da43c1e3be6c3b5a75a549600a14 | | webmaster | cda2c99fbf5e19f20d331299c15a4491 | +-----------+----------------------------------+
Proof of concept, setelah dilakukan patch ‘menambah 1 baris code’ tsb:
hacker@hackerhost:~$ sqlmap.py -u "https://www.sitarget.com/websitenet/searchguestbook.php" --data="email=1" -D websitenet -T users -C username,password --dump [13:43:14] [WARNING] POST parameter 'email' is not injectable [13:43:14] [CRITICAL] all tested parameters appear to be not injectable. Try to increase '--level'/'--risk' values to perform more tests. Also, you can try to rerun by providing either a valid value for option '--string' (or '--regexp') If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could retry with an option '--tamper' (e.g. '--tamper=space2comment') [*] shutting down at 13:43:14
Baiklah, sampailah kita pada akhir dari postingan ini hahaha..
Hikmah dari bug semacam ini: “jika membuat aplikasi yang menerima input dari user, filter lah semua inputan dari user!”
Itu adalah pengamanan pertama yang bisa dilakukan developer-developer website, pengamanan selanjutnya bisa saja dengan membeli Web Application Firewall untuk mengamankan website dari serangan-serangan sejenis dan atau lainnya
Artikel yang bermanfaat, makasi tutorialnya.
Dapat ilmu lagi ?