ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

[MySQL][ЗАМЕТКА] Where name ='a' ='b'
  #1  
Старый 04.09.2009, 14:40
Аватар для Krist_ALL
Krist_ALL
Banned
Регистрация: 14.01.2009
Сообщений: 515
Провел на форуме:
1996429

Репутация: 468


Отправить сообщение для Krist_ALL с помощью ICQ
По умолчанию [MySQL][ЗАМЕТКА] Where name ='a' ='b'

Хочу разъяснить непонятку с name='a'='b'

Допустим, у нас есть такой запрос:
PHP код:
SELECT FROM users WHERE name='admin'='a' 
Давайте посмотрим, как такой запрос обработает mysql:
1. name ='admin'='a' разбирается как ('name'='admin')='a'
2. Идет сравнение 'name' и 'admin'. Эти строки не равны => результат 0
3. Идет сравнение 0 и 'с'. Разные типы данных. Булевой и стринг. Происходит преобразование типа стринг в булен и 'с' превращается в 0
4. 0 =0 => 1 => TRUE

Замечания:
1. Mysql должен быть настроен на преобразование типов
2. Mysql должен быть настроен так, чтобы при сравнении 'а' и 'с' получалось 0, а не false, потому что если скобка даст false, тогда 'с' будет преобразовано в true => false != true => return 0

Источник: http://bugs.mysql.com/bug.php?id=39337
 
Ответить с цитированием

  #2  
Старый 04.09.2009, 21:16
Аватар для cr0w
cr0w
Познающий
Регистрация: 11.09.2008
Сообщений: 99
Провел на форуме:
2753780

Репутация: 585
По умолчанию

Спасибо за эту темку - весьма интересная фича MySQL'а в плане безопасности. Единственно, не могу не заметить, что ты не очень верно все разьяснил. Смотри:
Цитата:
Сообщение от Krist_ALL  
1. name ='admin'='a' разбирается как ('name'='admin')='a'
2. Идет сравнение 'name' и 'admin'. Эти строки не равны => результат 0
Это не так. `name` это название колонки - оно не будет сравниваться со строкой как строка. Будет произведена выборка по условию name ='admin'='a'. Т.е. значения колонки `name` всех строк таблицы будут поочередно проверяться на соответствие этому условию, и они все будут ему соотвтствовать, кроме строки, где name='admin', т.к. выражение 'admin'='admin'='a', собственно, будет возвращать FALSE.

Последний раз редактировалось cr0w; 04.09.2009 в 21:19..
 
Ответить с цитированием

  #3  
Старый 04.09.2009, 23:07
Аватар для Krist_ALL
Krist_ALL
Banned
Регистрация: 14.01.2009
Сообщений: 515
Провел на форуме:
1996429

Репутация: 468


Отправить сообщение для Krist_ALL с помощью ICQ
По умолчанию

Говоря о name, я подразумевал что вместо наме будет подставляться значение.Я все правильно написал.
И ты правильно заметил, что where admin=admin=a => false
 
Ответить с цитированием

  #4  
Старый 04.09.2009, 23:43
Аватар для cr0w
cr0w
Познающий
Регистрация: 11.09.2008
Сообщений: 99
Провел на форуме:
2753780

Репутация: 585
По умолчанию

По-моему, ты все-таки написал не совсем то, что подразумевал. (; Ну да ладно, думаю, кому это интересно будет, тот разберется.

Вот у меня только возник вопросик: а как в mysql можно настроить такие тонкости преобразования типов ?
 
Ответить с цитированием

  #5  
Старый 05.09.2009, 00:14
Аватар для ElteRUS
ElteRUS
Постоянный
Регистрация: 11.10.2007
Сообщений: 406
Провел на форуме:
7215020

Репутация: 1423
По умолчанию

Цитата:
Сообщение от Krist_ALL  
1. name ='admin'='a' разбирается как ('name'='admin')='a'
Что-то тут такое наворочено не понятно. Лучше б переписал примеры с источника, там не нужно угадывать что подразумевалось

Между прочим, там упоминается также об именах колонок

Код:
select * from mysql.user where password=1    - нету результата (это и понятно)
select * from mysql.user where password=password=1   – есть результат  
select * from mysql.user where password=password   – есть результат
Если авторизация реализована как в той моей задачке, но переменные не обрамляются кавычками в запросе, можно воспользоваться именами столбцов для обхода авторизации (всего лишь как один из возможных вариантов)

PHP код:
<?php
        $log 
$_GET['log'];
        
$pass $_GET['pass'];

                          .   .  .

        
$query "select * from `admin` where login = $log and password = $pass";

                
$result mysql_query($query);

                if(
mysql_num_rows($result) > 0)
                {
                            
//в админке
                
}
?>
Authorization bypass:
script.php?log=login&pass=password

(правда нужно знать имена столбцов ^^)

Последний раз редактировалось ElteRUS; 05.09.2009 в 00:23..
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