The Open Web Application Security Project publishes a list of the most common, most damaging web-app vulnerabilities. It's not exhaustive, but if your app doesn't handle these ten well, the rest doesn't matter.
← Back to SecurityThe category that's #1 for a reason — present in nearly every breach. Users acting on resources they shouldn't be allowed to touch.
Deep dives: Broken Access Control → · Authorization →
Sensitive data exposed because crypto was missing, broken, or applied wrong.
Use vetted libraries; HTTPS everywhere; argon2id/bcrypt for passwords; rotate keys; use a secret manager.
Untrusted input interpreted as code or commands. SQL injection, NoSQL injection, OS command injection, LDAP, XPath, ORM injection — same shape, different sink.
execFile) over exec with a constructed string.Deep dive: Injection →
Vulnerabilities baked into the design itself — no amount of careful coding fixes them. The category that says "we should have caught this on the whiteboard."
Antidote: threat-model new features. Ask "what could go wrong?" before "how do I build it?"
Boring, common, cheap to fix, often catastrophic.
Access-Control-Allow-Origin: * with credentials.Deep dive: Security Misconfiguration →
Most modern apps are 80%+ third-party code. When a dependency has a CVE, you have it too.
Deep dive: Vulnerable Dependencies →
Anything that lets an attacker become someone else.
Deep dives: Authentication → · Broken Authentication → · MFA →
Trusting code or data without verifying it hasn't been tampered with.
Sign artifacts (Sigstore, in-toto), pin by digest, verify before deploy. Deep dive: Insecure Deserialization →
If you can't see an attack, you can't stop it. Average breach dwell time is measured in months — usually because nobody was looking.
Your server makes an HTTP request to a URL the attacker controls — often reaching internal services that aren't exposed to the internet.
169.254.169.254) — credential theft on AWS/GCP/Azure.file:// schemes reading local files.Defenses: scheme allow-list (http/https only); resolve hostnames and reject private/loopback/link-local IPs after resolution; outbound egress proxy with an allow-list; per-endpoint timeouts and size limits.