Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Почему-то вместо пароля - звездочки
 
 автор: Антоха   (15.01.2008 в 11:43)   письмо автору
 
 

Еще раз здраствуете.
Подскажите пожалуйста, почему вместо пароля, выдает 5 звездочек?
И без разницы к какой учетной записи я делаю запрос, пароль почему-то всегда выдает "*****"
Причем, если, например, учетная записить такого типа:
login = anton
pass = NetCom
То запрос
select pass from таблица where pass='NetCom';
Тогда всё нормально и результат - netcom
но если сделать так
select pass from таблица where login='anton';
то результат - *****
Это что шифрование какое-то?

   
 
 автор: cheops   (15.01.2008 в 14:13)   письмо автору
 
   для: Антоха   (15.01.2008 в 11:43)
 

А кто выдаёт?

   
 
 автор: dima2207   (15.01.2008 в 15:32)   письмо автору
 
   для: Антоха   (15.01.2008 в 11:43)
 

Приведите код который заносит данные в бд .

   
 
 автор: Антоха   (15.01.2008 в 22:24)   письмо автору
 
   для: dima2207   (15.01.2008 в 15:32)
 

В общем, не буду ходить вокруг до около. Так как знания в пхп и mysql у меня не большие и я только еще пока создал первый нормальный проект, и прежде чем выпускать его в инет, решил
почитать про основый безопасности, т.к. до этого слышал о sql-иньекциях и т.п. Начал я про это все читать где-то неделю назад и узнал много нового в том числе и про mysql. Плюс к своему ужасу понял, насколько я был наивен по защите информации и проверке $_GET, $_POST и т.п. данных.
Извините конечно, что сразу не задаю конкретный вопрос, а сейчас распишу немного ситуацию, возможно кому-то будет интересно почитать, не все же вундеркиндеры.
----------------------------------------------------------------------------------------------------------
В общем, после 3-4 дней изучения разных спобобов инъекций, хотя каких там способов, везде одно и тоже написано и обычно только пишут про union + когда можно вводить апосторофы.
Потом наткнулся на статью, написаную аж в 2004 году. Там есть интересный способ, который работает в не зависимости от версии бд, который основывается на добавление дополнительных условий и если они истины, то страница выдает точно такую же страницу, как если бы мы ее запрашивали без этих истиных условии. Если не истино условие, то выдается обычно пустая страница:
Т.е. если, например, есть страница
www.site.ru?id=1

то при при добавлении условия
www.site.ru?id=1+and+1=1

Т.к. условие 1=1 - истино, то никаких изменений не произойдет и мы будем находиться, на той же странице www.site.ru?id=1
А если поставить +and+1=2, то будет в большинстве случаев пустая страница.
Вот там и написано про такой способ, приведено нормальное кол-во разных небольших примеров и дальше говорится, что этих способов много и все зависит только от фантазии атакующего.
И я вот последние несколько дней эксперементировал с такими разными условиями и добился не плохих результатов. И все свои испытания я проводил сначало на себе, а потом пытался их реализовать на одном проекте в нашей локальной сети. У админа там есть база фильмов, где я нашел, правда только пока один параметр уязвимый к sql-инъекции.
(сейчас уже не важна имено эта база фильмов, а важно какие еще есть базы, работающие под этой учетной записью)
В общем, если вернуться сейчас на несколько дней назад, то атака начиналась бы так:
Есть основная страница
http://192.168.1.50/filmbase/found.php?order=name&janr=5
сейчас бы делал так (буду писать только добавочные условия)
+and+(select+count(schema_name)+from+information_schema.schemata)>5

Ничего не изменится, если кол-во баз данных больше 5

+and+(select+count(schema_name)+from+information_schema.schemata)>10

Выдаст пустую страницу (или опред. пустой результат в ней) если кол-во баз меньше 10

Т.е. мы просто перебираем и ждем пока не вернемся на не пустую страницу, следовательно, выражение истино.
Допустим, мы нашли 8 баз данных.
Теперь, например, берем первую базу.
+and+length((select+schema_name+from+information_schema.schemata+limit+0,1))>10

