Web & Mobile Application Security case study

VulnBank Web, API, and Mobile Security Assessment

Assessed a banking training environment across web, API, and Android surfaces, documenting fifteen security issues with ordered proof and remediation guidance.

Skills demonstrated

  • Enumerated infrastructure, directories, technologies, and vulnerable client libraries.
  • Tested login controls, SQL injection, XSS, API versioning, rate limiting, and JWT integrity.
  • Reviewed mobile manifest settings, embedded credentials, Shared Preferences, transport security, signing, and hashing.
  • Mapped each validated issue to impact and remediation.

Tools used

  • Burp Suite
  • OWASP ZAP
  • Gobuster
  • DNSDumpster
  • MobSF
  • ADB
  • Genymotion
  • Kali Linux

Project detail

Findings Summary

Severities and remediations below were assigned retrospectively from the documented evidence using standard OWASP/CVSS-style judgment (Critical / High / Medium / Low). They were not part of the original lab write-up.

This assessment documents 15 distinct observations. The original objective cited fourteen issues; the table enumerates every validated item from the Steps (including the debug-certificate finding) without dropping any.

IDIssueOWASP categorySeverityFixEvidence
VB-01Vulnerable client library: DOMPurify 2.3.3OWASP A06:2021 Vulnerable and Outdated ComponentsMediumUpgrade DOMPurify to a patched release; track JS dependencies with SCA and block known-vulnerable versions in CI.Ref 3
VB-02Admin login brute-forced with Burp IntruderOWASP A07:2021 Identification and Authentication FailuresHighEnforce a strong password policy, rate limiting, lockout/MFA, and monitoring for repeated failures (see also Ref 7).Refs 6-7
VB-03SQL injection login bypass to the admin portalOWASP A03:2021 InjectionCriticalUse parameterized queries for authentication; never concatenate credentials into SQL; add WAF/input validation as defence in depth.Ref 8
VB-04/api/v3/forgot-password can be downgraded to v1, exposing the email OTPOWASP API9:2023 Improper Inventory ManagementHighRetire or harden old API versions; block version downgrade; never return OTPs in API responses.Refs 9-10
VB-05No rate limiting on the login endpointOWASP API4:2023 Unrestricted Resource ConsumptionHighApply per-IP and per-account rate limits, backoff, and anomaly detection on authentication endpoints.Refs 11-12
VB-06/register returns excessive debug and server informationOWASP API8:2023 Security MisconfigurationMediumReturn generic errors to clients; disable debug banners and server version leakage in production.Ref 13
VB-07API documentation exposed at /api/docs without authenticationOWASP API9:2023 Improper Inventory ManagementMediumRestrict Swagger/OpenAPI UIs to authenticated admin networks or remove them from production.Ref 14
VB-08JWT algorithm downgraded from HS256 to none with the signature removedOWASP API2:2023 Broken AuthenticationCriticalWhitelist algorithms; reject none; verify signatures with server-managed keys; prefer asymmetric JWT where feasible.Ref 15
VB-09Stored/reflected XSS in the /transfer description fieldOWASP A03:2021 InjectionHighContext-aware output encoding; sanitize rich text; set a strict Content-Security-Policy.Refs 16-17
VB-10Admin credentials hardcoded in the Android manifestOWASP Mobile M1:2024 Improper Credential UsageCriticalRemove secrets from the manifest and APK; use backend auth; rotate any exposed credentials.Ref 18
VB-11Debug endpoint /debug/users declared in the manifestOWASP Mobile M8:2024 Security MisconfigurationHighRemove debug components from release builds; gate with build flavours; require auth if retained in non-prod.Ref 19
VB-12Sensitive data stored in plaintext Shared PreferencesOWASP Mobile M9:2024 Insecure Data StorageHighUse EncryptedSharedPreferences / Keystore; store tokens not passwords; clear data on logout.Ref 20
VB-13Data transmitted over unencrypted HTTPOWASP Mobile M5:2024 Insecure CommunicationHighEnforce HTTPS (TLS 1.2+); enable network security config / certificate pinning where appropriate.Ref 21
VB-14App signed with a debug certificateOWASP Mobile M8:2024 Security MisconfigurationMediumSign release builds with a protected upload/app-signing key; disable debuggable; verify Play App Signing / CI signing.Ref 22
VB-15SHA-1 used for sensitive operations, enabling offline brute-forceOWASP Mobile M10:2024 Insufficient CryptographyMediumReplace SHA-1 with a modern password hash (e.g. Argon2/bcrypt/scrypt) or HMAC-SHA-256 for integrity use cases.Ref 23

Technical walkthrough

Lab evidence and investigation steps.

