Menghalangi serangan pada aplikasi berbasis web merupakan sebuah PR yang sangat panjang. Di tulisan ini saya akan mencoretkan beberapa langkah awal melakukan pertahanan terhadap serangan-serangan yang "biasa" terjadi. Penghalang ini diterapkan di sisi Infrastruktur.
Latar belakang
Pada dasarnya hampir semua serangan pada aplikasi berbasis web menggunakan HTTP Request, sehingga hal pertama yang bisa dilakukan adalah melakukan filtering terhadap request yang diterima applikasi tersebut.
Filtering terhadap request yang masuk tersebut, disebut WAF (Web Application Firewall).
Sudah banyak berbagai penyedia WAF ternama seperti Imperva, Cloudflare, hingga untuk skala bisnis lebih besar seperti Akamai.
Untuk saat ini Cloudflare merupakan penyedia WAF yang memberikan layanannya secara cuma-cuma kepada para penggunanya. Hanya cukup menggunakan NS milik Cloudflare, pengguna sudah bisa mengaktifkan WAF secara Gratis.
Masalah
Bypass Cloudflare
Ketika pengguna mengaktifkan WAF dari cloudflare, maka semua request yang masuk ke domain tersebut akan diarahkan menuju reverse proxy milik Cloudflare yang sudah diberikan filtering untuk menyaring semua request yang masuk. Namun apabila seseorang menemukan IP dibalik dari WAF tersebut. Maka dia bisa leluasa melakukan pointing langsung dari /etc/hosts
miliknya pribadi untuk melakukan bypass terhadap WAF cloudflare.
Pendekatan Untuk Dilakukan
Pada dasarnya tidak ada tolak ukur yang pasti untuk mengukur sebuah sistem "Aman", namun seperti kata Voltaire "Perfect is the enemy of good".
Penggambaran di bawah dapat digunakan juga dalam hal Security Design. Tolak ukur untuk melakukan hardening yang "secure" mutlak selamanya adalah tak terhingga.
Tujuan kita ada di titik "Something" agar mengurangi point of attack hingga seminim mungkin. Untuk mencapai itu ada beberapa pendekatan yang dapat dilakukan.
1. Jangan Pernah Mematikan WAF
Jangan mematikan WAF dari penyedia seperti Cloudflare. Dikarenakan dapat meng-ekspose alamat IP origin server dibalik WAF tersebut, dan tersimpan selamanya di record list seperti Security Trails, dnsdumpster.
2. Aktifkan ModSecurity & OWASP ModSecurity CRS (Ingress Nginx)
Mengaktifkan ModSecurity Pada Ingress
- ConfigMaps
apiVersion: v1
data:
allow-snippet-annotations: "true"
enable-modsecurity: "true"
enable-owasp-modsecurity-crs: "true"
kind: ConfigMap
metadata:
name: ingress-nginx-controller
- Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: bwapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/modsecurity-snippet: |
SecRuleEngine On
Perbandingan ketika mengaktifkan ModSecurity tersebut.
Untuk melakukan testing terhadap efisiensi dari ModSecurity di sini saya melakukan spawning bwapp. Full deployment dapat dilihat di https://github.com/nicolasjulian/bwapp-k8s
- Melakukan serangan terhadap paramter rentan title, berjalan dengan sangat mudah.
- Melakukan serangan terhadap paramter rentan title, dengan metode yang sama. Namun tidak berhasil seperti sebelumnya.
Dapat juga terlihat ada 249 request yang mendapatkan balikan 403 (Forbidden) dapat dipastikan penghalang yang dipasang bekerja dengan baik.
- Penampakan logs yang masuk ke ingress ketika aplikasi web tersebut mendapat percobaan serangan SQL Injection. Semua request yang dianggap abusive diblok oleh ModSecurity.
Percobaan Bypass ModSecurity dengan Tampering SQLMAP
Saya mencari berbagai bypass yang untuk filtering dari ModSecurity tersebut, salah satunya yang saya coba seperti gambar di bawah. Namun metode tersebut tidak berhasil.
python3 sqlmap.py -u "https://bwapp.staging.nicolas.my.id/sqli_1.php?title=aa&action=search" --cookie='PHPSESSID=kt0q1vf9dfdushriq9kdd5vj23; security_level=0' --tables --level 5 --random-agent --batch
Secara garis besar kita sudah berada pada titik lebih baik daripada sebelumnya. SQL Injection tidak bisa dilakukan dengan sangat mudah.
ModSecurity only is not enough to protect your website You need to fix the BUG.
3. Ketahui Aset Kita Yang Terekspos
Lakukan aset discovery terhadap infrastruktur kita sendiri. Dengan melakukan subdomain enumeration menggunakan simple tools seperti Amass, Subfinder, knockpy, atau gunakan Security Trails.
Lakukan pencarian sensitif informasi seperti environment variable, password, ip address. Menggunakan tools seperti Truffle Hog.
Jika kita menemukan sesuatu yang semestinya tidak ter-ekspose ke publik, maka sebaiknya segera kita lakukan mitigasi pada temuan tersebut.
4. (Cloudflare as Front Liner) Hanya Izinkan Subnet Cloudflare
Salah satu pencegahan yang mudah dilakukan untuk menghindari bypass cloudflare adalah, dengan mengizinkan hanya subnet cloudflare saja yang boleh mengakses port dari service kita. Informasi tersebut dapat ditemukan di https://www.cloudflare.com/ips. Hal ini seharusnya dapat dilakukan juga pada sistem WAF yang lain.
Referensi
-
NGINX Tutorial: Protect Kubernetes Apps from SQL Injection - NGINX https://www.nginx.com/blog/microservices-march-protect-kubernetes-apps-from-sql-injection/
-
ModSecurity with ingress-nginx https://containerinfra.com/blog/cloud/2021-07-30-using-nginx-ingress-waf/
-
OWASP ModSecurity Core Rule Set | OWASP Foundation https://owasp.org/www-project-modsecurity-core-rule-set/
-
How To Use ModSecurity and OWASP CRS For Web App Firewall (WAF) To Secure Your Website https://blog.runcloud.io/modsecurity-firewall/#what-is-owasp-crs
-
Annotations - NGINX Ingress Controller https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#modsecurity
-
https://github.com/sqlmapproject/sqlmap/issues/4529 [CRITICAL] WAF/IPS identified as ‘’modsecurity (Trustwave)’ · Issue #4529 · sqlmapproject/sqlmap