Skip to content

Instantly share code, notes, and snippets.

@pyuysig
Last active June 13, 2026 15:42
Show Gist options
  • Select an option

  • Save pyuysig/9de95fb39eb089a4346570d791af99a6 to your computer and use it in GitHub Desktop.

Select an option

Save pyuysig/9de95fb39eb089a4346570d791af99a6 to your computer and use it in GitHub Desktop.
Reference for CVE-2026-50887

Summary

Shlink 5.0.1 can fetch an authenticated user's longUrl from the server side during automatic short URL title resolution. When AUTO_RESOLVE_TITLES is enabled and no explicit title is supplied, a valid API key can trigger requests to internal destinations.

Details

Short URL create and edit flows pass the submitted longUrl into the short URL title-resolution helper when automatic title resolution is enabled. The helper issues a server-side GET request through the configured HTTP client and extracts the page title from the response.

The create/edit request controls longUrl, and the reachability condition is AUTO_RESOLVE_TITLES being enabled with no explicit title in the request. The long URL validation accepts URL-shaped values and does not enforce an internal-address block before the title fetch.

The returned page title can be stored or returned with the short URL. This makes the issue both an outbound request primitive and a limited response-content disclosure primitive through the extracted title.

PoC

  1. Enable AUTO_RESOLVE_TITLES in Shlink 5.0.1 and use any valid API key.
  2. Start a server-reachable listener that returns HTML containing <title>internal-ok</title>.
  3. Send an authenticated short URL creation request without a title, using longUrl set to the listener URL such as http://127.0.0.1:8080/.
  4. Observe the listener receiving a GET request from the Shlink server.
  5. Observe the created short URL storing or returning the resolved title value internal-ok.

Impact

The observed result is authenticated SSRF through automatic title resolution. Where the feature is enabled, a user with an API key can cause Shlink to connect to internal HTTP services and can receive selected response content through the resolved page title.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment