Blog

OWASP Top 10 Explained: The Most Critical Web Application Security Risks

The OWASP Top 10 (2025) explained — every category, a concrete example, and how to prevent and detect it across your SDLC with SAST, SCA and DAST.

Bruno Baldo·Jun 3, 2024·Updated Sep 1, 2026·13 min read·Reviewed by Bruno Baldo
OWASP: Open Web Application Security Project

If you work anywhere near application security, you have heard of the OWASP Top 10. It is quoted in board decks, written into compliance requirements, and referenced in almost every security questionnaire a software company will ever receive. For all that visibility, it is also frequently misunderstood — treated as a certification to pass rather than what it actually is: a shared vocabulary for the most critical web application security risks teams face today.

This guide walks through the OWASP Top 10:2025 in order, one category at a time. For each, we cover what it means, a concrete example of how it goes wrong, and how to prevent or detect it. Then we look at how to fold these risks into your software development lifecycle so they get caught early — not after an incident. The goal is practical: by the end, you should be able to explain each risk to an engineer or a stakeholder and know where it fits in your testing strategy.

What is OWASP?

OWASP — the Open Worldwide Application Security Project — is a nonprofit foundation dedicated to improving software security. It is community-driven and vendor-neutral, which is a large part of why its guidance carries weight: the materials are produced by practitioners, freely available, and not tied to any commercial product.

OWASP publishes a wide range of resources — testing guides, cheat sheets, secure coding references, and tooling — but its best-known output by far is the OWASP Top 10. First released in 2003 and periodically updated, the Top 10 is a consensus document that ranks the most significant web application security risks based on industry data, combined with a community survey to catch emerging threats that raw data alone might miss. When someone says a product "covers the OWASP Top 10," they mean it addresses these ten broad categories of risk.

One important nuance: each entry is a category, not a single vulnerability. "Injection," for example, spans SQL injection, command injection, and several other flavors. That structure is deliberate — it keeps the list stable and conceptual rather than a moving target of specific CVEs.

The OWASP Top 10:2025

Below are the ten categories from the OWASP Top 10:2025, in their official order. The ranking reflects a blend of how often each weakness appears, how exploitable it tends to be, and the potential business impact. One note before we start: the OWASP Top 10 is revised periodically as the way we build and attack software changes, and the categories below reflect the 2025 release — the current edition, and the update to the older 2021 list.

A01:2025 — Broken Access Control

Access control enforces what an authenticated user is allowed to do. When those checks are missing, incomplete, or enforced only in the UI, users can reach data and actions that should be off-limits. This category holds the top spot again in 2025 because authorization logic is deceptively hard to get right across every endpoint.

Example: An API returns an order by ID at /api/orders/1043. A user changes the ID to 1044 and sees someone else's order — a classic insecure direct object reference (IDOR). The server authenticated the user but never checked whether this user owns that order.

How to prevent and detect it: Deny by default, and enforce access decisions server-side on every request rather than trusting the client. Centralize authorization logic instead of scattering ad-hoc checks. Write tests that attempt cross-account access, and use runtime testing to probe endpoints with manipulated identifiers and roles. Log access-control failures so repeated attempts are visible.

A02:2025 — Security Misconfiguration

Misconfiguration covers insecure default settings, verbose error messages, unnecessary features left enabled, open cloud storage, and missing hardening. It climbed to number two in 2025, reflecting how much of modern risk now lives in configuration rather than code — as stacks grow more complex, with containers, orchestration, and managed services, the surface area for a wrong setting grows with them.

Example: A cloud storage bucket is left publicly readable, or an application ships with a default admin account and password still active, or a stack trace exposes internal paths and library versions to end users. A permissive fetch configuration can even open the door to server-side request forgery (SSRF), where an application is coerced into calling an internal metadata endpoint.

How to prevent and detect it: Harden systematically, remove unused components and features, and apply the same secure baseline across every environment so staging matches production. Automate configuration checks in your pipeline and scan running environments. Dynamic testing is well suited to catching exposed error messages, default pages, and permissive headers at runtime.

A03:2025 — Software Supply Chain Failures

In 2025, the category previously known as "Vulnerable and Outdated Components" was broadened and renamed to Software Supply Chain Failures — a recognition that the risk is far wider than a single stale library. Modern applications are assembled from open-source dependencies, but they are also built by pipelines and delivered through distribution channels. A failure anywhere along that chain — the components you pull in, the systems that assemble them, or the channels that ship them — becomes your problem.

Example: An application depends on a widely used library with a published critical CVE that the team never updated, and an attacker exploits the known flaw. Or a compromised build dependency injects malicious code during CI, so the tampering happens upstream of any code review — no novel research required, just an unguarded link in the chain.

How to prevent and detect it: Maintain an inventory of your dependencies (a software bill of materials helps), and continuously monitor them against vulnerability databases. Software composition analysis automates this — flagging vulnerable and outdated components, including transitive dependencies you did not add directly. Extend that scrutiny to the pipeline itself: pin and verify build tooling, secure your CI/CD systems, and treat the build and distribution path as part of your attack surface.

