Top Web Application Vulnerabilities in SaaS Platforms: What to Test and Fix First
Hien Nguyen · 9 min
Hien Nguyen · 9 min
SaaS web applications tend to exhibit a recurring set of vulnerabilities: broken access control, injection, weak authentication, and misconfiguration. This article summarises what shows up most often in assessments and how to prioritise testing and remediation for engineering and security teams.
The items below align with OWASP Top 10 and common findings in SaaS: authentication and session handling, authorization and access control, input handling and injection, and configuration. The focus is on practical impact and fix order, not a full taxonomy.
Users can access or modify other users’ or tenants’ resources by changing IDs (e.g. in URLs or request bodies). In multi-tenant SaaS this can mean cross-tenant data exposure or privilege abuse.
What to test: For each object-type endpoint (e.g. document, order, account), try substituting another user’s or tenant’s ID. Test with different roles (e.g. normal user, admin) and verify the server enforces ownership or tenant scope.
What to fix: Enforce authorization on every request server-side; check resource ownership or tenant context before returning or updating data; avoid relying on client-supplied identifiers alone.
Sensitive or admin-only actions are reachable without proper role or permission checks. Examples: user admin endpoints, internal APIs, or debug endpoints exposed to the internet.
What to test: Enumerate admin and internal endpoints (e.g. from docs, client code, or common paths); call them with a low-privilege or unauthenticated user and check responses.
What to fix: Authorise by role or permission at the application layer for every sensitive action; separate admin and internal routes; remove or protect debug endpoints in production.
Unsanitised user input is used in database queries or in APIs that build queries. Attackers can read, modify, or delete data, or sometimes execute commands.
What to test: Inject common payloads (quotes, comment sequences, boolean conditions) into every parameter and body field that might reach the database. Test both normal and error paths.
What to fix: Use parameterised queries or prepared statements; avoid building queries from string concatenation; apply strict input validation and output encoding.
User-controlled input is reflected in responses without encoding, allowing script execution in the victim’s browser. Stored XSS persists in the app; reflected XSS is triggered via a link or request.
What to test: Submit script payloads in inputs that are reflected in HTML (including error messages, search results, and profile fields). Test both reflected and stored cases.
What to fix: Encode output according to context (HTML, attribute, JavaScript, URL); use a CSP (Content-Security-Policy); avoid innerHTML and similar with unsanitised data.
User input is passed to shell commands, eval, or template engines. Can lead to remote code execution on the server or client.
What to test: Identify parameters that might be used in system calls or templates (e.g. file names, webhook URLs, template variables); try command or template escape sequences.
What to fix: Avoid passing user input to shell or eval; use safe APIs and allowlists; sandbox or restrict template data and operations.
Weak password policies, no MFA for sensitive roles, predictable or long-lived session tokens, and sessions not invalidated on logout or password change increase account takeover risk.
What to test: Assess password policy and MFA coverage; test session fixation, token reuse after logout, and whether tokens are exposed in URLs or client-side storage.
What to fix: Enforce MFA for admin and sensitive accounts; use short-lived tokens and secure refresh; invalidate sessions on logout and password change; store tokens securely (e.g. httpOnly cookies).
Reset links that are guessable, long-lived, or not single-use can allow account takeover. Same for recovery flows that rely on weak questions or email-only verification.
What to test: Request resets for test accounts; reuse tokens, change identifiers in the link, and check expiry and one-time use.
What to fix: Use single-use, short-lived tokens; tie tokens to the request (e.g. hash of email + secret); rate-limit reset requests.
APIs or pages return more data than needed (e.g. internal IDs, PII), or error messages expose stack traces, query fragments, or paths. This aids reconnaissance and sometimes enables further attacks.
What to test: Review API responses and error messages for unnecessary data; trigger error conditions and check what is returned.
What to fix: Shape responses per role and use case; use generic error messages in production; avoid leaking internal structure in errors or headers.
Data in transit or at rest is not encrypted, or weak algorithms or keys are used. TLS misconfiguration (e.g. old protocols, weak ciphers) is common.
What to test: Check TLS configuration (protocols, ciphers, certificate); verify sensitive data is not sent over plain HTTP; confirm storage encryption for sensitive data.
What to fix: Enforce TLS 1.2+ and strong ciphers; use HSTS and secure cookies; encrypt sensitive data at rest and manage keys properly.
Default credentials, debug or admin interfaces exposed, verbose errors, and unnecessary features (e.g. sample apps, default accounts) increase attack surface.
What to test: Check for default logins, open debug endpoints, and unnecessary HTTP methods or headers.
What to fix: Change all defaults; disable debug and sample content in production; restrict admin and debug access by network and authentication.
Missing or weak security headers (e.g. CSP, X-Frame-Options, X-Content-Type-Options) and permissive CORS allow clickjacking, MIME sniffing, or cross-origin abuse.
What to test: Inspect response headers and CORS policy; try cross-origin requests from a different domain.
What to fix: Set security headers consistently; configure CORS with an allowlist of origins and methods; avoid * in production.
A practical order for many SaaS teams:
Internal testing and automated scanning are useful but often miss business-logic and authorization issues. A manual Web Application Penetration Testing engagement focuses on real attack paths and delivers findings with severity, steps to reproduce, and remediation guidance. For API-specific risks, see API Security Testing. For report format and deliverables, see Reports.
If my articles, case studies, or security resources helped you, you can support my work. Your support helps me maintain free content and keep publishing practical security guides.
If you prefer a traditional bank transfer, request IBAN and bank details via the contact form
Support is optional. For consulting or security work, please use the Services or Contact pages.