Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save aw-junaid/5f283453e58980b557665c4d710b45be to your computer and use it in GitHub Desktop.

Select an option

Save aw-junaid/5f283453e58980b557665c4d710b45be to your computer and use it in GitHub Desktop.
Web Application Security Testing Guide: Session Management, Authentication & Authorization

Web Application Security Testing Guide: Session Management, Authentication & Authorization


PART 1: SESSION MANAGEMENT

Overview

Session Management is the process by which a web application maintains state and identity for authenticated users across multiple HTTP requests. Since HTTP is stateless, sessions rely on tokens (cookies, URL parameters, or custom headers) to associate a user with their previous interactions.

Why Session Management Matters

Risk Impact
Weak session token generation Session prediction, hijacking
Insecure token transmission Man-in-the-middle (MITM) interception
Missing timeout controls Session reuse by attackers
Fixation vulnerabilities Attacker forces known session ID
Concurrent login flaws Account takeover without logout

Key Areas of Testing

  1. Token creation (randomness, entropy, uniqueness)
  2. Token storage (secure cookies, HttpOnly, Secure flags)
  3. Token transmission (HTTPS only, not in URLs)
  4. Token expiration (idle timeout, absolute timeout)
  5. Token binding (to IP, User-Agent, or other fingerprint)
  6. Logout functionality (server-side invalidation)
  7. Session fixation resistance

PART 2: AUTHENTICATION & AUTHORIZATION

2.1 Authentication

Definition: The process of verifying the identity of a user, device, or system. Common authentication factors include:

  • Something you know (password, PIN)
  • Something you have (phone, hardware token)
  • Something you are (biometrics: fingerprint, face)

2.1.1 Basic Server Configuration

Testing the fundamental web server settings that impact authentication security.

# Test Item Detailed Explanation Testing Method
1 default banner The server's default HTTP response header (e.g., Server: Apache/2.4.41 (Ubuntu)) or welcome page that may reveal software name and exact version numbers. Attackers use this to find version-specific exploits. Send HEAD / HTTP/1.1 or use curl -I https://target.com
2 options enabled Unnecessary or dangerous HTTP methods left enabled: PUT (upload files), DELETE (remove files), TRACE (XST attacks), CONNECT (proxy tunneling), OPTIONS (method enumeration). Use OPTIONS / HTTP/1.1 or nmap --script http-methods
3 default error pages Stock error pages (404 Not Found, 500 Internal Server Error, 403 Forbidden) that may disclose internal paths (e.g., /var/www/html/), database error snippets, or stack traces. Request non-existent pages, trigger SQL errors, cause 500 errors
4 manual & browser Combine manual testing (raw HTTP requests via netcat or telnet) with browser-based testing (Developer Tools → Network tab) to observe differences between client-side and server-side behavior. Browser DevTools + nc target.com 80

2.1.2 Analyze Request and Response from App

Inspecting the actual HTTP traffic between browser and server.

# Test Item Detailed Explanation Testing Method
5 manual Read raw HTTP requests and responses character-by-character. Look for hidden headers, unusual encoding, cache directives, and security headers missing. Use curl -v, nc, or Burp Repeater
6 browser Use browser Developer Tools (F12) → Network tab. Observe live requests, cookies set, redirect chains, and JavaScript-triggered requests. Chrome/Edge DevTools, Firefox Developer Tools
7 nct (NetCat) NetCat (nc) allows crafting raw TCP packets to bypass browser restrictions, test protocol edge cases, and send malformed requests that browsers won't allow. `echo -e "GET / HTTP/1.1\nHost: target.com\n\n"

2.1.3 Other Pages and Dirs on the Server

Discovering hidden or unlinked content on the web server.

# Test Item Detailed Explanation Testing Method
8 http-dir-enum HTTP directory enumeration technique using dot-dot-slash (../) traversal, tilde (~) for user directories, and common backup extensions (.bak, .old, .swp). Manually try GET /../../etc/passwd
9 burp Burp Suite Professional features: Content Discovery (passive + active), Engagement Tools → Discover Content, and Intruder for brute force directory lists. Burp Suite → Target → Site map → Engage → Discover content
10 zap OWASP ZAP features: Forced Browse (directory brute force), Spider (crawling), and AJAX Spider for JavaScript-heavy apps. ZAP → Quick Start → Automated Scan
11 dirbuster OWASP DirBuster (Java GUI tool) uses wordlists to brute force directories and files. Supports recursive brute force and multiple threads. DirBuster with directory-list-2.3-medium.txt
12 nikto Nikto web server scanner checks for over 6,700 potentially dangerous files/programs, outdated server versions, and misconfigurations. nikto -h https://target.com

2.1.4 Any Directory Listings Present

# Test Item Detailed Explanation Testing Method
13 manual Directory listing occurs when a web server shows a list of files in a directory instead of an index file (index.html, index.php). This exposes all files in that directory to anyone. Visit /images/, /backup/, /uploads/, /assets/, /files/ and look for file lists

Example of vulnerable response:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<body>
<h1>Index of /backup</h1>
<ul>
<li><a href="database.sql">database.sql</a></li>
<li><a href="config.old">config.old</a></li>
</ul>
</body>
</html>

2.1.5 Verbose Error Responses Enabled

# Test Item Detailed Explanation Testing Method
14 browser Verbose errors reveal full file paths, SQL queries, function names, line numbers, and even code snippets. Trigger errors by: empty fields, very long inputs, special characters, SQL syntax, malformed JSON/XML. Submit ' in search box, upload invalid file, manipulate URL parameters
15 burp Use Burp Repeater to systematically modify parameters and observe error differences. Burp Scanner automatically detects information disclosure via error messages. Burp Repeater → Send malformed requests → Compare error verbosity
16 zap ZAP's Fuzzer can send thousands of payloads and flag responses containing common error patterns (e.g., SQL syntax, Stack trace, Warning:, Fatal error). ZAP → Fuzz → Add payloads → View errors in "Fuzzer" tab

2.1.6 Default Admin Interface

