Skip to main content
CVE Vulnerability Database

CVE-2020-7071: PHP URL Validation Bypass Vulnerability

CVE-2020-7071 is a URL validation bypass flaw in PHP that allows invalid URLs with malformed passwords to be accepted as valid. This post covers the technical details, affected versions, security impact, and mitigation.

Published:

CVE-2020-7071 Overview

CVE-2020-7071 is an input validation vulnerability affecting PHP's URL validation functionality. When validating URLs using functions like filter_var($url, FILTER_VALIDATE_URL), PHP incorrectly accepts URLs containing invalid password characters as valid. This improper validation can lead to URL mis-parsing by downstream functions that rely on the URL being properly validated, potentially resulting in the extraction of incorrect URL components.

Critical Impact

Applications relying on PHP's built-in URL validation may process malformed URLs as legitimate, potentially leading to security bypasses, server-side request forgery (SSRF) scenarios, or data integrity issues when URL components are parsed incorrectly.

Affected Products

  • PHP versions 7.3.x below 7.3.26
  • PHP versions 7.4.x below 7.4.14
  • PHP version 8.0.0
  • Debian Linux 9.0 and 10.0
  • NetApp Clustered Data ONTAP

Discovery Timeline

  • 2021-02-15 - CVE-2020-7071 published to NVD
  • 2024-11-21 - Last updated in NVD database

Technical Details for CVE-2020-7071

Vulnerability Analysis

This vulnerability stems from improper input validation (CWE-20) within PHP's URL parsing and validation mechanisms. The filter_var() function with the FILTER_VALIDATE_URL flag is designed to verify that a given string represents a properly formatted URL according to RFC standards. However, the implementation fails to properly validate the password component of the URL's userinfo section.

When a URL contains an invalid password (containing characters that should be percent-encoded or rejected), PHP's validation logic incorrectly returns the URL as valid. This creates a discrepancy between what is considered valid during the initial validation and how subsequent parsing functions interpret the URL components.

The vulnerability is exploitable over the network without authentication or user interaction, though the impact is limited to integrity concerns rather than confidentiality or availability breaches.

Root Cause

The root cause lies in insufficient character validation within PHP's URL parsing implementation. The password portion of a URL (appearing between the username and @ symbol in the authority component) should conform to specific character restrictions per RFC 3986. PHP's filter_var() function with FILTER_VALIDATE_URL fails to enforce these restrictions properly, allowing malformed password strings to pass validation.

This inconsistency means the validation function and parsing functions operate with different assumptions about URL validity, creating potential for security-relevant misbehavior in applications that trust the validation result.

Attack Vector

An attacker can exploit this vulnerability by supplying a specially crafted URL with an invalid password component to any PHP application that relies on filter_var() for URL validation. The attack scenario typically involves:

  1. Identifying an application endpoint that accepts URLs and validates them using filter_var($url, FILTER_VALIDATE_URL)
  2. Crafting a URL with malformed password characters that passes validation but causes parsing discrepancies
  3. The application processes the "valid" URL, but downstream parsing extracts incorrect components

This can lead to scenarios where security controls based on URL parsing (such as allowlist checks, hostname verification, or path restrictions) can be bypassed because the parsed components differ from what was validated. The vulnerability is particularly concerning in SSRF prevention contexts or when URL components are used for access control decisions.

For technical details on the specific invalid password patterns that trigger this behavior, see PHP Bug Report #77423.

Detection Methods for CVE-2020-7071

Indicators of Compromise

  • Unusual URL patterns in application logs containing malformed userinfo sections (username:password portion before the @ symbol)
  • Error messages or exceptions from URL parsing functions that follow successful URL validation
  • Unexpected network connections to hosts that should have been blocked by URL validation controls

Detection Strategies

  • Review application code for usage of filter_var() with FILTER_VALIDATE_URL flag and assess if additional validation is performed
  • Implement logging for URLs that pass validation but generate parsing errors in subsequent processing
  • Deploy web application firewall rules to detect URLs with suspicious character patterns in the authentication portion

Monitoring Recommendations

  • Monitor PHP application logs for discrepancies between validated URLs and parsed URL components
  • Track any SSRF-related security events in applications that process user-supplied URLs
  • Enable verbose logging for URL processing in sensitive applications to capture validation and parsing outcomes

How to Mitigate CVE-2020-7071

Immediate Actions Required

  • Upgrade PHP to version 7.3.26 or later for 7.3.x installations
  • Upgrade PHP to version 7.4.14 or later for 7.4.x installations
  • Upgrade PHP to version 8.0.1 or later for 8.0.x installations
  • Review all instances where filter_var() with FILTER_VALIDATE_URL is used in critical security contexts

Patch Information

PHP has released patched versions addressing this vulnerability. Organizations should update to the following minimum versions:

  • PHP 7.3.26 for the 7.3 branch
  • PHP 7.4.14 for the 7.4 branch
  • PHP 8.0.1 for the 8.0 branch

Detailed information is available in the PHP Bug Report #77423. Additional vendor-specific patches are documented in Debian Security Advisory DSA-4856 and NetApp Security Advisory NTAP-2021-03-12.

Workarounds

  • Implement additional URL validation using parse_url() and verify each component independently before processing
  • Use strict allowlist validation for URL schemes, hosts, and ports rather than relying solely on FILTER_VALIDATE_URL
  • Consider using well-tested third-party URL parsing libraries that provide stricter validation
bash
# Example: Check PHP version to verify patched status
php -v

# Verify specific version requirements are met
php -r "echo (version_compare(PHP_VERSION, '7.4.14', '>=') ? 'Patched' : 'Vulnerable') . PHP_EOL;"

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.