Tarun Koyalwar 19247ae74b
Path-Based Fuzzing SQL fix (#6400)
* setup claude

* migrate to using errkit

* fix unused imports + lint errors

* update settings.json

* fix url encoding issue

* fix lint error

* fix the path fuzzing component

* fix lint error
2025-08-25 13:36:58 +05:30

92 lines
2.5 KiB
Go

package fuzzplayground
import (
"fmt"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/require"
)
func TestSQLInjectionBehavior(t *testing.T) {
server := GetPlaygroundServer()
ts := httptest.NewServer(server)
defer ts.Close()
tests := []struct {
name string
path string
expectedStatus int
shouldContainAdmin bool
}{
{
name: "Normal request",
path: "/user/75/profile", // User 75 exists and has role 'user'
expectedStatus: 200,
shouldContainAdmin: false,
},
{
name: "SQL injection with OR 1=1",
path: "/user/75 OR 1=1/profile",
expectedStatus: 200, // Should work but might return first user (admin)
shouldContainAdmin: true, // Should return admin user data
},
{
name: "SQL injection with UNION",
path: "/user/1 UNION SELECT 1,'admin',30,'admin'/profile",
expectedStatus: 200,
shouldContainAdmin: true,
},
{
name: "Template payload test - OR True with 75",
path: "/user/75 OR True/profile", // What the template actually sends
expectedStatus: 200, // Actually works!
shouldContainAdmin: true, // Let's see if it returns admin
},
{
name: "Template payload test - OR True with 55 (non-existent)",
path: "/user/55 OR True/profile", // What the template should actually send
expectedStatus: 200, // Should work due to SQL injection
shouldContainAdmin: true, // Should return admin due to OR True
},
{
name: "Test original user 55 issue",
path: "/user/55/profile", // This should fail because user 55 doesn't exist
expectedStatus: 500,
shouldContainAdmin: false,
},
{
name: "Invalid ID - non-existent",
path: "/user/999/profile",
expectedStatus: 500, // Should error due to no such user
shouldContainAdmin: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
resp, err := http.Get(ts.URL + tt.path)
require.NoError(t, err)
defer func() {
if err := resp.Body.Close(); err != nil {
t.Logf("Failed to close response body: %v", err)
}
}()
require.Equal(t, tt.expectedStatus, resp.StatusCode)
body := make([]byte, 1024)
n, _ := resp.Body.Read(body)
bodyStr := string(body[:n])
fmt.Printf("Request: %s\n", tt.path)
fmt.Printf("Status: %d\n", resp.StatusCode)
fmt.Printf("Response: %s\n\n", bodyStr)
if tt.shouldContainAdmin {
require.Contains(t, bodyStr, "admin")
}
})
}
}