Summary
Stored XSS via malicious Plan extensions.
Details
The vulnerability is in react-mcjsonchat@1.0.0 dependency, used by Plan's React dashboard.
Vulnerable code: node_modules/react-mcjsonchat/dist/esm/index.js:90-92
case "open_url":
return React.createElement("a", { href: clickEvent.value, ...}, props.children);
clickEvent.value is passed directly to href without URL validation, allowing javascript: execution.
Flow:
- Extension returns
@ComponentProvider with clickEvent.action: "open_url" and clickEvent.value: "javascript:..."
- Plan stores JSON in database → API returns as
type: "COMPONENT"
ExtensionCard.jsx:61 passes to <MinecraftChat component={JSON.parse(data.value)}/>
- react-mcjsonchat renders
<a href="javascript:...">
Plan could sanitize the parsed JSON before passing it or validate clickEvent.value URLs.
PoC
- Install attached
xss-test-plugin-1.0.0.jar(https://gofile.io/d/laeK35)
- Open Plan dashboard
- Navigate to Plugins Overview
- Click "Click here" link
- Alert shows document.cookie
Impact
Stored xss impacts dashboard users
Summary
Stored XSS via malicious Plan extensions.
Details
The vulnerability is in react-mcjsonchat@1.0.0 dependency, used by Plan's React dashboard.
Vulnerable code: node_modules/react-mcjsonchat/dist/esm/index.js:90-92
clickEvent.valueis passed directly tohrefwithout URL validation, allowingjavascript:execution.Flow:
@ComponentProviderwithclickEvent.action: "open_url"andclickEvent.value: "javascript:..."type: "COMPONENT"ExtensionCard.jsx:61passes to<MinecraftChat component={JSON.parse(data.value)}/><a href="javascript:...">Plan could sanitize the parsed JSON before passing it or validate
clickEvent.valueURLs.PoC
xss-test-plugin-1.0.0.jar(https://gofile.io/d/laeK35)Impact
Stored xss impacts dashboard users