A04:2025 — Cryptographic Failures

Sometimes framed as "Sensitive Data Exposure," this category is about failures in how data is protected in transit and at rest — weak or missing encryption, poor key management, or sensitive data that simply should not have been stored. The failure is the root cause; the exposure is the consequence.

Example: An application stores passwords using a fast, unsalted hash, or transmits session tokens over plain HTTP on an internal hop. When an attacker gains a copy of the database or intercepts traffic, the data is trivially readable.

How to prevent and detect it: Classify what data you hold and minimize what you keep. Enforce strong transport encryption everywhere, use modern, well-vetted algorithms, and hash passwords with a slow, salted function designed for the purpose. Manage keys properly and rotate them. Scanning tools and configuration reviews can flag weak protocols, hardcoded secrets, and deprecated ciphers.

A05:2025 — Injection

Injection happens when untrusted input is interpreted as part of a command or query. SQL injection is the archetype, but the category also covers OS command injection, LDAP injection, and cross-site scripting (XSS).

Example: A login form builds a SQL query by concatenating the username directly into the statement. An attacker submits ' OR '1'='1 and bypasses authentication, or extracts the entire user table.

How to prevent and detect it: Use parameterized queries and prepared statements so data can never be executed as code. Validate and, where appropriate, encode input based on its destination context. Static analysis is particularly effective here — it traces untrusted input from source to sink and flags unsafe query construction and output handling before code ships.

A06:2025 — Insecure Design

This category shifts attention upstream to flaws in architecture and design rather than implementation bugs. A perfectly coded feature can still be insecure if the design never accounted for abuse. You cannot patch your way out of a missing security control that was never designed in.

Example: A password-reset flow uses security questions whose answers are easily found online, with no rate limiting. The code works exactly as written — the design simply failed to consider how an attacker would abuse it.

How to prevent and detect it: Introduce threat modeling early, when changing the design is still cheap. Establish secure design patterns and reference architectures that teams reuse. Write abuse cases alongside user stories, and validate business-logic limits (rate limits, transaction ceilings, workflow constraints) as first-class requirements rather than afterthoughts.

A07:2025 — Authentication Failures

Renamed in 2025 from "Identification and Authentication Failures," this category covers weaknesses in confirming who a user is and maintaining that identity securely — weak password policies, credential stuffing exposure, poor session management, and flawed multi-factor implementations.

Example: An application permits unlimited login attempts with no lockout or throttling, letting an attacker run credential-stuffing lists against it. Or session tokens do not rotate after login, leaving them vulnerable to fixation.

How to prevent and detect it: Support and encourage multi-factor authentication, enforce protection against automated guessing (rate limiting, lockouts, breached-password checks), and manage sessions carefully — rotate identifiers on login, set secure attributes on cookies, and expire sessions appropriately. Prefer well-tested authentication frameworks over rolling your own.

A08:2025 — Software or Data Integrity Failures

This category addresses code and infrastructure that fail to protect against integrity violations — trusting plugins, libraries, or updates from sources without verifying they have not been tampered with. It grew directly out of high-profile supply-chain attacks and sits close to A03, but focuses specifically on the verification of integrity rather than the breadth of the supply chain.

Example: A build pipeline pulls an update over an unverified channel, or an application deserializes untrusted data without checks. A compromised or malicious artifact flows straight into production because nothing verified its integrity.

How to prevent and detect it: Use signed packages and verify signatures, pin dependencies to known-good versions, and secure your CI/CD pipeline so build and deployment steps cannot be tampered with. Avoid insecure deserialization of untrusted data. Treat your build system as production infrastructure that deserves the same scrutiny as your application.

A09:2025 — Security Logging and Alerting Failures

You cannot respond to what you cannot see. Reframed in 2025 as Security Logging and Alerting Failures, this category is about insufficient logging, alerting, and the response that should follow — the gap that lets breaches go undetected for weeks or months. It rarely causes the initial compromise, but it dramatically worsens the outcome.

Example: A series of failed logins followed by a successful one from an unusual location generates no alert, and authentication events are not logged at all. The intrusion is discovered only when data appears elsewhere.

How to prevent and detect it: Log security-relevant events — logins, access-control failures, high-value transactions — with enough context to investigate, and ensure logs are tamper-resistant and centrally collected. Define alerts for suspicious patterns and rehearse an incident-response plan so detection actually leads to action. Be careful not to log sensitive data itself.

A10:2025 — Mishandling of Exceptional Conditions

New in 2025, this category addresses how applications behave when something goes wrong — improper error handling, logical errors in edge cases, and the dangerous habit of failing open instead of closed. When an unexpected condition arises and the code takes the insecure path by default, an attacker can deliberately trigger those conditions to slip past controls.

Example: An authorization check throws an exception when a downstream service is unreachable, and the catch block logs the error but lets the request proceed — so a user reaches a protected resource precisely because something broke. Verbose error responses can also leak stack traces and internal details that help an attacker map the system.

