Introdução
Section titled “Introdução”O IDOR ocorre quando nossa aplicação não valida corretamente os inputs que vem do usuário, permitindo acesso a funções, objetos ou informações na qual o usuário atualmente logado não deveria ter acesso.
Cenário Vulnerável
Section titled “Cenário Vulnerável”Imagine que temos uma tela onde o usuário logado pode ver as informações do seu próprio perfil.
Ao inspecionar as chamadas de API, vemos a seguinte request que busca os dados para montar a página:
GET /user/profile/1 HTTP/2Host: my-api.company.com.brE no código, vemos algo assim:
public ActionResult GetUserProfile(int userId){ var profile = db.UserProfiles.FirstOrDefault(p => p.Id == userId);
return View(profile);}public function getUserProfile(int $userId){ $profile = UserProfile::where('id', $userId)->first();
return view('profile', ['profile' => $profile]);}A pergunta que fica é:
O que aconteceria se um atacante fizesse um request para
/user/profile/2?
Por acaso os dados da conta 2 seriam entregues? E este usuário deveria ter acesso a estes dados?
Quando manipulamos as requisições e trocamos informações por outros que levariam a informações na qual não deveríamos ter acesso, temos um problema de IDOR.
Riscos
Section titled “Riscos”Exposição de Dados Confidenciais
Section titled “Exposição de Dados Confidenciais”Os atacantes podem obter acesso a informações particulares do usuário, registros financeiros, propriedade intelectual ou outros dados confidenciais.
Escalonamento de Privilégios
Section titled “Escalonamento de Privilégios”Os atacantes podem elevar privilégios para modificar dados, realizar transações não autorizadas ou obter acesso administrativo.
Danos à Reputação
Section titled “Danos à Reputação”Ataques IDOR bem-sucedidos podem corroer a confiança do cliente e levar a reações legais e regulatórias.
Como Mitigar
Section titled “Como Mitigar”Procure por todas as operações na qual existam INPUTs de usuários, tais como APIs, URLs com parâmetros em query strings ou no path, corpo de requests, etc.
Nestas operações, procure por IDs ou qualquer outro parâmetro que poderia levar a outro usuário ou informação no sistema, tais como:
- IDs de entidades (UserId, AddressId, etc)
- Caminhos de Arquivos (fatura-123.pdf, /users/photo/123, etc)
Em cada um destes parâmetros, troque as informações por de outros arquivos ou IDs que pertençam a outros usuários na qual você não deveria ter acesso. Caso consiga acessar, temos uma vulnerabilidade e necessitamos corrigir.
Para a correção, implemente uma verificação se o usuário logado de fato pode fazer a operação sobre aquele recurso. Em caso de não poder, retorne um erro 403 Forbidden.