Conhecendo o Mass Assignment
O que é o Mass Assignment?
O Mass Assignment é uma vulnerabilidade que permite com que o atacante manipule informações que não poderiam ser atualizadas ou inseridas por um usuário comum no banco de dados.
Essa vulnerabilidade geralmente ocorre quando a aplicação não valida os campos enviados pelo usuário e envia os dados diretamente para o banco de dados. Este tipo de vulnerabilidade normalmente acontece em páginas de cadastro em sistemas e páginas para atualizar o perfil do usuário.
Como podemos explorar o Mass Assignment?
Na maioria dos códigos, o Mass Assignment ocorre quando obtemos os dados informados pelo usuário e enviamos diretamente para o banco de dados.
Código 1
Observe que o código acima não valida as informações inseridas pelo usuário. Normalmente a função update recebe um array com os parâmetros e valores que serão atualizados, desta forma ficando ainda mais fácil o processo de desenvolvimento sem precisar especificar os dados que serão atualizados.
Código de exemplo abaixo:
Código 2
O código acima irá atualizar o nome, email e a senha do usuário. Vemos que no Código 1 não especificamos os dados que serão atualizados, apenas passamos os dados inseridos pelo usuário para a função update, então para um usuário atualizar sua senha e seu email, precisa enviar os seguintes parâmetros para a aplicação: senha=senha@123&[email protected].
Caso essa aplicação estiver armazenando as permissões dos usuários no banco de dados na mesma tabela onde possui a vulnerabilidade de Mass Assignment, qualquer usuário conseguirá atualizar suas permissões, mesmo não sendo administrador do sistema.
Podemos explorar a vulnerabilidade com um parâmetro adicional “permissao“: nome=nome&senha=senha@123&[email protected]&permissao=administrador.
Perceba que adicionamos o parâmetro “permissao” e atribuímos o valor “administrador”, desta forma, a aplicação não irá alterar somente os campos nome e senha, mas também irá alterar o campo “permissao”.
Como corrigimos o Mass Assignment?
Para corrigirmos o Mass Assignment, precisamos criar um array para que o usuário não tenha controle sobre os índices do array, pois são eles que indicam a informação que será atualizada.
Então podemos fazer um código parecido com este:
Código 3
Desta forma iremos atualizar apenas o nome, email e a senha inserida pelo usuário, e qualquer outro parâmetro que não esteja entre os 3 citados acima, será ignorado pela aplicação.
Alguns frameworks tem proteção contra este tipo de vulnerabilidade, no caso do PHP o laravel tem uma proteção contra esse tipo de ataque onde é possível especificar na model uma variavel “protected” que contem a lista de quais campos os usuários podem atualizar.
Algumas referências:
https://cheatsheetseries.owasp.org/cheatsheets/Mass_Assignment_Cheat_Sheet.html
https://github.com/OWASP/API-Security/blob/master/2023/en/src/0xa3-broken-object-property-level-authorization.md
Onde praticar Mass Assignment ?
Atualmente o hackingclub possuí 2 CTFs que podemos explorar Mass Assignment, dentre elas as máquinas: Ship e Hackhristmas Express.
O Hacking Club é uma plataforma de treinamento em cybersecurity, que permite você aprender hacking de forma totalmente prática.
Temos mais de 50 ambientes com vulnerabilidades reais com write-ups para você treinar e aprender hacking. Semanalmente lançamos máquinas gratuitas para você praticar e se desafiar no hacking!