- Home
- OWASP Top 10
OWASP Top 10 2025: Every risk explained
A guide to the ten most important web application security risks from the 2025 edition. Learn what changed since the 2021 edition and how to mitigate each risk. Practice with hands-on examples and simulated attacks.
By Malcolm McDonald Founder, Editor-in-ChiefAuthor of Grokking Web Application Security
Updated
The 2025 edition
Change vs 2021 · Lessons- A01 Broken Access Control Same 6 lessons
- A02 Security Misconfiguration Up 3 5 lessons
- A03 Software Supply Chain Failures New 2 lessons
- A04 Cryptographic Failures Down 2 3 lessons
- A05 Injection Down 2 8 lessons
- A06 Insecure Design Down 2 3 lessons
- A07 Authentication Failures Same 4 lessons
- A08 Software or Data Integrity Failures Same 2 lessons
- A09 Security Logging and Alerting Failures Same 1 lesson
- A10 Mishandling of Exceptional Conditions New 1 lesson
What is the OWASP Top 10?
The OWASP Top 10 is a ranked list of the ten most critical security risks to web applications. It comes from the Open Worldwide Application Security Project (OWASP), a nonprofit foundation that builds the list from industry data and a community survey. A new edition comes out every three or four years. The 2025 edition is the current one, and there is no 2026 edition.
The list matters because it gives everyone the same names for the same problems. Many security scanners and penetration test reports label what they find with its categories. A team that knows the ten risks can read a finding and recognize the flaw behind it.
How does OWASP decide on the top 10?
OWASP calls its method “data-informed, but not blindly data-driven.” It has three steps:
- Testing data. Security companies donate the results of their testing. For 2025 that covered more than 2.8 million applications. OWASP counts how many of those applications have each weakness at least once.
- Exploit and impact scores. About 175,000 public vulnerability (CVE) records show how easy each weakness is to exploit and how much damage it can do. OWASP groups related weaknesses by root cause, then ranks the groups on incidence, exploitability and impact together.
- Community survey. Automated tests miss some risks, so only eight categories come from the data. Practitioners vote in the other two. In 2025, the survey put Software Supply Chain Failures (A03) and Security Logging and Alerting Failures (A09) on the list.
Source: OWASP Top 10:2025 introduction
What changed in the 2025 edition
There are three major changes in the 2025 OWASP Top 10 from the 2021 version .
- Two new categories A03 Software Supply Chain Failures grows out of Vulnerable and Outdated Components (#6 in 2021) to cover the whole supply chain. A10 Mishandling of Exceptional Conditions is new.
- SSRF merged into A01 Server-side request forgery was #10 in 2021. It is now part of Broken Access Control, which stays at #1.
- Misconfiguration climbs to #2 Security Misconfiguration moves up three places. Cryptographic Failures, Injection and Insecure Design each drop two.
The OWASP Top 10 2025, mapped to hands-on lessons
Pick a lesson to see what it teaches. A lesson that covers two risks shows in both rows.
1. Broken Access Control
Users can reach data or actions their permissions should block, such as other users' records or admin-only functions. For 2025, this category also covers server-side request forgery (SSRF).
Access control is the code that decides who may read or change what, and it has to run on every request. In our Broken Access Control lesson, a publisher uploads earnings reports before their release time and counts on nobody guessing the URLs. Hiding a resource instead of protecting it is called security through obscurity. A trader guesses the pattern and reads each report early. The 2022 breach of the Australian telecommunications company Optus was the same failure on a larger scale. An unsecured API gave up the passport and driver's license numbers of 9.7 million current and former customers.
2. Security Misconfiguration
A server, framework, or cloud service runs with unsafe settings. Common examples are default credentials left unchanged, security features turned off, and error pages that show too much.
Servers, frameworks and cloud services all come with settings, and a setting changed for a quick test can end up in production. In our Cross-Origin Resource Sharing lesson, an engineer at a bank turns off the API's CORS restrictions to debug locally, then commits the change with a TODO note. A recipe blog's hidden script calls the API from a logged-in customer's browser and reads the customer's balance and transactions. Parsers have risky settings too. Even Facebook has suffered from XML External Entities, where an XML parser reads files off the server because a document asked it to.
3. Software Supply Chain Failures
Attackers reach your application through what you build it with: third-party packages, build tools, and CI/CD pipelines. A malicious or tampered dependency can ship to production with your next release.
Every package you install runs with the same access as your own code. In our Slopsquatting (LLM Supply Chain) lesson, an attacker queries LLM coding assistants thousands of times and lists the package names they invent. The attacker publishes one to npm as a working fork of a popular library. Building its reputation takes three months (more patience than most of us have for our own side projects). Someone installs the LLM's suggestion, and the package starts harvesting environment variables in production. In 2020, attackers took over the build system at SolarWinds and hid a backdoor in a security update.
4. Cryptographic Failures
Encryption is missing, outdated, or set up wrong, so attackers can read or change sensitive data. Typical causes are broken algorithms, poorly managed keys, and data sent without HTTPS.
Many websites, banks among them, used to serve most pages over plain HTTP and switch to HTTPS only when the user logged in. Moxie Marlinspike, now better known as the creator of Signal, released a tool called sslstrip. It sits between the user and the site and rewrites the login form's HTTPS links as HTTP. Our SSL Stripping lesson shows how it captures the password while the server still sees a secure connection. Attacks like this one persuaded the web community to serve every page over HTTPS, and your site should do the same.
5. Injection
User input reaches a database query, an operating system command, or a web page, and the system runs it as code. SQL injection, command injection, and cross-site scripting (XSS) all belong here.
Injection happens when code builds a command out of text, and part of that text comes from the user. Our SQL Injection lesson attacks a login form whose code pastes the password straight into a SQL query. A single quote in the password field crashes the app, and the logs show a SQL syntax error. Typing ' or 1=1-- as the password then logs you in, because the database reads the password check as always true and ignores the rest of the query. SQL injection has compromised companies as large as Yahoo and Sony.
6. Insecure Design
The weakness comes from a design decision, so careful coding later cannot fix it. Teams prevent it by setting security requirements and modeling threats before they build.
Some flaws are settled in a planning meeting, long before anyone writes the vulnerable line. In our File Upload Vulnerabilities lesson (based on a real attack), a site checks profile images only in the browser. It publishes each upload, under its original name, at a public URL. An attacker turns off JavaScript and uploads a PHP script — a web shell — as his profile picture. Opening its URL lets him run any command on the server. The fix is a design decision too. Check uploads on the server, rename them and store them where they can never run.
7. Authentication Failures
Attackers log in as real users because login or session handling is weak. Credential stuffing, brute-force guessing, weak passwords, and guessable session IDs all lead here.
Attackers rarely guess passwords one at a time. They work from username and password lists leaked in earlier breaches, because users often reuse passwords across websites. Replaying those pairs on another site is called credential stuffing. (RockYou's 2009 breach alone leaked 14 million passwords, which became the standard wordlist for attacking logins.) Sessions are the other weak point. In our Session Fixation lesson, a site accepts session IDs in the URL and keeps the same ID after login. The attacker emails a victim a link to a hamster gif with an ID he chose, then reuses it after the victim logs in.
8. Software or Data Integrity Failures
The application trusts code or data without checking that nobody changed it. Examples are unsigned updates, unsafe deserialization, and request data that overwrites fields a user should never set.
Many web frameworks copy the fields of a request onto an object in one line of code, which saves a lot of typing. In our Mass Assignment lesson, a profile page lets users change their email and password, but the server copies every field it receives onto the User object. An attacker adds one extra field to the request and makes himself an administrator. Version 3.0 of Ruby on Rails was open to the same attack, and a hacker (thankfully a white hat) used it to get administrator access to GitHub.
9. Security Logging and Alerting Failures
Without enough logging and alerting, nobody notices an attack while it happens. Attackers can stay in your systems and change or steal data long before anyone finds out.
Many attacks leave a trail in your logs before they succeed. In our SQL Injection lesson, the attacker's first probe, a stray quote in the password field, crashes the app and writes a SQL syntax error to the log. If that error raises no alert, a later attempt logs the attacker in and nobody notices. Our Logging and Monitoring lesson covers what to record and how to collect logs on a central server. It also shows how to set alert thresholds that catch suspicious errors without getting your team out of bed every night.
10. Mishandling of Exceptional Conditions
The application handles errors and unusual input badly. It crashes, shows sensitive details in an error message, or fails open, letting a request through when a security check breaks.
When a request fails halfway, your code has to decide what to tell the user and whether to let the request through. In our XML External Entities lesson, an attacker sends XML that pulls the server's password file into the document. The parse fails, as it should. The error message, however, includes the whole expanded document, password file and all. Our Information Leakage lesson recommends a generic HTTP 500 page for users, with stack traces and other details kept in your server-side logs.
Source: OWASP Top 10:2025 . Category summaries are paraphrased.
Make all 34 lessons mandatory for your team, then see who has finished each one.