Postiz has multiple SSRF vulnerabilities where user-provided URLs are fetched server-side without any IP validation or SSRF protection.
apps/backend/src/api/routes/webhooks.controller.ts lines 58-70:
async sendWebhook(@Body() body: any, @Query('url') url: string) {
try {
await fetch(url, { // No URL validation
method: 'POST',
body: JSON.stringify(body),
headers: { 'Content-Type': 'application/json' },
});
} catch (err) { }
return { send: true };
}
Accepts arbitrary URL via query parameter and fetches directly.
apps/orchestrator/src/activities/post.activity.ts lines 256-281:
async sendWebhooks(postId: string, orgId: string, integrationId: string) {
const webhooks = await this._webhookService.getWebhooks(orgId);
return Promise.all(
webhooks.map(async (webhook) => {
await fetch(webhook.url, { // Stored URL, no validation
method: 'POST',
body: JSON.stringify(post),
});
})
);
}
libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts line 135:
async loadXML(url: string) {
const { items } = await parser.parseURL(url); // No URL validation
}
libraries/nestjs-libraries/src/database/prisma/autopost/autopost.service.ts line 185:
async loadUrl(url: string) {
const loadDom = new JSDOM(await (await fetch(url)).text()); // No validation
}
request-filtering-agent or SSRF library@IsUrl() decorator (format only, no IP check)POST /webhooks/send?url=http://169.254.169.254/latest/meta-data/ → AWS metadata theftPOST /autopost/send?url=http://127.0.0.1:6379 → Internal Redis accesshttp://10.0.0.1:8080/admin → Internal service access on post publish{
"cwe_ids": [
"CWE-918"
],
"github_reviewed": true,
"github_reviewed_at": "2026-03-27T15:47:57Z",
"nvd_published_at": null,
"severity": "HIGH"
}