Open on GitHub
Ref 1: RECONNAISSANCE
Ref 1: RECONNAISSANCE
Ref 2: Using dns dumpster online tools I am able to map out the dns records of the domain http://www.vulnbank.org.
Ref 2: Using dns dumpster online tools I am able to map out the dns records of the domain http://www.vulnbank.org.
Ref 3: Using the zap proxy tool automated scanner, I found out that the application is using a vulnerable javascript library. DOMPurify version 2.3.3
Ref 3: Using the zap proxy tool automated scanner, I found out that the application is using a vulnerable javascript library. DOMPurify version 2.3.3
Ref 4: The application is using cloudflare and http3
Ref 4: The application is using cloudflare and http3
Ref 5: Using gobuster to enumerate the domain, I discovered 4 active directories with HTTP status code 200
Ref 5: Using gobuster to enumerate the domain, I discovered 4 active directories with HTTP status code 200
Ref 6: Using burpsuite intruder to bruteforce the login page, I am able to login as admin.
Ref 6: Using burpsuite intruder to bruteforce the login page, I am able to login as admin.
Ref 7: Recommendation is have a password policy that uses complex passwords to avoid brute force attacks
Ref 7: Recommendation is have a password policy that uses complex passwords to avoid brute force attacks
Ref 8: Using sql payload admin’ OR 1==1’ on the login page, I am able to gain access to admin portal
Ref 8: Using sql payload admin’ OR 1==1’ on the login page, I am able to gain access to admin portal
Ref 9: IMPROPER INVENTORY MANAGEMENT
Ref 9: IMPROPER INVENTORY MANAGEMENT
Ref 10: The api endpoint /api/v3/forgot-password can be downgraded to v1 exposing the OTP that is being sent to email
Ref 10: The api endpoint /api/v3/forgot-password can be downgraded to v1 exposing the OTP that is being sent to email
Ref 11: NO API RATE LIMITING
Ref 11: NO API RATE LIMITING
Ref 12: No api rate limiting on the login endpoint was implemented allowing me to bruteforce account using 15 password attempts
Ref 12: No api rate limiting on the login endpoint was implemented allowing me to bruteforce account using 15 password attempts
Ref 13: /register api endpoint reveals too much debug information including server information.
Ref 13: /register api endpoint reveals too much debug information including server information.
Ref 14: The api documentation is exposed via /api/docs endpoint with no authentication checks
Ref 14: The api documentation is exposed via /api/docs endpoint with no authentication checks
Ref 15: I downgraded the JWT token algorithm from hs256 to none and removed the signature.
Ref 15: I downgraded the JWT token algorithm from hs256 to none and removed the signature.
Ref 16: XSS INJECTION
Ref 16: XSS INJECTION
Ref 17: /transfer endpoint is vulnerable to xss. When xss payload is added to the description field the server responds with HTTP status code 200
Ref 17: /transfer endpoint is vulnerable to xss. When xss payload is added to the description field the server responds with HTTP status code 200
Ref 18: The admin credentials are hardcoded in the android manifest.
Ref 18: The admin credentials are hardcoded in the android manifest.
Ref 19: A debug endpoint (/debug/users) was declared in the application’s manifest file.
Ref 19: A debug endpoint (/debug/users) was declared in the application’s manifest file.
Ref 20: SharedPreferences is not a secure storage mechanism and should not be used to store sensitive data in plaintext.
Ref 20: SharedPreferences is not a secure storage mechanism and should not be used to store sensitive data in plaintext.
Ref 21: The application is transmitting data over unencrypted HTTP connections instead of HTTPS.
Ref 21: The application is transmitting data over unencrypted HTTP connections instead of HTTPS.
Ref 22: Using a debug certificate implies the following: Android debug keystore certificates are well-known and shared across developer machines; an APK signed with a debug cert is not a production-trusted signature and is often also built with android:debuggable enabled. That weakens integrity guarantees: an attacker who obtains or rebuilds the package can more easily repackage/tamper with the app, retain installability for testing sideloads, and abuse debugging hooks. Production releases must be signed with a protected release (or Play App Signing) key and shipped non-debuggable.
Ref 22: Using a debug certificate implies the following: Android debug keystore certificates are well-known and shared across developer machines; an APK signed with a debug cert is not a production-trusted signature and is often also built with `android:debuggable` enabled. That weakens integrity guarantees: an attacker who obtains or rebuilds the package can more easily repackage/tamper with the app, retain installability for testing sideloads, and abuse debugging hooks. Production releases must be signed with a protected release (or Play App Signing) key and shipped non-debuggable.
Ref 23: The application also uses an insecure hashing algorithm for sensitive operations, that is SHA-1. This exposes users to credential compromise through offline brute-force attacks.
Ref 23: The application also uses an insecure hashing algorithm for sensitive operations, that is SHA-1. This exposes users to credential compromise through offline brute-force attacks.