Introduction to SSRF

Welcome to the very first lesson of the "Server-Side Request Forgery (SSRF) Prevention in Express" course! In this lesson, we will explore Server-Side Request Forgery (SSRF), a critical security vulnerability that can affect web applications. SSRF occurs when an attacker tricks a server into making unauthorized requests on their behalf. This can lead to the exposure of sensitive information or unauthorized actions within a network.

Understanding SSRF is crucial for building secure applications and protecting against potential threats. Let's dive into the mechanics of SSRF to see how these vulnerabilities occur. 🚀

Understanding SSRF

To understand SSRF, it's important to differentiate between client-side and server-side requests. In a typical web application, client-side requests are made by the user's browser, while server-side requests are made by the server itself. SSRF vulnerabilities occur when an attacker manipulates server-side requests to access unauthorized resources.

Imagine a scenario in which a web application allows users to input a URL to fetch data. If the application doesn't properly validate the input, an attacker could input a URL pointing to an internal resource, such as a private server. Internal resources typically include services like internal dashboards, internal APIs, or even databases that are not exposed to the public internet. These systems are usually protected by network-level restrictions like firewalls or NAT, meaning users on the internet shouldn't be able to access them directly. However, because the server itself is inside the protected network, it can access these systems. By leveraging SSRF, attackers exploit this trust boundary and trick the server into making requests to sensitive endpoints on their behalf — essentially bypassing external access restrictions.

SSRF Attack Patterns

SSRF attacks can take several forms, depending on the target and the attacker's goals:

  1. Internal Network Scanning: Attackers use SSRF to map out internal networks by sending requests to various IP addresses and ports.

  2. Cloud Metadata Service Attacks: In cloud environments, attackers target metadata services (like AWS Instance Metadata Service) to obtain sensitive information such as access keys.

  3. Local File Access: Using protocols like file://, attackers might attempt to read local files on the server.

  4. Service-Specific Exploits: Attackers target internal services that might have weak authentication when accessed from within the network.

Here's a basic example of an SSRF vulnerability:

Common SSRF Targets

When conducting SSRF attacks, attackers typically target:

  1. Cloud Infrastructure Metadata: Endpoints like:

    • AWS: http://169.254.169.254/latest/meta-data/
    • Azure: http://169.254.169.254/metadata/instance
    • GCP: http://metadata.google.internal/computeMetadata/v1/
  2. Internal APIs and Services: Internal services often lack the same level of security as public-facing endpoints.

  3. Admin Interfaces: Internal admin panels that might be accessible only from within the network.

  4. Database Servers: Accessing internal database servers to extract sensitive data.

SSRF Detection Techniques

To identify SSRF vulnerabilities in code, we need to look for areas where user input is used to construct server-side requests. For example, if a user-supplied URL is passed directly into a function like fetch() or axios.get() without domain or scheme restrictions, this is a strong indicator of SSRF risk. Developers should examine whether the input is sanitized, validated against allowlists, and whether any proxy or redirect behavior is occurring that could allow the attacker to circumvent basic filters.

Identifying Internal IPs and Localhost

A naive approach to SSRF detection is to check if the URL contains internal IP addresses or localhost references as substrings. However, this can lead to false positives. For example, the domain not-localhost.com would be incorrectly flagged as dangerous, even though it is a public domain.

A more robust approach is to parse the URL and check the actual hostname against known internal addresses and private IP ranges. Additionally, it's important to check if any query parameter values themselves are internal IPs, hostnames, or URLs pointing to internal resources.

Note: Always parse and check the hostname, not just substrings, to avoid false positives in SSRF detection. Also, consider checking query parameter values, as attackers may try to smuggle internal addresses there.

Detecting Non-HTTP Schemes

Check for potentially dangerous URL schemes:

Validating URL Format and Domain

Ensure the URL format is valid and doesn't point to restricted resources:

These schemes are dangerous because they interact with the system or network in unintended ways. For instance, file:// accesses local files, gopher:// can be used to send binary data (often abused in SSRF-to-RCE attacks), and ftp:// may allow directory traversal or retrieval of sensitive config files.

Conclusion

In this lesson, we explored the concept of Server-Side Request Forgery (SSRF) and its potential impact on web applications. We learned about various attack patterns, common targets, and methods for detecting SSRF vulnerabilities in code. As we move forward, you'll see how to implement effective prevention techniques in Express applications to mitigate these risks.

Sign up
Join the 1M+ learners on CodeSignal
Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal