Xss Cross Site Scripting in Gorilla Mux
How XSS Cross Site Scripting Manifests in Gorilla Mux
Cross-site scripting vulnerabilities in Gorilla Mux applications typically arise from improper handling of user input in HTTP responses. Gorilla Mux itself doesn't introduce XSS vulnerabilities—it's a router that passes requests to your handlers. However, the way you handle and render request data in your handlers creates the attack surface.
Common XSS patterns in Gorilla Mux applications include:
- Echoed XSS: Directly reflecting user input in HTML responses without escaping. For example, an endpoint that returns query parameters in the response body.
- Stored XSS: Saving user input to a database and later rendering it in HTML without proper sanitization.
- DOM-based XSS: Client-side JavaScript that dynamically injects user-controlled data into the page.
Here's a vulnerable Gorilla Mux handler that demonstrates reflected XSS:
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func vulnerableHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
// DANGEROUS: Directly echoing user input without escaping
fmt.Fprintf(w, "<h1>Hello, %s!</h1>", name)
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/greet", vulnerableHandler)
http.ListenAndServe(":8080", r)
}
This code is vulnerable because if an attacker passes ?name=<script>alert('XSS')</script>, the script will execute in the victim's browser. The issue isn't with Gorilla Mux's routing—it's with how the handler processes and outputs the data.
Another common pattern involves template rendering with user input:
func templateHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
// DANGEROUS if not using template's auto-escaping
template.Must(template.New("greeting").Parse(
"<h1>Hello, {{.Name}}!</h1>"
)).Execute(w, map[string]string{"Name": name})
}
While Go's html/template package provides auto-escaping by default, developers sometimes disable it or use text/template for HTML content, creating XSS vulnerabilities.
Gorilla Mux-Specific Detection
Detecting XSS vulnerabilities in Gorilla Mux applications requires both static analysis and dynamic scanning. For static analysis, look for patterns where user input flows to HTTP responses without proper escaping.
Dynamic scanning with middleBrick can identify XSS vulnerabilities by:
- Testing endpoints with XSS payloads and monitoring for reflected content
- Checking for missing Content Security Policy headers
- Verifying proper HTTP response headers like X-XSS-Protection and X-Content-Type-Options
Here's how to scan a Gorilla Mux application with middleBrick:
# Install middleBrick CLI
npm install -g @middlebrick/cli
# Scan your API endpoint
scan result:
middlebrick scan http://localhost:8080/greet?name=test
# Or scan with specific options
middlebrick scan http://localhost:8080 \
--method GET \
--headers "Content-Type: application/json" \
--timeout 30s
middleBrick tests for XSS by injecting payloads like:
?name=<script>alert(document.cookie)</script>
?name=<img src=x onerror=alert(1)>
?name=%22%3E%3Cscript%3Ealert(1)%3C/script%3E
The scanner checks if these payloads appear in the response body, headers, or JavaScript context. It also verifies that the application has appropriate security headers configured.
For comprehensive coverage, middleBrick's LLM/AI security checks can detect if your API endpoints serve AI-generated content that might contain or be vulnerable to XSS, particularly important if you're using models that generate HTML or JavaScript.
Gorilla Mux-Specific Remediation
Fixing XSS vulnerabilities in Gorilla Mux applications involves proper input handling and output encoding. Here are specific remediation patterns:
1. Use html/template package with auto-escaping:
func safeTemplateHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
// Safe: auto-escaping built into html/template
template.Must(template.New("greeting").Parse(
"<h1>Hello, {{.Name}}!</h1>"
)).Execute(w, map[string]string{"Name": name})
}
2. Manual HTML escaping with template.HTMLEscapeString:
func safeEchoHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
// Safe: manual escaping
escapedName := template.HTMLEscapeString(name)
fmt.Fprintf(w, "<h1>Hello, %s!</h1>", escapedName)
}
3. Content Security Policy headers:
func securityHeadersMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// CSP prevents inline scripts and unauthorized script sources
w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'self'")
w.Header().Set("X-XSS-Protection", "1; mode=block")
w.Header().Set("X-Content-Type-Options", "nosniff")
next.ServeHTTP(w, r)
})
}
func main() {
r := mux.NewRouter()
r.Use(securityHeadersMiddleware) // Apply security headers to all routes
r.HandleFunc("/greet", safeEchoHandler)
http.ListenAndServe(":8080", r)
}
4. Input validation and sanitization:
import "regexp"
var safeNamePattern = regexp.MustCompile(`^[a-zA-Z0-9\s\.\-_]+$`)
func validateInput(name string) (string, error) {
if !safeNamePattern.MatchString(name) {
return "", fmt.Errorf("invalid characters in name")
}
return name, nil
}
func validatedHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Query().Get("name")
if validatedName, err := validateInput(name); err != nil {
http.Error(w, "Invalid input", http.StatusBadRequest)
return
}
escapedName := template.HTMLEscapeString(validatedName)
fmt.Fprintf(w, "<h1>Hello, %s!</h1>", escapedName)
}
For production applications, integrate middleBrick's continuous scanning into your CI/CD pipeline to catch XSS regressions before deployment:
# GitHub Action workflow
- name: Run middleBrick Security Scan
uses: middlebrick/action@v1
with:
target: http://staging.example.com
fail-on-severity: high
token: ${{ secrets.MIDDLEBRICK_TOKEN }}
This ensures XSS vulnerabilities are caught early, with middleBrick providing specific remediation guidance for each finding.
Related CWEs: inputValidation
| CWE ID | Name | Severity |
|---|---|---|
| CWE-20 | Improper Input Validation | HIGH |
| CWE-22 | Path Traversal | HIGH |
| CWE-74 | Injection | CRITICAL |
| CWE-77 | Command Injection | CRITICAL |
| CWE-78 | OS Command Injection | CRITICAL |
| CWE-79 | Cross-site Scripting (XSS) | HIGH |
| CWE-89 | SQL Injection | CRITICAL |
| CWE-90 | LDAP Injection | HIGH |
| CWE-91 | XML Injection | HIGH |
| CWE-94 | Code Injection | CRITICAL |