How to prevent and detect it: Design for failure: decide explicitly what should happen when a check cannot complete, and make the default the secure outcome. Handle exceptions deliberately rather than swallowing them, return generic error messages to users while logging details internally, and test the unhappy paths — malformed input, timeouts, dependency outages — not just the happy ones.

How to address the OWASP Top 10 in your SDLC

Reading the list is the easy part. The real work is building defenses that catch these risks continuously, without slowing engineering to a crawl. No single technique covers all ten categories, so the practical answer is layering complementary controls across the development lifecycle — shifting security left so issues are found while they are cheap to fix.

Secure design comes first. Insecure Design (A06) exists precisely because tooling cannot retrofit a control that was never conceived — and the same holds for Mishandling of Exceptional Conditions (A10), where failing safely is a design decision. Threat modeling, abuse cases, and reusable secure patterns catch whole classes of risk before a line of code is written. This is the highest-leverage investment you can make.

Static analysis (SAST) covers code-level flaws. Injection (A05), many access-control mistakes (A01), cryptographic weaknesses (A04), and insecure error handling (A10) show up as identifiable patterns in source code. SAST traces untrusted input from source to sink and flags unsafe query construction, weak crypto usage, and hardcoded secrets — ideally inline in the developer's pull request, where context is freshest.

Software composition and supply-chain scanning (SCA) cover your dependencies — and now more than ever. With Software Supply Chain Failures (A03) broadened for 2025 and Software or Data Integrity Failures (A08) beside it, the supply chain is one of the fastest-growing parts of the list. SCA inventories your open-source dependencies, including transitive ones, and continuously matches them against known vulnerabilities so a risky component is caught before merge. Extending that visibility to build tooling and pipeline integrity is what makes the difference against modern supply-chain attacks.

Dynamic analysis (DAST) covers runtime behavior. Security Misconfiguration (A02), authentication gaps (A07), access-control failures (A01), and exceptional-condition handling (A10) — including issues like SSRF that surface through permissive configuration — often only reveal themselves in a running application. DAST exercises the deployed app the way an attacker would, surfacing exposed error messages, permissive configurations, and broken authorization that static views miss.

Logging and alerting close the loop. Security Logging and Alerting Failures (A09) is a reminder that prevention is never perfect. Instrument security-relevant events, centralize and protect your logs, and alert on suspicious patterns so that when something slips through, you see it in hours rather than months.

Stitching these together by hand — separate tools, separate dashboards, separate triage queues — is where many programs stall. This is where a consolidated security layer earns its place. Rainforest brings SAST, SCA, and DAST together into your existing workflow, mapping findings back to categories like the OWASP Top 10 and meeting developers in the pull request instead of a quarterly report. The result is coverage across the list without asking engineers to become full-time security specialists.

If you are building or maturing an application security program, start by mapping your current coverage against these ten categories, then close the gaps with automated testing in your pipeline. To see how a unified approach fits your SDLC, explore Rainforest's application security testing platform — or read our companion guide, What is Application Security, for the broader picture.

Frequently asked questions

What is the OWASP Top 10?

The OWASP Top 10 is a regularly updated awareness document that ranks the ten most critical security risks to web applications. Each entry is a broad category of related weaknesses — such as Broken Access Control or Injection — chosen from industry data and a community survey. It is meant as a prioritized starting point for securing applications, not an exhaustive checklist.

What is OWASP?

OWASP, the Open Worldwide Application Security Project, is a nonprofit foundation that produces free, vendor-neutral resources to improve software security. It is community-driven and best known for the OWASP Top 10, though it also publishes testing guides, cheat sheets, and open-source tools.

How often is the OWASP Top 10 updated?

It is revised periodically — roughly every few years — as the way applications are built and attacked evolves. The current edition is the OWASP Top 10:2025, which succeeded the 2021 list. Updates reshape the categories over time: the 2025 release, for example, promoted Security Misconfiguration to #2, broadened the components category into Software Supply Chain Failures, and added Mishandling of Exceptional Conditions as a new entry.

What is the #1 OWASP risk?

In the OWASP Top 10:2025, the number one risk is Broken Access Control (A01). It holds the top spot because authorization flaws are both very common and high impact — users reaching data or actions they should not be permitted to access.

How do you prevent OWASP Top 10 vulnerabilities?

There is no single fix. The most effective approach layers controls across the SDLC: secure design and threat modeling upstream, SAST for code-level flaws like injection, SCA and supply-chain scanning for vulnerable components and build integrity, DAST for runtime issues, and strong logging and alerting to catch what slips through. Automating these in CI/CD keeps coverage continuous.

Do I need separate tools for each OWASP category?

Not necessarily separate products, but you do need complementary techniques — static, composition, and dynamic analysis each cover different categories. A consolidated platform can bring these together so findings map back to the Top 10 in one workflow rather than several disconnected ones.

Bruno Baldo

Written by

Bruno Baldo

CMO

Um pouco de marketing e um pouco de curiosidade e temos a receita pra criar um apaixonado por cyber!

Keep reading