# Test Item Detailed Explanation Testing Method
17 webextensions Browser extensions that detect or brute force admin panels: Admin Finder, FindAdmin, Wappalyzer (technology detection), Retire.js (vulnerable libraries). Install from Chrome/Firefox store → Navigate to target → Extension scans common paths

Common admin paths to test manually:

/admin, /administrator, /admin.php, /admin.asp, /admin/login, /wp-admin, /cpanel, /webmail, /plesk, /dashboard, /manage, /backend

2.1.7 Trace Method

# Test Item Detailed Explanation Testing Method
18 trace method HTTP TRACE method echoes back the exact request received by the server. Combined with XSS, this enables Cross-Site Tracing (XST) – stealing HttpOnly cookies that JavaScript cannot normally access. Modern browsers block TRACE, but internal tools or old APIs may still allow it. Send TRACE / HTTP/1.1 and check if response echoes your request headers

Test request:

TRACE / HTTP/1.1
Host: target.com
X-Custom-Header: test

Vulnerable response (echoes back the headers):

HTTP/1.1 200 OK
X-Custom-Header: test

2.1.8 Application

# Test Item Detailed Explanation Testing Method
19 application General application behavior analysis: How does the app handle state? Are session tokens regenerated after login? Does logout properly destroy sessions? Are there multiple authentication paths (SSO, OAuth, SAML)? Map all application workflows: login → browse → logout → back button

2.1.9 SSL Version

# Test Item Detailed Explanation Testing Method
20 SSL version Check which SSL/TLS protocol versions are supported. Deprecated/dangerous versions: SSLv2 (1995), SSLv3 (1996 – POODLE attack), TLS 1.0 (1999 – BEAST attack), TLS 1.1 (2006). Acceptable: TLS 1.2 (2008), TLS 1.3 (2018). openssl s_client -connect target.com:443 -ssl3, testssl.sh target.com, Qualys SSL Labs

2.1.10 Weak Ciphers

# Test Item Detailed Explanation Testing Method
21 Weak CipherS Cryptographic cipher suites that are known to be vulnerable: Export ciphers (40/56-bit keys – FREAK attack), NULL ciphers (no encryption), RC4 (biases), DES/3DES (Sweet32 attack), CBC mode (BEAST, Lucky13). nmap --script ssl-enum-ciphers -p 443 target.com, testssl.sh --wide target.com

2.1.11 Renegotiation Support

# Test Item Detailed Explanation Testing Method
22 Renegotiation Support TLS renegotiation allows client and server to re-establish cryptographic parameters within an existing connection. Insecure renegotiation (CVE-2009-3555) allows prefix injection attacks – attacker can prepend their own data to a legitimate user's request. testssl.sh --renegotiation target.com, openssl s_client -connect target.com:443 -reconnect

2.1.12 Vulnerable to BEAST

# Test Item Detailed Explanation Testing Method
23 Vulnerable to BEAST BEAST (Browser Exploit Against SSL/TLS) attack (2011) targets TLS 1.0 with CBC (Cipher Block Chaining) mode ciphers. Attacker can decrypt session cookies by injecting known plaintext and observing ciphertext changes. Mitigation: TLS 1.1+ or using RC4 (now also weak). testssl.sh --beast target.com, Qualys SSL Labs report

2.1.13 Expired Certificate

# Test Item Detailed Explanation Testing Method
24 expired certificate SSL/TLS certificate where the current date is after the notAfter field. Browsers show security warnings, but some applications (especially internal tools, IoT devices, or misconfigured APIs) may still accept expired certificates, allowing MITM attacks. `openssl s_client -connect target.com:443 2>/dev/null

2.1.14 Self-Signed Certificate

# Test Item Detailed Explanation Testing Method
25 self signed certificate Certificate signed by the organization itself, not by a trusted Certificate Authority (CA). Browsers show "Your connection is not private" warnings. Users who bypass the warning are vulnerable to man-in-the-middle attacks. Acceptable only for internal development/testing. Check certificate issuer: `openssl s_client -connect target.com:443

2.1.15 Wildcard Certificate

