Mysql Case Sensitive Problems

Introdução

Ao efetuar comparações no mysql normalmente utilizamos:

mysql> SELECT name FROM admins WHERE name = "ghosthk";
+---------+
| name    |
+---------+
| ghosthk |
+---------+

Bom, o mysql fez o que pedimos, porém observe esse outro comportamento:

mysql> SELECT name FROM admins WHERE name = "ghostHK";
+---------+
| name    |
+---------+
| ghosthk |
+---------+

Preste atenção no "HK" em maiúsculo, o mysql retornou o resultado mesmo assim

Bypass Time

Agora vamos observar isso em uma aplicação de teste (vou utilizar o mysqli, porém o mesmo comportamento se aplica na utilização do PDO, pois o erro está no mysql e não nos meios de consulta que utilizamos para se comunicar com o banco de dados):

A aplicação simplesmente verifica se o usuário passado é igual a "ghosthk", se for ele vai exibir "WELCOME ADMIN" caso não ele exibe "YOU NOT IS ADMIN". O que vai acontecer é que irei passar "gHostHK" como usuário e ele irá retornar "WELCOME ADMIN":

Agora vamos ver isso em um ambiente mais próximo da realidade (utilizarei uma fortress do HTB):

A aplicação irá verificar se o usuário solicitado para criar é o igual a "elonmusk", se for igual ele dará erro, se for diferente ele irá criar o usuário, ou seja, podemos criar um usuário "eloNMusk"

Se o usuário for igual "elonmusk" ele nos deixa acessar a feature de download. Porém repare na comparação, essa condição retornará resultado se criamos um usuário chamado "eloNMusk".

Criei e entrei com o usuário:

Agora vamos acessar a rota "download":

Pronto, conseguimos bypassar a verificação!

Mitigação

E como podemos corrigir? Simples, basta efetuar a query utilizando BINARY, como no exemplo a seguir:

Existem outras formas também, siga o link para exemplos:

Obrigado por ler até aqui!

Last updated