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