Если страница не пустая, то название базы данных больше 10 символов.

+and+ascii(lower(substring((select+schema_name+from+information_schema.schemata+limit+0,1),1,1)))=97

Если страница не пустая, то код первой буквы равен 97 (т.е. англ. "а")

Можно выяснить пользователя этой базы
+and+ascii(lower(substring(user(),1,1)))=97

Истино если начинается на англ. букву "а";

Допустим выяснили, что это root@localhost, теперь можем узнать привилегии этого пользователя.
(select is_grantable from information_schema.user_privileges where grantee='root@localhost' and privilege_type='insert')='yes';

Если вернет yes - значит можно вставлять (insert), no - нельзя, еще может вернуть пустое значение, которое наверное обозначает, что нельзя.
Понятно, что если нельзя вводить апострофы, то заменить все на char(), т.е. например, grantee='root@localhost' на grantee=char(114,111,111,116,64,108,111,99,97,108,104,111,115,116)

Т.е. понятен смысл, и так мы можем очень много узнать, точнее даже почти все что нужно про другие базы, сколько их, сколько в них кол-во таблиц, полей и соответсвтенно содержимое этих полей. И как теперь мне стало ясно, то если, например, ты сделал какой-нибудь проект, вроде бы в этом проекте все предусмотрел, применяешь там разные функции: htmlspecialchars(), substr() и т.п. но если рядом под этим же пользователем есть другая база, какой-нибудь говененький опросик, защите которого ты не предал особого значения, то с помощью этого опросика по идее, как я выше описал можем получить какую-нибудь информацию из этого проекта.

В ручную перебирать конечно очень долго, то для этого лучше написать какой-нибудь эксплоит, например, на перл или на чем-нибудь другом. Так как я только знаю немного пхп, а другие языки не знаю, то сначала думал, что на нем такой эксплоит врядли можно сделать, пока не вспомнил про хорошую функцию:
file_get_contents() - которая грабит страницу. И уж был удивлен, когда смог написать "эксплоит".
Все впринципе просто, посылаю запрос функцией file_get_contents() , где задаю необходимые условия с опред. параметрами, дальше граблю страницу и если в ней нахожу искомое слово, а оно будет, если только уловие истино, тогда возвращаю результат, иначе меняю параметры и снова вызываю функцию file_get_contents().
Примерно, вот так (кусочек кода).

<?php
// где, $http - запрос; $switch - добавочные условия
$file file_get_contents($http.$switch);
// если есть название фильма "Дом на Турецкой"    
if(preg_match("|(?:Дом на Турецкой)|i"$file)) continue;
?>


Думаю, что не открыл Америку, но сколько не искал в инете, то нигде не видел, чтобы писали про что-то на подобии такого. Может это и не самый лучший способ, но по идее должны рассматриваться разные варианты. А сколько не искал подобной инфы, на всех сайтах написано впринципе одно и тоже.
----------------------------------------------------------------------------------------------------------
Вот, вопрос мой уже был задан, но только он идет в такой инъекции (для наглядности не стал писать в char() ), т.е.
+and+((select+forum.login.pass+from+forum.login+where+name='anton'))

выдает *****
+and+((select+forum.login.name+from+forum.login+where+name='anton'))

выдает anton
если написать так
+and+((select+forum.login.pass+from+forum.login+where+pass='NetCom'))

выдает netcom
+and+((select+forum.login.name+from+forum.login+where+pass='NetCom'))

выдает anton

Вот почему так происходит?
Если по какой-то причине нельзя отвечать на такого рода вопросы, то можете хотя бы сказать, возможно ли узнать пароль, т.к. если можно, то вдруг найдется какой-нибудь маразматик с прямыми руками и проделает такой же фокус и вытащит пароли, так что он тогда узнает и мой пароль, пароль моего брата, пароли моих знакомых. А этого не очень хочется...
Если это какой-то метод шифрования, который врят ли можно расшифровать, то как тогда мне реализовать такую же фишку?

   
 
 автор: Unkind   (16.01.2008 в 00:11)   письмо автору
 
   для: Антоха   (15.01.2008 в 22:24)
 