# Test Item Detailed Explanation Testing Method
26 wild card certificate Certificate that applies to all subdomains of a domain: *.example.com covers mail.example.com, admin.example.com, api.example.com, and even fake.example.com if DNS resolves. Risk: Compromise of one subdomain allows impersonation of all subdomains. Check Subject Alternative Name (SAN) field: `openssl s_client -connect target.com:443

2.1.16 SSLAudit

# Test Item Detailed Explanation Testing Method
27 SSLAudit Comprehensive SSL/TLS configuration audit covering protocol versions, cipher suites, certificate chain, key exchange parameters (DH/RSA), HSTS, OCSP stapling, and known vulnerabilities (Heartbleed, ROBOT, CRIME, BREACH, POODLE, Logjam, DROWN). testssl.sh target.com, sslyze target.com, nmap --script ssl-* -p 443 target.com, o-saft target.com

2.1.17 Refer Software Page

# Test Item Detailed Explanation Testing Method
28 Refer software page Check for explicit references to third-party software in page footers, copyright notices, comment tags, or meta generators. Examples: "Powered by WordPress", "© 2024 Magento", "Django 3.2", "ASP.NET Version:4.8". Each reference helps attacker narrow down exploits. View page source (Ctrl+U), check HTML comments, look for meta tags, check /wp-content/, /js/, /css/ paths

2.1.18 Target URL Placeholder

# Test Item Detailed Explanation Testing Method
29 https://www.example.com Placeholder representing the actual target application URL. Replace with the specific domain, subdomain, or IP address under test. Always test both http:// and https:// versions separately. https://actual-target.com, http://actual-target.com (if redirect behavior differs)

2.1.19 Server Fingerprinting

# Test Item Detailed Explanation Testing Method
30 server fingerprinting Identifying the exact web server software and version beyond what the Server header reveals. Uses: header order (Apache vs Nginx), default error page content, custom 404 pages, cookie naming conventions (PHPSESSID, JSESSIONID), default file extensions (.asp vs .php), and timing behavior. httprint -h target.com, whatweb target.com, curl -I target.com, observe default files (/wp-admin → WordPress)

2.1.20 Netcraft

# Test Item Detailed Explanation Testing Method
31 netcraft Netcraft (https://sitereport.netcraft.com) provides free detailed reports: web server uptime, hosting history, SSL certificate chain, DNS records, domain registrar, subdomains found, and technology changes over time. Extremely useful for historical reconnaissance. Visit https://sitereport.netcraft.com/?url=https://target.com

2.1.21 IP Address Leaks

# Test Item Detailed Explanation Testing Method
32 ip address leaks Real or internal IP addresses leaked in HTTP headers or responses. Common leak sources: X-Forwarded-For (original client IP), X-Real-IP, Via (proxy IP), True-Client-IP, CF-Connecting-IP (Cloudflare), error pages with [client 192.168.1.100], debug headers (X-Served-By, X-Backend). Collect all response headers, search for IP patterns (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}), check for private ranges (10.x.x.x, 172.16-31.x.x, 192.168.x.x)

2.1.22 Burp Headers

# Test Item Detailed Explanation Testing Method
33 burp_headers Using Burp Suite's HTTP history to systematically analyze all request and response headers. Look for missing security headers: Strict-Transport-Security (HSTS), Content-Security-Policy (CSP), X-Frame-Options (clickjacking), X-Content-Type-Options (MIME sniffing), Referrer-Policy. Also check for custom headers that may reveal internal systems. Burp → Proxy → HTTP History → Select any request → Inspector tab → Review all response headers

2.1.23 Is Proxy Present?

# Test Item Detailed Explanation Testing Method
34 is proxy present? Detect whether a reverse proxy (Cloudflare, Akamai, AWS CloudFront, Fastly, Nginx proxy) or forward proxy is sitting between tester and origin server. Detection methods: Different responses to IP vs domain, Via header, X-Cache header, mismatched SSL certificate (Cloudflare), specific error pages, cookie injection (__cfduid for Cloudflare). Affects caching, IP spoofing, header injection, and WAF bypass. Compare curl -I https://target.com vs curl -I https://target.com --resolve target.com:443:ORIGIN_IP, check for cf-* headers (Cloudflare), akamai-* headers

2.1.24 Manual

# Test Item Detailed Explanation Testing Method
35 manual Always perform manual verification of every automated finding. Automated tools produce false positives (e.g., reporting a vulnerability that doesn't exist) and false negatives (missing real issues). Manual testing provides context, business logic understanding, and confirmation of exploitability. For each automated finding, manually craft a proof-of-concept to confirm

2.1.25 Analyze robots.txt

# Test Item Detailed Explanation Testing Method
36 manual View /robots.txt directly in browser or via curl. This file tells search engines which paths to not crawl. However, attackers read it to find hidden or sensitive directories (/admin, /backup, /private, /dev). Many sites mistakenly block sensitive paths only via robots.txt, not via authentication. curl https://target.com/robots.txt
37 firebug plugin Firebug was a legacy Firefox developer tool (discontinued). Modern equivalent: Firefox Developer Tools (F12) → Network tab, or Chrome DevTools → Network tab. Use to observe requests for robots.txt and any dynamically generated disallow rules. Modern: Browser DevTools → Network → Reload → Filter for robots.txt

Example robots.txt revealing sensitive paths:

User-agent: *
Disallow: /admin
Disallow: /backup
Disallow: /private-notes
Disallow: /staging

2.1.26 Login Forms

# Test Item Detailed Explanation Testing Method
38 login forms Identify every login form on the application: primary login page, modal/dialog logins, iframe logins, single sign-on (SSO) redirects, OAuth login buttons, API login endpoints (/api/login, /auth/token), and administrative logins. Each form may have different validation, rate limiting, and vulnerability profile. Search HTML for <form action="...login...">, look for action pointing to login handlers, check JavaScript for dynamic login creation, spider the entire application

2.1.27 Registration Forms

# Test Item Detailed Explanation Testing Method
39 registration forms User registration forms that create new accounts. Test for: user enumeration (different responses for used vs available email), weak email validation (test@test passes), overposting (submitting extra parameters like role=admin), SQL injection in username/email fields, XSS in display name, and CAPTCHA bypass. Submit registration with existing email, try adding &role=admin to POST body, inject ' OR '1'='1 in username field

2.1.28 Password Recovery Forms

# Test Item Detailed Explanation Testing Method
40 password recovery forms "Forgot password" or "Reset password" forms – often the weakest part of authentication. Test for: user enumeration (existing vs non-existing user messages), email/SMS flooding (no rate limits), token predictability (sequential or timestamp-based), token leakage (in URL or Referer header), IDOR (changing user_id parameter), and host header injection (reset email sent to attacker-controlled domain). Submit recovery request, intercept token, check if token is base64-encoded username, check if token appears in logs/Referer

2.1.29 Oracle Padding

# Test Item Detailed Explanation Testing Method
41 Oracle Padding Padding oracle attack – decrypts ciphertext without knowing the key by feeding modified ciphertexts to the application and observing which inputs cause padding errors (like "Bad padding" vs "Invalid ciphertext"). Classic in ASP.NET (ScriptResource.axd, WebResource.axd), but also affects custom cryptography. Can lead to full session token decryption and arbitrary ciphertext manipulation. Use padbuster tool: padbuster https://target.com encrypted_token 8 -cookies auth=encrypted_token, or Burp extension "Padding Oracle"

2.1.30 Identify Technologies Used

# Test Item Detailed Explanation Testing Method
42 wappalyzer plugin Wappalyzer browser extension (Chrome/Firefox) detects over 1,500 technologies: frontend frameworks (React, Angular, Vue), backend languages (PHP, Python, Ruby, Node.js), CMS (WordPress, Drupal, Joomla), databases (MySQL, MongoDB), analytics, CDN, and JavaScript libraries. Provides instant fingerprinting without sending any traffic (uses browser-detected resources). Install Wappalyzer → Visit target → Click extension icon to see full technology list

2.1.31 Identify GETs

# Test Item Detailed Explanation Testing Method
43 Identify GETs Document every endpoint that uses the HTTP GET method. GET requests should be idempotent (no side effects) and should never contain sensitive data (passwords, session tokens, credit cards) in the URL because URLs are logged (browser history, server logs, proxy logs, Referer headers). GET parameters are also visible in browser address bar. Burp → Target → Site map → Filter by method = GET, export to CSV, review each endpoint

2.1.32 Identify POSTs

# Test Item Detailed Explanation Testing Method
44 Identify POSTs Document every endpoint that uses the HTTP POST method. POST is used for state-changing operations (login, registration, password change, payment, data submission) and can send parameters in the request body (not visible in URL). However, POST bodies can still be intercepted and modified. Burp → Target → Site map → Filter by method = POST, review each endpoint and its parameters

2.1.33 Identify Parameters in GETs and POSTs

# Test Item Detailed Explanation Testing Method
45 Identify parameters in GETs and POSTs Extract and document every parameter name used in both GET (URL query string) and POST (body: application/x-www-form-urlencoded, multipart/form-data, or application/json). Build a parameter inventory for fuzzing. Common parameter names: id, user, username, email, password, role, action, cmd, page, file, path, return, next, redirect, token, csrf, price, quantity. Burp → Target → Site map → Right-click → Engagement tools → Find parameters, or manually review each request in HTTP History

2.1.34 Check If Actual Objects, SessionIDs Are Passed in GET Requests

# Test Item Detailed Explanation Testing Method
46 Check if actual objects, sessionIDs are passed in GET requests Critical security flaw: Session IDs in URLs (e.g., https://target.com/profile?PHPSESSID=abc123 or ?sessionid=xyz789). This exposes the session token in: browser history (any user on same machine), server access logs, proxy logs, Referer headers (when clicking external links), and shared links. Also check for database record IDs (?order_id=1001, ?invoice=2024001) that may be enumerable. Look for ?id=, ?sid=, ?PHPSESSID=, ?JSESSIONID=, ?session=, ?token=, ?order=, ?invoice= in address bar during normal browsing

2.1.35 Replace the Methods and Headers

# Test Item Detailed Explanation Testing Method
47 Replace the methods and headers Modify HTTP methods and headers to bypass access controls or trigger unexpected behavior. Method swapping: Change GET to POST, POST to GET, GET to PUT, POST to DELETE. Header manipulation: Change Referer, User-Agent, Origin, X-Requested-With, Content-Type, X-Forwarded-For, Host. Some applications only validate certain methods or headers client-side. Burp Repeater → Change method line → Send. Change Referer: https://target.com to Referer: https://evil.com. Change User-Agent to curl/7.68.0 to mimic bot.

2.1.36 Check If the Application Accepts the Request

# Test Item Detailed Explanation Testing Method
48 check if the application accepts the request After modifying methods or headers, observe the server's response. Acceptance indicators: 200 OK, 302 Found (redirect), 201 Created, or any non-error status. Rejection indicators: 405 Method Not Allowed (method blocked), 403 Forbidden (authorization failed), 400 Bad Request (malformed), 500 Internal Server Error (unexpected). If method swapping works (e.g., a POST endpoint accepts GET), that's a vulnerability. After each modification in Burp Repeater, compare response status and body with original request

2.1.37 Search Boxes

# Test Item Detailed Explanation Testing Method
49 Search boxes Search input fields are high-risk for injection attacks because they interact with databases (SQL, NoSQL), search engines (Elasticsearch, Solr), and file systems. Test for: SQL injection (' OR '1'='1), NoSQL injection ({'$ne': ''}), XSS (<script>alert(1)</script>), XXE (if XML search payloads), command injection (; ls -la), and path traversal (../../etc/passwd). Enter each payload type, observe errors, response time differences, and output reflection

2.1.38 Login Fields

# Test Item Detailed Explanation Testing Method
50 login fields Username and password input fields. Test for: SQL injection (authentication bypass: admin' -- as username, any password), NoSQL injection ({'$ne': null} as JSON in login), user enumeration (different error messages for existing vs non-existing users), brute force (no rate limiting), password field autocomplete (saved passwords in browser), and password field length limits (truncation). For SQLi bypass: username: admin' -- password: anything. For enumeration: compare response for admin vs nonexistentuser123.

2.1.39 Register Fields

# Test Item Detailed Explanation Testing Method
51 register fields Registration form inputs: username, email, password, confirm password, and sometimes additional fields (full name, phone, address). Test for: overposting (add &role=admin to POST body), weak email validation (test@test passes), username injection (admin already exists → enumeration), password mismatch bypass (send password=pass1&confirm_password=pass1 but manipulate), XSS in display name (saved XSS), SQL injection in any field. Burp Repeater → Add extra parameter &is_admin=1. Try registering " onmouseover=alert(1) x=" as username.

2.1.40 Payment Processing

# Test Item Detailed Explanation Testing Method
52 payment processing Payment forms (credit card number, expiration, CVV, billing address, amount, quantity). Test for: price/quantity manipulation (change amount=0.01, quantity=-1, price=0), IDOR (change order_id=123 to 124 to see another user's order), insecure redirects after payment (return_url=https://evil.com), lack of CSRF protection (attacker can charge victim's card), discount code abuse (reuse codes, negative discounts), integer overflow (very large quantity → integer overflow to low total). Modify amount parameter in Burp before final submission. Try negative quantity. Change order_id in confirmation page URL.

2.1.41 Client-Side Validation

# Test Item Detailed Explanation Testing Method
53 client-side validation Validation performed only in JavaScript (browser) with no server-side equivalent. Examples: Max length on input fields, email format check, required field check, password complexity rules. How to bypass: Intercept request with Burp, disable JavaScript in browser (Settings → Disable JavaScript), or directly send raw request with modified parameters bypassing all client-side checks. Client-side validation is for user experience only – never for security. Burp Proxy → Intercept request → Modify maxlength attribute or submit longer value. Browser → Settings → Disable JavaScript → Submit form.

2.1.42 Identify Critical Components and Possible Ways They Can Be Subverted

# Test Item Detailed Explanation Testing Method
54 identify critical components Pinpoint high-value targets within the application: admin panels, user profile pages, password reset functions, payment gateways, file uploaders, API endpoints (especially /api/admin, /api/internal), user impersonation features, database backup endpoints, and configuration pages.
55 possible ways they can be subverted For each critical component, identify attack vectors: IDOR (change user ID), SQL injection (retrieve all data), XSS (steal admin session), CSRF (perform actions as logged-in user), path traversal (read arbitrary files), insecure deserialization (RCE), SSRF (access internal networks), privilege escalation (change role=admin parameter), forced browsing (access hidden functions). Map each component to OWASP Top 10 attack categories. For each attack type, try a basic payload and observe behavior.

2.1.43 Identify Hidden Fields and Their Purpose

# Test Item Detailed Explanation Testing Method
56 identify hidden fields Find all <input type="hidden"> fields in HTML forms. These are invisible to users but submitted with the form. Attackers can see and modify them using browser dev tools or Burp.
57 their purpose Determine what each hidden field controls. Common purposes: user role (<input type="hidden" name="role" value="user">), user ID (<input type="hidden" name="user_id" value="1001">), product price (<input type="hidden" name="price" value="49.99">), CSRF token (<input type="hidden" name="csrf_token" value="random">), redirect URL (<input type="hidden" name="return_url" value="/profile">), session state, or discount code. View page source (Ctrl+U), search for type="hidden". For each, modify value in Burp and observe effect (e.g., change role=user to role=admin).

2.1.44 Pass Through

# Test Item Detailed Explanation Testing Method
58 pass through Check if hidden fields are echoed back in responses without server-side validation. If the server simply passes through whatever value was submitted, it indicates lack of integrity checking. Example: hidden field product_id=100 is submitted as product_id=200, and the server processes 200 without verifying it's a valid product ID or that the user owns it. Change hidden field value in Burp to an unexpected value (e.g., another user's ID, negative price, or a string). Submit. Check if server accepts and reflects the changed value in the response.

2.1.45 User Enumeration

# Test Item Detailed Explanation Testing Method
59 user enumeration Ability to determine whether a specific username, email, or user ID exists in the system. Common leakage points: Login form ("Invalid password" vs "User not found"), registration form ("Email already registered"), password recovery ("Reset email sent" vs "No account found"), password reset token endpoint (different status codes), API responses (different JSON fields), response time differences (existing user takes longer because it hashes password). Submit a list of known (admin, root, test) and random (randomstring123) usernames. Compare response messages, status codes, response times, and response lengths.

2.1.46 Guessing Username

# Test Item Detailed Explanation Testing Method
60 guessing username Attempt to discover valid usernames by trying common default or predictable usernames. Common lists: admin, root, administrator, test, user, guest, support, helpdesk, backup, sysadmin, webmaster, postmaster, info, sales, marketing, ceo, hr, it, dev, api, service, automation, batch. Also try email patterns: firstname@company.com, first.last@company.com. Burp Intruder → Payload list of common usernames → Observe differences in response (message, length, status code, time).

2.1.47 Password Length

# Test Item Detailed Explanation Testing Method
61 length Determine minimum and maximum password length. Minimum too short (e.g., 4 characters) allows easy brute force. Maximum too short (e.g., 8 characters) limits entropy. Maximum too long (e.g., 255 characters) may cause denial of service or hash truncation issues. No maximum could lead to buffer overflow or denial of service. Also check if password is truncated silently (e.g., first 20 characters only). Try passwords of varying lengths: 1 char, 2, 4, 8, 12, 16, 20, 32, 64, 128, 255, 256, 512, 1024. Observe if rejected or accepted. Check if password=12345678 and password=12345678extra both work (truncation).

2.1.48 Password Complexity

# Test Item Detailed Explanation Testing Method
62 complexity Rules for password character types: uppercase letters (A-Z), lowercase letters (a-z), digits (0-9), special characters (!@#$%^&*). Too strict (must have all 4 types, exactly 8-12 chars) reduces usable password space. Too weak (only lowercase letters allowed) is easily brute forced. Common bad rule: requires alternating character types (predictable). Also check if password cannot contain username or dictionary words. Try password, Password, Password1, Password1!, Password123!, P@ssw0rd. Observe which are accepted. Document exact requirements.

2.1.49 Password Expiration

# Test Item Detailed Explanation Testing Method
63 expiration Passwords expire after a set number of days (e.g., 30, 60, 90, 180 days). After expiration, user is forced to change password on next login. No expiration means compromised passwords remain valid indefinitely. Too short expiration (e.g., 7 days) frustrates users and may lead to weak passwords written down. Too long expiration (e.g., 365 days) leaves old passwords vulnerable. Check account after known period. Look for password age in account settings. Read documentation. Force password change by manipulating date in client (some apps check client-side).

2.1.50 Password History

# Test Item Detailed Explanation Testing Method
64 history Number of previous passwords remembered and prevented from reuse. No history allows user to rotate between same 2 passwords. Good practice: remembers last 5-10 passwords. Overly strict: remembers all passwords ever used (prevents legitimate password cycling). After password change, try to change back to old password immediately. Try to cycle through multiple old passwords. Keep changing password and see when old password becomes allowed again.

2.1.51 Default Passwords

# Test Item Detailed Explanation Testing Method
65 default passwords Factory or vendor default credentials left unchanged. Common defaults: admin/admin, admin/password, root/toor, root/root, user/user, administrator/administrator, test/test, guest/guest, admin/123456, admin/password123. Also check for default credentials in documentation of any third-party software used (WordPress: admin/password, Tomcat: admin/admin, Jenkins: admin/admin, router: admin/admin). Try all common default credential pairs. Check /default.html, /readme.html, /docs/ for default credential documentation. Search "default credentials [software name]".

2.1.52 Recovery Process

# Test Item Detailed Explanation Testing Method
66 recovery process Complete end-to-end analysis of the password recovery workflow: Step 1 → User requests reset (provides username/email). Step 2 → Verification (CAPTCHA, security questions, email link). Step 3 → Token generation (format, randomness, expiration). Step 4 → Token delivery (email, SMS). Step 5 → Token validation (server-side). Step 6 → New password form. Step 7 → Confirmation and login. Document each step. Intercept and analyze every request/response. Look for logic flaws at each boundary.

2.1.53 Forgot Password Methodology

# Test Item Detailed Explanation Testing Method
67 forgot password methodology Specific implementation of password recovery. Security questions (mother's maiden name, pet's name – often guessable or discoverable via social media) – weak. Email link (common, secure if token is random and one-time). SMS code (vulnerable to SIM swapping, SS7 attacks). Backup codes (good if stored securely). In-app notification (requires another authenticated device). In-person verification (most secure but impractical). Identify which method is used. For security questions, test if answers can be guessed from public data. For email/SMS, test token predictability and expiration.

2.1.54 Is Password Sent in Clear Text or Not

# Test Item Detailed Explanation Testing Method
68 is password sent in clear text or not Cleartext transmission: Password visible in HTTP request body or URL. Happens when using HTTP (not HTTPS), or HTTPS with misconfigured redirect (HTTP → HTTPS but initial request is cleartext), or password sent in URL query string even over HTTPS (still logged in browser history and server logs). Encrypted transmission: HTTPS with valid TLS, password in POST body (not URL), and no logging of plaintext. Use Burp Proxy to inspect login request. Check if password= parameter value is readable. Check browser address bar for ?password=. Check for mixed content (HTTP resources on HTTPS page).

2.1.55 How Is Password Sent – Email or Reset URL

# Test Item Detailed Explanation Testing Method
69 email or reset url Sending password via email (e.g., "Your password is: MyPassword123") – extremely insecure. Email is not encrypted by default, stored on multiple servers, and password is exposed in plaintext. Sending reset URL (e.g., "Click here to reset: https://target.com/reset?token=abc123") – more secure, but token must be random, single-use, and expire quickly. Trigger password recovery. Check if email contains your existing password (bad) or a reset link (better). If reset link, check if token is predictable (timestamp, base64 of username).

2.1.56 Is It Generated by the App

# Test Item Detailed Explanation Testing Method
70 is it generated by the app Server-generated temporary passwords – application creates a new random password and sends it to user. More secure because user cannot choose a weak password, but user must change it immediately. User-chosen – reset process allows user to directly set new password. Generally fine but must ensure token security. Trigger recovery. If you receive a new password (like kL9#mQ2!), it's generated. If you receive a link to set your own password, it's user-chosen.

2.1.57 How Is It Sent to the User? Email or Temporary Link

# Test Item Detailed Explanation Testing Method
71 email or temporary link Email – most common, but email is not a secure channel. Attacker with access to email account can compromise password. Temporary link – user clicks link to reset page. Link should expire after first use or within a short time (e.g., 15 minutes). SMS – mobile number, but SIM swapping risk. In-app – requires access to already logged-in device (high security). Document delivery method. For temporary link, attempt to use it twice. Wait 24 hours and try again. Check if link contains user identifier that can be changed (?user=admin).

2.1.58 Are Users Forced to Change It on First Login

# Test Item Detailed Explanation Testing Method
72 forced change on first login After password reset or initial account creation, does the system require immediate password change? Critical security control – ensures that temporary passwords (emailed or generated) cannot be used indefinitely. Without forced change, anyone who intercepts the reset email can access the account forever. Reset password. Log in with the temporary password or reset link. Check if you are immediately redirected to a "change password" page. Try to access other pages before changing password (should be blocked).

2.1.59 Is the App Allowing Use of Multiple Times

# Test Item Detailed Explanation Testing Method
73 multiple times Can the same password reset token or temporary password be used more than once? Single-use – after first use, token is invalidated. Multiple-use – token remains valid indefinitely or for a fixed time regardless of prior use. Multiple-use tokens are serious flaws: attacker who captures token once can access account repeatedly, and legitimate user using token does not invalidate attacker's copy. Use reset token to reset password. Logout. Try to use same token again. Try to use same temporary password again. If either works → multiple-use flaw.

2.1.60 Based on Username

# Test Item Detailed Explanation Testing Method
74 based on username Password recovery process tied directly to username (e.g., /reset?username=admin or recovery form asks only for username, not email). Risks: User enumeration (you can test if username exists), token parameter manipulation (change username=admin to username=user2 after receiving token), and forced browsing (try all usernames). Check recovery URL for ?user=, ?username=, ?login=. Try changing username to other values and see if you receive reset for that user.

2.1.61 Blacklist Present

# Test Item Detailed Explanation Testing Method
75 blacklist present Username blacklist – prevents registration of certain usernames (admin, root, administrator, support). Password blacklist – prevents use of common weak passwords (password, 123456, qwerty, admin). Good security control, but must be comprehensive (at least top 10,000 passwords). Try to register admin, root, administrator. Try to set password password, 123456, qwerty, admin123. Check if rejected.

2.1.62 Need for Multifactor Authentication

# Test Item Detailed Explanation Testing Method
76 need for multifactor authentication Does the application require, support, or optionally allow MFA/2FA? Types: SMS (weak – SIM swapping), TOTP (Google Authenticator, Authy – better), WebAuthn/U2F (hardware key – best), email code (weak), backup codes (good as fallback). MFA significantly reduces account takeover risk even if password is compromised. Check security settings for "Two-factor authentication", "2FA", "Multifactor", "Authenticator app", "Security key". Attempt to log in without MFA if it's optional. Test bypass methods (OAuth login without MFA, API endpoints that skip MFA, "remember this device" that never re-prompts).

2.1.63 Old Password Required to Change

# Test Item Detailed Explanation Testing Method
77 old password required to change When changing password, does the application ask for the current password? Yes – prevents session hijacker or unauthorized user from changing password without knowing current password. No – anyone with access to an authenticated session (even temporary) can lock out the legitimate user by changing password. Go to "Change Password" function. Try to submit new password without entering old password. Try with incorrect old password. If either succeeds → vulnerability.

2.1.64 Need for Multifactor Authentication (repeated in original)

# Test Item Detailed Explanation Testing Method
78 need for multifactor authentication Repeated emphasis – check MFA implementation flaws: MFA bypass via parameter (?mfa_required=false or 2fa=skip), MFA not enforced on all login paths (API, OAuth, social login, admin interfaces), MFA recovery codes stored insecurely, MFA enrollment without verifying ownership, MFA codes too long expiration (e.g., 10 minutes), MFA rate limiting missing (brute force 6-digit code). Attempt to access API endpoints directly after primary login but before MFA. Check for URL parameters controlling MFA. Try 1000 random MFA codes quickly.

2.1.65 Need for Multifactor Authentication (repeated again)

# Test Item Detailed Explanation Testing Method
79 need for multifactor authentication Third repetition – also test MFA fallback mechanisms: backup codes (are they single-use? can they be regenerated without old ones?), SMS fallback (can attacker change phone number without verification?), email fallback (can attacker access email?). Also test MFA reset process – does it require identity verification or can an attacker disable MFA? Request MFA reset. See what verification is required. Try to disable MFA through account settings without providing current MFA code.

2.1.66 Lockout

# Test Item Detailed Explanation Testing Method
80 lockout Account lockout after a number of failed login attempts (e.g., 5 failures → lock for 15 minutes). Prevents brute force attacks. Must be balanced against denial of service (attacker can lock all users). Attempt login with wrong password repeatedly. Count attempts until lockout. Note lockout duration. Test if lockout resets on successful login or after time. Test if lockout is per-IP or per-account.

2.1.67 Permanent

# Test Item Detailed Explanation Testing Method
81 permanent Permanent lockout (requires administrator to manually unlock account). High security but high DoS risk – attacker can lock out every user permanently by repeatedly failing login. Only acceptable for very low-volume, high-security internal systems. Trigger lockout. Wait 24 hours. Try to log in again. If still locked, lockout is permanent. Check if there's a self-service unlock (email verification) – that's not permanent.

2.1.68 High Risk of DOS

# Test Item Detailed Explanation Testing Method
82 high risk of DOS Denial of Service via account lockouts. Attacker can systematically try wrong passwords for every known username (from user enumeration) and lock every account. Mitigations: CAPTCHA before counting failures, increasing delays (not lockout), per-IP rate limiting, lockout only after many failures (e.g., 20 attempts), short lockout duration (e.g., 5 minutes), or no lockout at all (use rate limiting instead). Attempt to lock a known user account. Try to lock 10 different accounts. Assess business impact.

2.1.69 CAPTCHA Present?

# Test Item Detailed Explanation Testing Method
83 capcha present? CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) on login, registration, password recovery, or payment forms. Prevents automated brute force, credential stuffing, and account creation attacks. Weak CAPTCHAs: simple math (2+3=?), text CAPTCHAs with OCR bypass, CAPTCHAs that don't change, CAPTCHAs with known bypass. Strong CAPTCHAs: reCAPTCHA v3 (invisible), hCaptcha. Check for CAPTCHA image or checkbox. Try to submit form without solving CAPTCHA (send same request with CAPTCHA parameter missing). Try to reuse old CAPTCHA token. Solve CAPTCHA manually to confirm it works.

2.1.70 Forget Password / Password Recovery Forms

# Test Item Detailed Explanation Testing Method
84 forget password / password recovery forms Specific focus on recovery forms – often the weakest link. Specific tests: (1) User enumeration – existing vs non-existing user messages. (2) Rate limiting – can you request 100 resets in 1 minute? (3) Token in URL – leaks via Referer. (4) Token predictability – base64, timestamp, MD5(username). (5) IDOR – change user parameter to reset another user's password. (6) Host header injection – recovery email sent to attacker's server. (7) SQL injection in email/username field. (8) No CAPTCHA – automated flooding. Burp Intruder on recovery form with 100 requests. Check token format. Change user=admin to user=victim. Set Host: attacker.com and see where recovery link points.

2.1.71 Prevent Automation

# Test Item Detailed Explanation Testing Method
85 prevent automation Mechanisms to block automated attacks (brute force, credential stuffing, account creation). Controls: Rate limiting (per IP, per account, per session), CAPTCHA, request signing (HMAC), behavior analysis (mouse movements, typing patterns), IP blacklisting, delayed responses (exponential backoff), token bucket algorithm, JavaScript challenge (Proof-of-Work). Attempt 100 login attempts in 10 seconds. Attempt from different IPs (VPN, proxy rotation). Check if delays increase after failures. Check if JavaScript execution is required (headless browser detection).

2.1.72 Password Remembered?

# Test Item Detailed Explanation Testing Method
86 password remembered? "Remember me" or "Keep me logged in" or "Stay signed in" functionality – creates a persistent session cookie (long expiration, usually days or weeks). Security risks: Cookie stored on disk (not just memory), vulnerable to theft via malware or physical access. Best practice: Cookie should be cryptographically strong, tied to browser fingerprint, invalidated on logout, and not allow high-risk actions (password change, payment) without re-authentication. Check Remember me box. Login. Close browser completely. Reopen browser and visit site. Are you still logged in? Check cookie expiration date (should be future). Logout. Check if persistent cookie is deleted. Try to reuse saved cookie from another computer.

2.1.73 Login After Registration or Activation Required?

# Test Item Detailed Explanation Testing Method
87 login after registration or activation required? Email activation required – user receives email with activation link, must click before first login. Prevents bots from creating accounts (if email verification is required) and confirms email ownership. Immediate login – user can log in immediately after registration without email verification. Allows fake/bot accounts but better user experience. Register new account. Immediately try to log in. If successful → no activation required. If blocked with "Please verify your email" → activation required. Check if activation link can be used multiple times. Check if activation link reveals user ID.

2.1.74 Manual

# Test Item Detailed Explanation Testing Method
88 manual Final reminder: manual verification of every automated finding. Tools produce false positives. Manual testing provides business logic understanding, context, and confirmation of exploitability. Always produce a manual proof-of-concept for each claimed vulnerability. For each automated finding, reproduce the vulnerability manually and document step-by-step instructions.

2.1.75 Concurrent Logins Enabled

# Test Item Detailed Explanation Testing Method
89 concurrent logins enabled Can the same user account be logged in simultaneously from multiple browsers, devices, or locations? Enabled (default) – user can be logged in on phone and laptop simultaneously. Disabled – new login invalidates old session. Disabled reduces session hijacking risk (attacker cannot stay logged in after user logs in) but frustrates users. Log in from Browser A. Log in from Browser B (different device or private window). Check if Browser A session remains active. Perform actions in both browsers. If both work → concurrent logins enabled. If Browser A is logged out → concurrent logins disabled (session invalidation on new login).

2.2 Authorization

Definition: The process of determining what an authenticated user is allowed to do (permissions, roles, access levels). Authorization happens after authentication.

2.2.1 Horizontal Privileges Checking

# Test Item Detailed Explanation Testing Method
90 horizontal privileges checking Testing if a user can access resources belonging to another user at the same privilege level. Example: User A (role: standard user) tries to access User B's profile, orders, messages, or files. This is Horizontal Privilege Escalation or Insecure Direct Object Reference (IDOR). For each resource endpoint (profile, order, document, message, setting), change the identifier (user_id=1001 to 1002, order_id=ABC to ABD) and observe if you can access another user's data.

2.2.2 Check If the Users Cannot Access Content of Another

# Test Item Detailed Explanation Testing Method
91 check if the users cannot access content of another Positive verification that horizontal access controls are working correctly. For each attempted IDOR, the expected result is 403 Forbidden, 401 Unauthorized, 404 Not Found, or a redirect to home page – NOT returning the other user's data. For each IDOR attempt, document the response. If you receive another user's data → vulnerability. If you receive error → access control working.

2.2.3 Manual, Cookie Manipulation, Burp

# Test Item Detailed Explanation Testing Method
92 manual Manually edit identifiers in URL (e.g., change https://target.com/profile?id=1 to id=2) and in POST parameters (modify hidden fields).
93 cookie manipulation Edit cookies that contain user identifiers (e.g., user_id=123, account=456). Use browser dev tools (Application → Cookies) or Burp to modify cookie values.
94 burp Use Burp Suite: Repeater to manually change IDs and resend. Intruder to brute force ID range (e.g., from 1 to 10000). Comparer to compare responses for different IDs. Macro to automate login and IDOR attack sequence. Burp Repeater → Change id=1 to id=2 → Send. Burp Intruder → Positions around ID → Payload = Numbers 1-1000 → Attack → Review response lengths for differences.

2.2.4 Vertical Privilege Levels

# Test Item Detailed Explanation Testing Method
95 vertical privilege levels Testing if a low-privilege user (standard user, guest, unauthenticated) can access high-privilege functions (admin panel, user management, system configuration, audit logs). This is Vertical Privilege Escalation. Identify admin-only endpoints (/admin, /manage, /config, /users, /audit, /backup). Access them with a standard user session. Try to submit admin forms (user creation, role change) as standard user.

2.2.5 Check If the Access of Scripts from History

# Test Item Detailed Explanation Testing Method
96 check if the access of scripts from history After logout or privilege downgrade, can you access previously visited admin URLs from browser history? This tests if the application re-validates authorization on every request or only at login. Steps: 1) Log in as admin, visit /admin/users. 2) Logout. 3) Open browser history and click the same /admin/users link. 4) Also try copy-pasting URL in new private window. If you can see the page → session not properly invalidated or authorization not rechecked. Logout completely. Close browser (to clear memory session). Reopen browser, type admin URL directly. Also try after session timeout. Use browser's "Reopen closed tab" feature.

2.2.6 Manual

# Test Item Detailed Explanation Testing Method
97 manual Manually test vertical privilege escalation by: (1) Discovering hidden admin links in page source or JavaScript. (2) Trying common admin paths (/admin, /administrator, /moderator). (3) Modifying role parameters (role=userrole=admin). (4) Accessing API endpoints (/api/users, /api/admin/config). (5) Forced browsing to backup directories (/backup.zip, /old/). For each discovered admin resource, attempt to access as standard user. Record response.

2.2.7 Manual, Burp

# Test Item Detailed Explanation Testing Method
98 manual, burp Advanced vertical testing with Burp: (1) Capture admin request as admin user. (2) Log in as standard user. (3) Send same request in Burp Repeater (replay). (4) Observe if server accepts. (5) Modify request parameters (e.g., add isAdmin=true). (6) Use Burp Session Handling rules to automate switching between user roles while replaying same requests. Burp Repeater → Paste admin request → Modify session cookie to standard user's cookie → Send. If response shows admin content → vertical escalation.

PART 3: REPEATED "MANUAL" ENTRIES (Original Image Artifacts)

The original image ends with multiple sequential "manual" entries and a truncated "manu". These represent individual manual test cases – each is a separate verification step. In professional testing, these correspond to:

Repeated Entry Implied Test Case
manual Verify directory listing manually
manual Verify verbose error manually
manual Verify default admin interface manually
manual Verify trace method manually
manual Verify SSL configuration manually
manual Verify weak ciphers manually
manual Verify certificate validity manually
manual Verify server fingerprinting manually
manual Verify robots.txt manually
manual Verify login forms manually
manual Verify registration forms manually
manual Verify password recovery forms manually
manual Verify Oracle Padding manually
manual Verify GET/POST parameters manually
manual Verify hidden fields manually
manual Verify user enumeration manually
manual Verify lockout manually
manual Verify CAPTCHA manually
manual Verify concurrent logins manually
manual Verify horizontal privileges manually
manual Verify vertical privileges manually
(truncated "manu") Incomplete – likely "manual" again

Principle: Every automated finding must be manually validated. Automated tools are scanners; manual testers are analysts.


APPENDIX: QUICK REFERENCE TABLE

Category Subcategory Key Test Items
Session Management Token Security Generation, transmission, expiration, binding
Authentication Server Config Banners, methods, error pages, dir listings
SSL/TLS Versions, ciphers, certs, BEAST, renegotiation
Request Analysis GET/POST, parameters, hidden fields
Password Policy Length, complexity, history, expiration, defaults
Password Recovery Methodology, token security, multiple-use, forced change
Lockout & MFA Lockout policy, DoS risk, CAPTCHA, MFA implementation
User Enumeration Username guessing, response differences
Authorization Horizontal Same role, different user (IDOR)
Vertical Different role (user → admin)
Manual Testing Validation Every automated finding manually confirmed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment