Pengenalan XSS (Cross Site Scripting)
XSS adalah salah satu security issue yang biasa terjadi ketika membuat web. XSS biasanya terdapat celah keamanan dimana orang bisa secara sengaja memasukkan parameter yang mengandung script atau Javascript agar bisa di render oleh halaman website. Tujuan dari XSS ini adalah untuk mencuri cookie browser pengguna yang sedang mengakses website dan bisa menyebabkan akun pengguna bisa diambil alih jika kita sebagai pemilik website tidak menanganinya dengan baik.
Berbeda dengan pemrograman seperti PHP, Golang menariknya sudah mengatasi masalah XSS ini secara otomatis. Golang template memiliki fitur Auto Escape sendiri dimana bisa mendeteksi data yang perlu ditampilkan di template dan jika mengandung tag-tag html atau script akan secara otomats di escape. Fungsi tersebut bisa dilihat disini
- https://github.com/golang/go/blob/master/src/html/template/escape.go
- https://pkg.go.dev/text/template#HTMLEscape
Cara Mengimplementasikan XSS
Baiklah kita coba mengimplementasikan bagaimana XSS Golang bekerja dengan mencoba buat file terlebih dahulu bernama file post.html
di folder templates/
dan isi file tersebut dengan kode dibawah ini.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ .Title }}</title>
</head>
<body>
<h1>{{ .Title }}</h1>
{{ .Body }}
</body>
</html>
Lalu kita buat handler untuk Auto Escape Golang Web seperti kode dibawah ini.
func TemplateAutoEscapeHandler(w http.ResponseWriter, r *http.Request) {
myTemplates.ExecuteTemplate(w, "post.html", map[string]interface{}{
"Title": "Golang Tutorial Santekno Auto Escape",
"Body": "Selamat Belajar Golang Auto Escape Santekno",
})
}
Setelah itu jangan lupa untuk ditambahkan fungsi handler tersebut pada router
pada file main.go
.
mux.HandleFunc("/template-auto-escape", TemplateAutoEscapeHandler)
Dan sekarang build
, run
jalankan program dan buka browser maka akan muncul langsung tampilan sesuai pada program yang telah kita buat.
go build && ./learn-golang-web
Dan akan terlihat seperti dibawah ini.
Lalu kita coba inject script atau tag-tag html pada handler. Apakah akan tampil dan dirender sebagai teks biasa ataukah akan dirender sebagai tag dan script yang bisa dibaca oleh browser. Kita ubah kode kita seperti ini.
func TemplateAutoEscapeHandler(w http.ResponseWriter, r *http.Request) {
myTemplates.ExecuteTemplate(w, "post.html", map[string]interface{}{
"Title": "Golang Tutorial Santekno Auto Escape",
"Body": "<p>Selamat Belajar Golang Auto Escape Santekno<script>alert('Halo Anda ke hack')</script></p>",
})
}
Maka apa yang akan terjadi? Lihat saja tampilan dibawah ini {{ internal-img “web xss injected tags html and script” “tutorial-golang-web-xss-inject-tags.png” >}}
Apakah bisa mematikan Auto Escape?
Secara default memang akan otomatis berjalan, tetapi kita bisa mematikan fitur ini namun perlu kita ketahui bahwa tempate secara eksplisit bisa menambahkan template date menggunakan html dengan cara menggunakan template.HTML
untuk data HTML dan template.CSS
untuk data CSS dan template.JS
digunakan untuk data javascript.
Kita akan coba melakukan disable Auto Escape tersebut dengan membuat fungsi handler baru seperti dibawah ini.
func TemplateDisabledAutoEscapeHandler(w http.ResponseWriter, r *http.Request) {
myTemplates.ExecuteTemplate(w, "post.html", map[string]interface{}{
"Title": "Golang Tutorial Santekno Auto Escape",
"Body": template.HTML("<p>Selamat Belajar Golang Auto Escape Santekno<script>alert('Halo Anda ke hack')</script></p>"),
})
}
Lalu tambahkan handler pada mux router seperti dibawah ini.
mux.HandleFunc("/template-disable-auto-escape", TemplateDisabledAutoEscapeHandler)
Lanjut kita jalankan maka akan terbaca tags HTML yang dikirim tersebut pada browser seperti ini.
Dan akan ke render HTML seperti ini.
Masalah XSS (Cross Site Scripting)
Jika kita mematikan fitur auto escape ini, bisa dipastikan masalah XSS akan mengintai website kita maka pastikan dengan benar-benar percara bahwa sumber data yang kita matikan auto escape tersebut aman dari orang jahat yang ingin merusak website kita.
Contohnya misalkan kita menerima params dari luar lalu kita langsung saja menganggap itu adalah HTML maka akan berbahaya seperti kode dibawah ini.
func TemplateXSSAttackHandler(w http.ResponseWriter, r *http.Request) {
myTemplates.ExecuteTemplate(w, "post.html", map[string]interface{}{
"Title": "Golang Tutorial Santekno Auto Escape",
"Body": template.HTML(r.URL.Query().Get("body")),
})
}
Lalu tambahkan handler tersebut di dalam mux
.
mux.HandleFunc("/template-xss-attack", TemplateXSSAttackHandler)
Jalankan program dan akses website kita seperti dibawah ini
localhost:8080/template-xss-attack?body=<script>alert('selamat anda ke hack')</script>
Maka akan tampil pada browser seperti ini. Ini membuktikan bahwa website kita tidak aman karena website kita bisa di inject oleh javascript dengan mudah. Maka berhati-hatilah ketika kita mematikan Auto Escape tersebut.