The OWASP Top 10 in 2025: What Changed and What It Means for Your Stack

Profile
Yves SoeteFollow
7 min read · Jun 9, 2025

JUN 9, 2025- Written by Yves SoeteBlacksight LLC visit us to use our free website security scanner onscanner.blacksight.io

Get notified when new articles drop — visitblacksight.io/blog to subscribe.

The Shift Toward Proactive Security



The OWASP Top 10 has been the definitive reference for web application security risks since its inception. The most significant evolution in the current list is the philosophical shift from reactive vulnerability patching to proactive secure design. Categories like Insecure Design and Software and Data Integrity Failures reflect a recognition that many breaches are not caused by implementation bugs but by fundamental architectural decisions made early in the development lifecycle. This matters for every engineering team. You cannot patch your way out of a design flaw. If your application was architected without threat modeling, without abuse case analysis, and without security requirements alongside functional ones, you are building on a foundation that will eventually crack. The OWASP Top 10 in 2025 is not just a vulnerability checklist. It is a blueprint for how to think about security throughout the entire software development process.



A01: Broken Access Control



Broken access control moved to the number one position and has stayed there, reflecting its prevalence in real-world breaches. This category covers any situation where users can act outside their intended permissions: accessing other users' data, modifying records they should not touch, or escalating privileges from regular user to administrator. A common real-world example is insecure direct object references, where changing an ID in a URL lets you access another user's account or data. An API endpoint like /api/users/1234/invoices that does not verify the authenticated user actually owns account 1234 is a textbook broken access control vulnerability. Prevention requires a deny-by-default approach. Every endpoint should explicitly verify authorization, not just authentication. Implement server-side access control checks that cannot be bypassed by manipulating client-side parameters. Use role-based or attribute-based access control consistently, and test your authorization logic as rigorously as you test your business logic. Automated scanning can detect many instances of broken access control, particularly IDOR vulnerabilities and missing authorization checks on API endpoints.



A02: Cryptographic Failures



Previously called Sensitive Data Exposure, this category was renamed to focus on the root cause rather than the symptom. Cryptographic failures include transmitting data in clear text, using deprecated algorithms like MD5 or SHA-1 for password hashing, weak key generation, missing encryption at rest, and improper certificate validation. A common failure is storing passwords with a fast hash instead of a purpose-built algorithm. If your database is breached and passwords were hashed with SHA-256 without salting, an attacker can crack the majority of them within hours using precomputed rainbow tables or GPU-accelerated brute force. The fix is to use bcrypt, scrypt, or Argon2id with appropriate work factors. For data in transit, enforce TLS 1.2 or higher everywhere. For data at rest, identify what qualifies as sensitive under regulations like GDPR or PCI DSS, and encrypt it with AES-256 or equivalent. Audit your cipher suites regularly. Automated SSL scanning will catch weak protocols and cipher configurations on your publicly facing services.



A03: Injection



Injection attacks have dropped from the number one position but remain critically dangerous. SQL injection, NoSQL injection, OS command injection, and LDAP injection all fall under this category. The underlying problem is always the same: untrusted data is sent to an interpreter as part of a command or query without proper separation between code and data. Consider a login form where the backend constructs a SQL query by concatenating user input directly. An attacker submitting the username admin' OR '1'='1 bypasses authentication entirely. Despite being well understood for over two decades, SQL injection still appears in production applications, particularly in legacy codebases and in dynamic query construction that bypasses ORM protections. Prevention is straightforward in principle: use parameterized queries or prepared statements for all database interactions. Use ORMs correctly, avoiding raw query methods unless absolutely necessary. Validate and sanitize all input on the server side. Apply the principle of least privilege to database accounts so that even a successful injection limits the damage an attacker can do.



A04: Insecure Design



This is the category that represents the biggest philosophical shift in the OWASP Top 10. Insecure design is distinct from implementation bugs. It addresses the absence of security controls that should have been designed into the application from the start. A perfectly implemented feature can still be insecure if the design did not account for abuse scenarios. For example, a password reset flow that asks security questions is insecure by design. The answers to most security questions can be found on social media or through social engineering. No amount of implementation hardening fixes this. The design itself needs to change. Prevention means integrating threat modeling into your development process. Before building a feature, ask: how could this be abused? What are the trust boundaries? What happens if an input is malicious? Use abuse cases alongside use cases in your requirements. Establish secure design patterns as part of your engineering standards: rate limiting on authentication endpoints, transaction verification for financial operations, and separation of privilege for sensitive actions.



A05: Security Misconfiguration



Security misconfiguration is the most common issue found by automated scanners, and for good reason. It encompasses missing security headers, unnecessary services running on production, default credentials left in place, overly permissive CORS policies, directory listing enabled, verbose error messages exposing stack traces, and unpatched systems. A real-world example that recurs constantly: cloud storage buckets with public read access. AWS S3 buckets misconfigured to allow public access have exposed millions of sensitive records across hundreds of organizations. The fix was always a single configuration change. Prevention requires a hardening process applied consistently across all environments. Automate your security configuration checks. Use infrastructure as code so that your production configuration is version controlled and reviewable. Strip all unnecessary features, sample content, and documentation from production deployments. Implement security headers like Content-Security-Policy, X-Frame-Options, Strict-Transport-Security, and X-Content-Type-Options on every response. Regular automated scanning catches the majority of misconfigurations before attackers find them.



A06: Vulnerable and Outdated Components



Modern applications are built on hundreds or thousands of third-party dependencies, and each one is a potential attack vector. The Log4Shell vulnerability in late 2021 demonstrated this at scale: a single logging library vulnerability affected millions of applications worldwide. Many organizations did not even know they were running Log4j because it was a transitive dependency buried several layers deep in their dependency tree. Knowing your full dependency inventory is step one. Use software composition analysis tools to generate a software bill of materials. Automate dependency update checks and prioritize patches for components with known CVEs. Remove unused dependencies entirely. Pin your dependency versions in production and test updates in a staging environment before deploying. Supply chain scanning, which examines your JavaScript bundles, package manifests, and server-side dependencies for known vulnerabilities, should be part of your regular security scanning cadence. A vulnerability in a library you depend on is functionally equivalent to a vulnerability in your own code.



A07: Identification and Authentication Failures



This category covers weaknesses in authentication mechanisms: permitting brute force attacks, allowing weak passwords, mishandling session tokens, exposing session IDs in URLs, not invalidating sessions on logout, and lacking multi-factor authentication for sensitive operations. Credential stuffing attacks, where attackers use leaked username and password pairs from other breaches, are the most common exploitation of authentication weaknesses. Because people reuse passwords across services, a breach at one company creates attack surface for every other company where those users have accounts. Implement rate limiting and account lockout policies on authentication endpoints. Require multi-factor authentication, especially for administrative access and sensitive operations. Use proven session management frameworks rather than building your own. Invalidate sessions server-side on logout and on password change. Check submitted passwords against known breach databases using services like the Have I Been Pwned API to prevent users from choosing already-compromised credentials.



A08: Software and Data Integrity Failures



This category addresses code and infrastructure that does not protect against integrity violations. It includes using software updates without verifying signatures, CI/CD pipelines that allow unauthorized code deployment, auto-update mechanisms that do not validate the update source, and deserialization of untrusted data. The SolarWinds attack is the canonical example: attackers compromised the build pipeline to inject malicious code into legitimate software updates that were then distributed to thousands of organizations through normal update channels. Every recipient trusted the update because it came from a trusted source with valid signatures. Prevention requires verifying the integrity of all software and data at every stage. Use digital signatures and checksums for updates and dependencies. Secure your CI/CD pipeline with the same rigor as your production environment. Implement code review for all changes, including infrastructure-as-code changes. Ensure that your deserialization processes validate data before processing it, and avoid deserializing data from untrusted sources entirely where possible.



A09: Security Logging and Monitoring Failures



Without adequate logging and monitoring, breaches go undetected. Industry studies consistently show that the average time to detect a breach is measured in months, not hours. During that time, attackers move laterally, escalate privileges, and exfiltrate data. Insufficient logging means you cannot detect an attack in progress, and you cannot perform forensic analysis after the fact. Log all authentication events including failures, all access control failures, all input validation failures, and all administrative actions. Include enough context to reconstruct what happened: timestamp, user identity, source IP, action attempted, and resource affected. Store logs in a centralized, tamper-resistant system separate from your application servers. Set up automated alerting for suspicious patterns: multiple failed login attempts, access from unusual locations, privilege escalation attempts, and data access patterns that deviate from normal usage. The goal is to reduce detection time from months to minutes.



A10: Server-Side Request Forgery (SSRF)



SSRF earned its own category due to increasing prevalence in cloud-native architectures. An SSRF vulnerability allows an attacker to make the server send requests to unintended destinations, typically internal services that are not directly accessible from the internet. In cloud environments, this often means accessing the instance metadata service to steal IAM credentials. The Capital One breach in 2019 exploited an SSRF vulnerability to access AWS metadata credentials, which were then used to exfiltrate over 100 million customer records from S3. The server-side application was tricked into making requests to the internal metadata endpoint at 169.254.169.254, returning temporary security credentials. Prevent SSRF by validating and sanitizing all user-supplied URLs on the server side. Implement allowlists for permitted domains and IP ranges rather than trying to blocklist dangerous destinations. Disable HTTP redirects in server-side HTTP clients or validate the redirect target. In cloud environments, use IMDSv2 which requires a session token, making metadata theft through SSRF significantly harder. Network-level segmentation that restricts which internal services your application servers can reach provides defense in depth.

Bonus: Use our free website vulnerability scanner at scanner.blacksight.io

Liked this article? Get notified when new articles drop! visitblacksight.io/blog to subscribe

Version 1.0.49