Извините, Вы так много написали, что я читать не стал :) Просто я не понял. Вы хотите кого-то взломать?

   
 
 автор: Trianon   (16.01.2008 в 00:20)   письмо автору
 
   для: Антоха   (15.01.2008 в 22:24)
 

многобукав. ниасилил.

   
 
 автор: Unkind   (16.01.2008 в 00:24)   письмо автору
 
   для: Trianon   (16.01.2008 в 00:20)
 

Ха. Хотел сказать подобное. Да форум не тот...

   
 
 автор: Антоха   (16.01.2008 в 01:57)   письмо автору
 
   для: Unkind   (16.01.2008 в 00:24)
 

Не нуно пугаться таких больших сообщений :)
А зачем все читать? Вы люди должны быть грамотные, в самом начале должны были все понять, а новичков тут много, может кому-нибудь и пригодились бы такие знания.
Ну если нет времени читать, напишу заного по короче.
>Unkind
Извините, Вы так много написали, что я читать не стал :) Просто я не понял. Вы хотите кого-то взломать?
Да. Точнее, я уже все как бы взломал.
Объясняю, у нас есть локальная сеть. Есть главный сервак. На этом серваке есть веб-проект - база фильмов, где есть описания этих фильмов. И вот мы там ставим оценки разным фильмам, пишем комментарии и т.п.
Вот я решил проверить на sql-инъекцию эту базу фильмов. Инъекция прошла успешно.
Немного повозившись я получил нужную себе информацию, в том числе логины и пароли этой базы. Затем я решил посмотреть (при помощи инъекции) какие базы еще есть. Оказалось 8 штук. Выбрал себе 2 интересные по названию базы данных. В первой для себя всё что нужно узнал.
Потом приступил ко второй. Нашел в ней нужную таблицу (login), нашел в ней нужные столбцы (name и pass)
Вот загвоздка в том, что логины я получаю, а пароли выводятся как *****
Если же в эту таблицу со столбцом pass добавить where pass='Существующий пароль', то он выводиться нормально.
Дак вот вопрос, почему так происходит? В следствии чего это? Ведь у других баз я выяснил пароли, а тут звездочки.
Вот мне это и стало интересно, чтоже это за фишка такая...
Если по какой-то причине, запрещено отвечать на такого рода вопросы (хотя в правилах такое не написано), то пожалуйста хотя бы подскажите, как мне добиться такого же эффекта *****

   
 
 автор: Trianon   (16.01.2008 в 02:15)   письмо автору
 
   для: Антоха   (16.01.2008 в 01:57)
 

Может в таблице просто по две строки на каждый логин?
В одной в pass звездочки лежат (специально для таких любопытных), в другой - реальный пароль.
Хотя проще, конечно, было нормально входные данные обработать.
Но у нас же никогда прямых путей народ не ищет..

   
 
 автор: Антоха   (16.01.2008 в 03:29)   письмо автору
 
   для: Trianon   (16.01.2008 в 02:15)
 

Спасибо. Я уже почти все сделал. Зашел написать об этом и увидел:
>Trianon
>В одной в pass звездочки лежат (специально для таких любопытных), в другой - реальный
пароль.
Вы почти угадали.
Когда допер на себе попробовать:
limit 0,1 - *****
limit 1,1 - получаю пароль
Воодушевленный и гордый собой пошел пробовать другие логины и еще было примерно минут 10 тупижа у меня, т.к. оказалось, что пароль у каждого логина на разных лимитах, например, получаю только на limit 6,1, а на других выдает звездочки.
Лично я вообще почти нихрена не понял, какая там структура в таблице login в этих двух полях name и pass сделана. Ну да ладно, главно что есть результат.
Спасибо за ответы.

   
 
 автор: Unkind   (16.01.2008 в 09:51)   письмо автору
 
   для: Антоха   (16.01.2008 в 03:29)
 

Вот так вот и бывает. Раздуваются те, кто толком и не знает синтаксиса SQL...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования