От мну Задание: Нужно попасть в админку, обойдите авторизацию Меджик_квотес=офф PHP: <?php $login = substr($_GET['login'],0,8); $password = substr($_GET['password'],0,8); $login = str_replace('#', '', $login); $login = str_replace("-", '', $login); $login = str_replace('*', '', $login); $password = str_replace('#', '', $password); $password = str_replace("-", '', $password); $password = str_replace('*', '', $password); $login = preg_replace("/and|or/i","fuck",$login); $password = preg_replace("/and|or/i","fuck",$password); $query = "select * from `admin` where login = '$login' and password = '$password'"; $result = mysql_query($query); if(mysql_num_rows($result) > 0) { //в админке } . . . ?>
Народ,ща я с мобилы,поэтому добавлять ваши задания/ответы не могу. Подумаю над разделением заданий на темы. В планах сделать 100 заданий) и сделать пдфку! 100 пхп заданий
а ничего что Code: $login = preg_replace("/and|or/i","fuck",$login); разве замена 'or' не произойдет?
Так ведь не прокатит PHP: $login = preg_replace("/and|or/i","fuck",$login); Суть в том, чтобы обойтись без or
Хм, правда не знаю Почти на 100% уверен что метод отсекает "and password = '$password'" так как с ним замутить выборку, не зная пароля имхо нереально. Возможно, юзается неизвестный науке тип комментария?
ОМФГ точно, что то у меня с приоритетами логических операций глюк в голове вышел ))) Gifts, крут, не проверял правда, но на глаз оно. З.Ы. Я предполагал, что (...) or '1' мускуль скушает как истину, но что то упёрся я в этот login и все туда пытался подставлять
Отлично, это работает. Я сам виноват, нужно было учесть || . Усложняем задачу: добавляем фильтрацию | и ограничение на 6 символов (хотя конечно логин и пароль на 6 символов – бредово для реальных условий, ну да ладно) PHP: <?php $login = substr($_GET['login'],0,6); $password = substr($_GET['password'],0,6); $login = str_replace('#', '', $login); $login = str_replace("-", '', $login); $login = str_replace('*', '', $login); $login = str_replace('|', '', $login); $password = str_replace('#', '', $password); $password = str_replace("-", '', $password); $password = str_replace('*', '', $password); $password = str_replace('|', '', $password); $login = preg_replace("/and|or/i","fuck",$login); $password = preg_replace("/and|or/i","fuck",$password); $query = "select * from `admin` where login = '$login' and password = '$password'"; $result = mysql_query($query); if(mysql_num_rows($result) > 0) { //в админке } . . . ?> Задача та же - обойти авторизацию
ElteRUS Эээ, в рот мне ноги, я не понимаю почему это работает, но, ведь, работает Code: ?login=\&password=%2B' Уточняю, выбирает из таблицы почти все записи +- 400 (из 40к) С другими таблицами и другими серверами мускуля - тоже самое, выбирает записи, но не все
Хм, да это то, только своеобразно оформлено но сути не меняет, твой вариант даже круче )) Я рассчитывал на такое: Логин '=' Пароль '=' Либо так a'='a в логин и пароль. Давайте посмотрим на получившиеся запрос: PHP: select * from `admin` where login = 'a'='a' and password = 'a'='a' Такой запрос прокатит. Выполните у себя на локалхосте PHP: Select * from mysql.user where user = 'a'='a'; Выведутся все записи таблицы. Ну тот факт, что mysql поддерживает прямое сравнение строк – известен. Но дальше круче )) Выполните такое PHP: Select * from mysq.user where user = 'aasdfsdf'='usu'; И это прокатит. Хотя очевидно, что эти строки не равны. Твой пример из той же оперы Code: select * from `admin` where login = '[COLOR=Indigo]\' and password = [/COLOR]'%2B'' Только здесь видно что кроме = может быть и +, а так же * - )))
Объясните пожалуйста по зад.34. echo (int)((0.1+0.7) *10); почему выводит 7? и 8 если echo (int)(0.8*10)... каким образом сумма в скобках влияет на результат? ведь 0,1+0,7=0,8 и при приведении к целому, д.б. просто откинуться дробная часть...
Подробное разъяснение случая с 'а'='б'='с' http://bugs.mysql.com/bug.php?id=39337 это не баг,а преобразование типов. Фамнам, это непредсказуемо в некоторых случаях,зависит от платформы ,на которой исполняется пхп код.
38. PHP: <?php function ch($num,$str){ $res=str_split($str); $i=0; while ($i < count($num)){ $cn=$num[$i]-1; $res[$cn]=strtoupper($res[$cn]); $i++; } return implode("",$res); } ?>