Пользователь
0,0
рейтинг
20 января 2011 в 23:05

Разработка → Дыра на free-lance.ru из песочницы

Находка

Всё начиналось как обычно. Очередной вечер в поисках маленького проекта на 2-3 часа. Оставляю комментарий к проекту и жду ответа. Обновляю страницу, начинает тормозить интернет, нервничаю, раз 5 подряд жму F5. И что же я вижу:



Я искренне удивляюсь такой картине и обновляю страницу. Вижу что и должен — главную страницу. Решил повторить. Опять также самая ситуация. Просмотрев мельком код, решил прогуляться по include'ам, и тут обнаружил, что всё, что лежит в "/classes" отдаётся в исходных кодах без всяких дополнительных манипуляций. А вот и заветный config.php:



Саппорт

Ну поигравшись с файлам, пришло время писать саппорт проект. Описал проблему, условия возникновения. На следующий день мне ответили, поинтересовались используемым ПО и «С какой целью вы анализируете исходный код сайта?». Подробно ещё раз всё описал, приложил скриншоты. Ещё через один день поблагодарили за участие в жизни проекта и сказали, что исправят ошибку к утру. Мой гражданский долг был выполнен. Я могу спать спокойно.

Но не тут то было. На следующий день решил проверить работу саппорта. При попытке просмотра файлов из папки «classes» всё отлично — 403 ошибка. А вот index.php и все остальные файлы из корня, по-прежнему, отдаются при многократном обновлении страницы. И продолжалось это безобразие ещё примерно неделю. Вот теперь точно можно быть спокойным.

P.S. Всё это происходило в начале декабря. Публиковать не собирался, но так же как и многие получил сегодня письмо о «ежегодной смене паролей», прочел топик "Принудительная смена паролей на сайте, или забота о моей безопасности. Или free-lance.ru сломали?" и решил, что опубликовать стоит потому, что ничто не мешало увести базы.
Сергей @WildZero
карма
41,5
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (196)

  • +5
    Интересно, что это за баг, при котором отдается исходник? Может, какая-то защита не так сработала?
    • +50
      Этот баг называется «кривые руки администраторов и программистов»
      Файлы должны лежать выше корня! Тогда всё, что увидит при сбое сервера потенциальный злоумышленник:
      <?php require_once '../engine/index.php';
      
      • +12
        наверное перемудрили с защитой от DDoS, но вместо статики или заглушки отключалась интерпретация PHP и отдавался исходник.
        • 0
          Показ исходников из корня ещё можно как-то объяснить. Но вот почему файлы из classes отдавались в исходников без всяких дополнительных манипуляций — загадка.
          • +24
            Потому, наверное, что разработчики сего чуда получают не так много денег. Мне шепнули, что человеку из каталога специалистов по ИБ предлагали вчера (рассылкой, второе письмо) работать на них за 20 тыщ. О какой безопасности может идти речь с такими зарплатами.
            • +8
              В наших краях программист, который зарабатывает 20к — уважаемый человек = )
              • +5
                Что-то у Вас совсем уж дальние края.
                • +3
                  Для небольших городом (300-400к населения) это нормальная зарплата.

                  Например вот опрос на неофициальном сайте г. Нижнекамск, посетители сайта это жители города от школьников и заканчивая пенсионерами, различные слои населения (встречался с активным косятком сайта несколько раз :)
                  www.pronk.ru/content/vash-ezhemesjachnyj-dohod

                  Больше 20 000 з/п только у 14% опрошенных
                  • +3
                    Нормальный программист хоть в деревне с 10 тыс. населения может получать 1000-2000$ без особых проблем, удаленную работу никто не отменял и специалисты всегда нужны.
                    • +2
                      Это уже зависит от личности программиста :)
                      Бывают люди, которые не любят удаленную работу.
                      Бывают люди, которым не нужно зарабатывать 1-2к$ потому что их 700, которые они получают спокойно сидя в офисе в своем городе, им с лихвой хватает на все потребности и еще нормально остается на излишества типа сходить в ресторан побухать и т.д.
                      • –1
                        странные какие-то люди, если честно
                        • +2
                          Не у всех самоцель заработать больше денег.
                          Если денег хватает на все, что нужно — зачем больше? Под матрас складывать чтоли?
                          • +4
                            я абсолютно согласен, что не деньги рулят в жизни. но я просто не представляю как может хватать 20т на все. Ну ладно, ты такой аскет, можешь на фигне прожить. Но жена, дети, квартира наконец. Впрочем тем, кого кормят родители это может быть непонятно :) Вон, Перельман тоже поди нормальный :)
                            • +3
                              Об аскетизме никто не говорит. Вот смотри расклад:
                              1. Мы с женой тратим сейчас примерно 2000-3000 в неделю на еду домой (фрукты, мясо, всякие картошка и т.д.)
                              2. Я в неделю трачу примерно 1500-2000 на проезд на работу/с работы и обеды на работе, жена не работает, обеды сама себе готовит дома.
                              3. 1500 средняя квартплата
                              Ну +- еще пару тыщ бывает потратишь на что нибудь.

                              Итого 25 000 в месяц это так сказать прожиточный минимум для семьи из 2 человек в городе миллионнике, где доехать до работы стоит 150-200 рублей на такси, а обед на работе еще в 100р встревает.

                              В маленьком городе же цены еще ниже за счет: более дешевого проезда, более низких цен на обеды, там в неделю у обычного работника уходит гораздо меньше тысячи, порядка 500-700 рублей, если не меньше.

                              Итого в небольшом городе «прожиточный минимум» для 1 человека примерно 10 000, это чтобы жить без напрягов, дома всегда была еда и т.д. При з/п 20 000 у обычного человека, который живет 1, остается еще 10 000 на «не-аскетское» существование.

                              10 000 это достаточно чтобы каждый день ходить в кино (100 рублей билет + 150 рублей попкорн)

                              10 000 это достаточно чтобы 2-3 раза в неделю ходить и бухать в хорошем баре (1000 — 1500 рублей это 3-4 литра приличного темного пива + закуска (гренки и т.д.) + 1 горячее блюдо)

                              Что еще надо для не-аскетского существования? :)

                              Я если что не про себя говорю, у меня жена и ребенок на подходе, да и город не маленький, но в небольших городах знаю множество семей, которые живут на з/п 20 000 в месяц и не жалуются, если и муж и жена работают то денег вполне хватает.

                              Насчет квартиры — например нижнекамск живет за счет нижнекамскнефтихима — огромного завода, который кормит весь город. Сейчас добавляют еще 1 завод — танэко. На танэко ищут молодых специалистов, кому негде жить — выдают квартиры, которые через некоторое время переходят в собственность, или ее можно купить по ипотеке по спец условиям, например когда за тебя вносят первый взнос, или значительную его часть, а ежемесячный платеж тоже частично или полностью оплачивается работодателем, с условием естесвенно что ты довольно долго будешь у него работать.

                              В общем 20 000 в маленьком городе это довольно богатая жизнь.
                              Аскетская это 5-7 т.р., но и так люди тоже умудряются проживать.
                              • +4
                                жизнь удалась, чо :)
                              • +5
                                «1500 квартплата» — я так понимаю, у вас собственная квартира (т.к. на арендную плату ну о-о-очень непохоже)? Причём не купленная в ипотеку?
                                Ну так это совсем другой расклад.
                                • 0
                                  Ну насчет квартиры как я уже говорил тут тоже есть варианты:
                                  — соципотека, если работаешь на госучерждении — там довольно низкие ежемесячные выплаты
                                  — служебная квартира — в нижнекамске например я когда последний раз интересовался они специально для молодых семей отгрохали коттеджный городок, и там выдают 1 коттедж на 2 семьи, два отдельных входа и т.д. Причем с мебелью и всем остальным. Если не семья а одинокий работник то ему просто служебную однушку. Если долго работаешь то вроде есть варианты перехода в собственность этого жилья.

                                  Можно тупо снять квартиру, ну там подороже, в небольшом городе вроде порядка 4000 это будет стоить за однокомнатную (а зачем больше если один живешь). Т.е. надо накинуть сверху еще 2.5, остается 7500 на гуляния — что ж пару раз придется обойтись без ресторана :)
                                  • 0
                                    Что то вы брешите!
                                    Какие к чорту 4тысячи в месяц?
                                    10 как минимум.
                                    Живу в Чите.
                                    • 0
                                      10 000 минимум это ипотека или съеманая квартира?

                                      Для казани 10 000 за съем квартиры это уже можно найти трехкомнатную квартиру, 8 000 это двухкомнатная в хорошем районе

                              • +1
                                Даже для белорусского города, с населением 400К, приведенные вами расценки слишком занижены. :) На 300$ у нас даже нормально не проживешь. Рента — 150, кварплата — 100, еда — 150, и это еще по божески… итого 400$
                                А интернет, и пр.?

                                500$ — прожиточный минимум даже для белорусской провинции, и я не преуменьшаю…
                                • 0
                                  Это на одного человека. Для Минска x1.5.
                                  Для Москвы, я полагаю, хотя бы 30 тыс.
                                  • 0
                                    Речь не о москве, а о российской глубинке.

                                    Расценки вполне реальные, забыл только про интернет: надо еще тысячу накинуть на интернет и телефон
                                  • 0
                                    Просто я сам лично жил 2 года на 8 т.р. в месяц, правда у меня была своя квартира. Если бы не было нужно к этой сумме добавить 4к за съем квартиры, у меня друг за такие деньги в это же время снимал.

                                    Итого 12к вполне хватало мне на месяц когда я был студентом, в эту сумму входил и интернет, и квартаплата, и квартира, и еда и еще побухать 2-3 раза в неделю, и изредка купить какую нибудь одежку
                                    • 0
                                      Ну, прибавьте инфляцию, и получите почти 15к. Прожиточный минимум на одного _в провинции_. :) О чем я и говорил.
                                      • +1
                                        В том то и дело что жил я не в провинции а в миллионнике:)
                        • –2
                          гы, странные люди меня заминусовали :)))
                    • 0
                      Мне всегда казалось что удаленная работа выгодна для работодателя тем, что не имеет смысла порой платить в питере кодеру 50к, если сибиряк будет делать тоже самое за 20к. Пускай и удаленно.
                      • 0
                        Равшаны накодят за 5 000 руб
                        • +3
                          Зря утрируете. Удаленная работа — идеальное решение для того, чтобы люди в глубинке могли заработать немного больше чем у себя, а работодатель заплатит намного меньше, чем у себя в городе. При этом удалённик экономит время и средства для «походов» на работу, а работодатель на «содержание» рабочего места.
              • 0
                а в наших и 10К неплохая зарплата. Даже чуть выше средней ))
              • 0
                здесь речь идет о столичном офисе, как я понимаю
            • +1
              Не хотелось отвечать на вашу провокацию. Но всё таки напишу комментарий чтобы развеять данные слухи.
              Мы никому вчера не предлагали у нас заниматься ИБ за «20 тыщ».

              Я прекрасно видел из чего вы высосали данную «информацию».
              Пруф линк на ваш же блог:
              habrahabr.ru/blogs/infosecurity/112173/#comment_3588736

              Человек написал, что ему приходило предложение о работе в котором было сказано, что его профиль нашли на нашем сайте.
              Какое отношение администрация сайта имеет к данному предложению — вообще загадка.
              Кроме того, вы ещё и от себя добавили: «что человеку из каталога специалистов по ИБ».
              Судя по профилю, человек не занимается ИБ и вы это придумали для полноты картины.
              А про «20 тыщ» вообще ниже написал другой человек.

              yellowpress, мечтает о вас )
              • 0
                Допустим, предложение не от вас. Но даже с той формулировкой, что приведена в цитате, можно смело вас подозревать, т.к. ваше же письмо о смене паролей составлено не шибко рационально и конкретно.
                • +1
                  Я вам честно скажу, что если бы такое предложение было, то оно исходило бы от меня.
                  И я бы об этом знал :) Поэтому в данном случае вы сделали выводы из воздуха.
                  Для подтверждения моих слов достаточно запросить скриншот письма у того человека. Я совершенно точно уверен, что он разрушит все ваши подозрения.
          • +2
            Что-то сомнительно выглядит файл класса)).
            • +15
              — как на пэхе сделать клсаа?
              — положить его в папку classes?
              • +68
                А откуда у вас переписка админов free-lance.ru?
          • +9
            — Здрасьте, я админ. Нужен портал, суть такова…
            — Напишу за отзыв!
      • +8
        По хорошему в корне сайта вообще не должно быть исполняемых скриптов. И сервер не должен поддерживать их исполнение. Тогда, даже если злоумышленник в корень эксплойт протащит, он не сможет его исполнить.

        По крайней мере я свои проекты в таком режиме стараюсь использовать :)
        • 0
          А что мешает злоумышленнику «протащить» эксплоит не в корень сайта, если уж такая возможность есть?
          Или вы имеете ввиду хранить скрипты выше docroot веб-сервера?
          • +3
            Да, хранить скрипты выше docroot. Ну и держать их в R/O. А в docroot'е (и каталогах, доступных на запись) — запретить исполнение всего.
            • 0
              Раз пошла такая пьянка, спрошу и я: а чтобы отдавался index.php не из docroot мы его прописываем в .htaccess примерно, как RewriteRule ../engine/index.php так?
              • 0
                Я тупо в nginx или lighttpd указываю скрипт-обработчик. Например, так:
                # ...
                set $bors_loader /var/www/$host/bors-site/bors-loader.php;
                # ...
                fastcgi_param SCRIPT_FILENAME $bors_loader;
                # ...
      • –12
        Не всякий хостинг позволяет разместить файлы выше корня сайта. Если же позволяет — тогда да.
        • +11
          у такого крупного сайта хостинг за 5 баксов?
        • +5
          вы считаете, что free-lance.ru хостится на шаред хостинге? :)
          • 0
            У меня на шаред-хостинге, кстати, есть возможность назначить корнем сайта любую директорию. Если что. )
            • +16
              cool story, bro ;)
              • +2
                Не, а вдруг кто не знал? :)
                • 0
                  На самом деле, я не знаю :) Можете просвятить?
                  К шаредхостингам всегда относишься как к некой болванке, где только html\простой php положить можно :)
                  • +2
                    В админке шаред-хостинга на GoDaddy, для каждого домена указывается произвольная корневая директория (может находиться на любом уровне вложенности). Собственно, всё.

                    * просветить
      • +2
        А еще файлы должны лежать в директории, прописанной в include_path
        php.net/manual/en/function.set-include-path.php

        Тогда не надо будет использовать страшные $_SERVER['DOCUMENT_ROOT'] в каждой строчке…
        • +7
          Умнее использовать __autoload() или, еще лучше, spl_autoload_register().

          Вместо $_SERVER['DOCUMENT_ROOT'] использовать getenv('DOCUMENT_ROOT'). Еще лучше приучить себя к получению документ-рут через rtrim(getenv('DOCUMENT_ROOT'), '/').'/', чтобы не думать, поставил админ в хосте завершающий слэш или нет. И, конечно, вынести, в статический метод, например Config::getInstance()->getDocumentRoot.
          • +1
            А еще умнее str_replace( array('/','\\'), DIRECTORY_SEPARATOR, basename(__FILE__) );
            Но только для задания в include_path. Тогда не придется при require заботиться о месте нахождения файла. PHP найдет его где угодно, главное, чтобы путь был в include_path.

            > Умнее использовать __autoload() или, еще лучше, spl_autoload_register().
            тогда и тут не надо будет городить абсолютных путей. Но опять же, эти функции только на случай, когда по имени класса мы определяем путь и имя файла. Есть фреймворки, где это сделано не так. Но в целом согласен ))
            • +1
              «найдет где угодно»
              Да, обожаю таких как вы. Читаешь исходник сначала, а потом ищешь файл пол часа по папках если проект большой.
              • +3
                Такие как мы пользуемся IDE ;)) И компутер ищет файлы за нас ))) Советую!!! blogs.jetbrains.com/webide
                Экономит кучу времени и сил.
                • +3
                  Ага…

                  Значит, это после таких как вы структура include_paths — широка и безбрежна? А методы и атрибуты объектов ОченьДлинныИКрасноречивыЧтобыНеЗабытьИхНазначение?

                  Хорошие практики и стиль в коде — они не зависят от инструмента.
                  • 0
                    Нет, я не говорил, что пишу в include_paths все подряд. Только то, что необходимо.
                  • 0
                    [sarcasm]
                    Да нет же! Мы пишем всегда вот так:
                    class MySprCls{function sPrMThd($r,$d){$d=-$d++|$r--;return $d;}}
                    

                    Дёшево и… коротко! А главное долго изучать будут, а значит чтут!
                    [/sarcasm]
                    • 0
                      Верх крутости — начинать имена классов и всего остального с собственных инициалов. Я до сих пор ненавижу буквосочетание bsw.
              • –1
                В include_path лучше не пихать все подряд.
                Specifies a list of directories where the require(), include(), fopen(), file(), readfile() and file_get_contents() functions look for files.

                Просто использовать в именах классах их позицию в структуре директорий:
                -classes
                    -validator
                        -string
                            -multibyte
                

                Создавать экземпляры, а-ля, new Multibyte_String_Validator(), подключая их в автолоадере через str_replace('_', '/', $sClassName)…

                Холивар по поводу пространства имен просьба не начинать :-).

          • 0
            А лучше использовать фреймворк.
            • 0
              Все зависит от задач.
      • +1
        Корня ваще не должно быть ;-)
    • +1
      Скорее всего там апач на другом порту за nginx прячется, а картинки идут напрямую. Но по кривизне рук отдавали как статику вместе с картинками часть скриптов.
    • +2
      Судя по симптомам, у них несколько серверов, как round robin (или еще какая-то балансировка) подключены. На одном забыли обработку PHP врубить.
      Возможно только подключили его, собственно переконфигурацией и работами на движком и обусловлены тормоза были.

      Но искать и настраивать сбойный сервак неделю… В общем, это только втроем можно. Иначе будет скучно уже к третьему часу и все таки сервер будет донастроен.
      • +1
        Нда. Поторопился, ответ руководителя проекта не прочитал.
        Но мне кажется моя версия убедительней правды с Opera. :)
    • 0
      Судя по скриншотам можно предположить, что это short_tags = Off :)
  • +10
    Скорее всего был просто криво настроен веб-сервер.
  • +25
    Был бы такой сбой ВКонтакте. (Зловещий смех) ^^
  • +9
    Да уж, «ежегодная смена паролей пользователей» и «профилактическое мероприятие»… Теперь они каждый год так фэйлиться будут? =)
  • +12
    WildZero — вы Джентльмен!
    • +78
      Спасибо маме и папе за воспитание.
  • 0
    Вот она, долгожданная статья. Сейчас сделаю на нее ссылку в своем топике.
  • +27
    Жаль, что об этом мы узнали от вас, а не от самой администрации, с её туманным «в целях безопасности»…
  • +1
    Ну пароль и логин к базе еще не позволяет увести ее содержимое. Фильтр по IP же есть. У меня он всегда стоит.

    А вообще странный баг. Как буд-то какой-то модуль не успевает (многократное нажатие F5) исполнится, и поэтому исполняется действие по умолчанию — отдать содержимое файла. Кто объяснит как такое возможно?
    • +1
      у некоторых IP меняется при каждом подключение VPN соединения
      • 0
        Имеется ввиду, что к базе можно подключиться только с 127.0.0.1
        • 0
          все зависит от настроек
      • 0
        Не, я имел ввиду привязку пользователя базы данных к IP. Почти всегда так и есть.
        • 0
          да, чуть выше уже объяснили.
  • +15
    нервничаю, раз 5 подряд жму F5. И что же я вижу:


    Попробовал так сделать на хабре, результат: QRATOR HTTP 503
    Защита от DDoS скорее всего.

    пошел лихорадочно тыкать F5 на сайтах)

  • +21
    Предлагаю законодательно запретить и обязать пользователей выковырять клавишу F5 со своих клавиатур, как вредоносное средство для проведения DDoS атак =)
    • +2
      да легко, заставляйте. Все равно у меня есть Refresh =)
    • +3
      CTRL+R, не?
    • +2
      В опере дык вообще есть функция — обновлять с интервалом.
      Запустил сайт в 10 вкладках и обновляешь в каждой его раз в секунду, а сам спишь
  • +4
    Бывает. Только на минутку: «А ничего, что я когда-то туда перечислял деньги?». А код то, говнокодец, не для командной разработки. Интересно, что там глубже и как написано.
  • +1
    Очевидно, администрация была занята загребанием вечнозеленых единиц, вот и не успела за месяц дырку залатать.
    ONEGiN, а почем нынче база фрилансру? :)
  • +2
    Столько интересного вокруг может найтись, если что-то нестандартно делать. Везде нужно тестеров)


    • +57
      Давеча заметил что если ручку смесителя в ванной поставить в среднее положение (не у всех смесителях есть такое) и открыть горячую и холодную воду, то холодная будет вытеснять горячую (затрат воды нет, она просто перетекает из трубы в трубу) и при этом счетчик горячей воды крутится в обратную сторону. Даже не знаю, писать баг-репорт или нет)
      • 0
        Гы. Это шутка? Или чистая правда?
        • 0
          Правда) Конечно может быть и наоборот, горячая вытесняет холодную, надо смотреть что б было слабенькое давление горячей)
          • +6
            А должны стоять клапана, перед каждым счетчиком.
      • 0
        Счётчик горячей воды крутится в обратную сторону, но счётчик холодной — в прямую.
        • +14
          Это да, но холодная то дешевле в разы)
        • +4
          Но горячая-то дороже!
          • +1
            Если достаточно активно крутить горячую в минус, то можно заработать :)!
      • +30
        Простите меня, но ваш комментарий написан более мелким шрифтом. Что это значит? Вы гном?
      • +1
        Туда куда вы хотите написать баг репорт, не знают что такое баг репорт. (и не надо им знать, хе-хе)
      • +2
        Осторожнее! Читерство может быть причиной бана.
        • +17
          ONEGiN заблокирован администратором . Причина бана: использование не документированных возможностей смесителя.
        • 0
          Главное — счетчик в минуса не загнать.
          • +2
            Угу, а то еще должны останутся…
      • +3
        исходник смесителя можно?
        • +1
          он проприетарный
      • +10
        А потом соседка сверху (вероятно) удивлялась, почему у ней и из «холодного „и из “горячего» одинаково теплая вода идет…
      • 0
        У вас не правильно сделана система водоснабжения. Скорее всего подключен водонагреватель, через который это дело и происходит.
  • 0
    Как вообще, сайт открывался (php интерпретировался) если некоторые модули не открывались и не интерпретировались?

    Уму не прилажу, как так можно сделать специально.
    • 0
      Так самому PHP пофиг, хоть файл *.exe через require/include подсовывай, все равно будет его интерпретировать как скрипт на PHP. А вот nginx или бэкэнд, если nginx там выступает только как прокси, при неумелом/неосторожном обращении вполне можно сконфигурировать на такое странное поведение. Другой вопрос, куда смотрели ответственные за безопасность и администрирование люди, ведь если первый прокол, с F5, я бы простил, то как можно было недоглядеть за /classes/*.php…
  • +2
    Интересно, почему автолоадом не пользуются… (про код)
    • 0
      А что вы удивляетесь? Они даже deprecated short tags используют.
  • 0
    Скорее всего short_open_tags выключили, а потом исправляли <? на <?php
    • 0
      хотя какой нахер short_open_tags при многократном открытии страницы, тут видимо интерпретатор php не успевал обработать запрос.
      • +2
        С баша:

        9th: я хуже разработчиков не встречал
        9th: у них руки не то что из жопы растут, у них руки в жопу расту

        Описывает на 100% работу спецов фриланса :)
      • +13
        Скорее всего, если у них не один сервер, а несколько за лоад балансером, то один из них не был неправильно настроен и когда реквест шел на него, получался вот такой фейл. Остальные были ок и для других запросов отдавался правильный контент
  • 0
    Кто-нибудь может объяснить глубокий смысл массива $g_folders? :)
    • +6
      Это точка g сайта free-lance.ru. Если поменять значения этого массива, то всем пользователям будет оплачен pro на полгода.

      Так-то.
    • +1
      Для того чтобы понять смысл, нужно работать за еду и быть школьником :) А у них на проекте по всей видимости именно такие «спецы» и работают.
  • +1
    Ой красавцы блин :)
  • +1
    друзья, какой фриланс?
    вы вон посмотрите что сделали с сайтом Связнойбанк
    www.svyaznoybank.ru/
    • –1
      Редирект?
      • 0
        да, там вчера вечером вообще непонятно что открывалось, я обслуживаюсь в этом банке, хотел вчера зайти в инет банк а там вот такое, боюсь чтобы данные не уперли
        • 0
          Когда вот такое с банком это вообще беда :o банк не надумываете сменить?)))
    • +2
      Что с ними было? Волнует
  • +1
    И продолжалось это безобразие ещё примерно неделю.
    Отличный подход к высоконагруженному проекту! С моей бы работы мне в 5 утра позвонили, случись чего такое :)
    • –2
      Если есть необходимость, то мы не спим всей командой по несколько дней.

      Подробнее написал тут причину такой задержки:
      habrahabr.ru/blogs/infosecurity/112237/#comment_3591958
      • +3
        А обычно вы спите всей командой? вместе??? Йоптыть…

        P.S. Просто повеселило, сорри если что.
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Угу. Видимо, вопрос «какого хрена исходный код сайта попал к кому-то постороннему „на анализ“» их заинтересовал куда меньше.
  • +5
    я так и не понял, ссылка на архив с исходниками где?
  • +23
    Просто сайт free-lance.ru делали «первобытные» фрилансеры, за отзывы :)
  • 0
    Две последние вкладки на скриншоте: free-lance.ru — удален, и Database Error. Вы зачем такие вкладки держите у себя на компьютере? :)
    • 0
      Это я игрался с базой:)
    • +2
      free-lance.ru — удален

      Это я игрался с базой:)

      так вот, кто из предыдущего топика так и не смог авторизоваться!
  • 0
    Мы тут спорили в каком же виде у них хранятся пароли, может глянь — навярняка ещё пароль не сменили и доступ изве есть — узнаем хешируют они пароли или нет
    • +1
      обычно, самый простой тест на хранение пароля — это его восстановление. Если присылают пароль, значит не хешируют. Если предлагают сменить значит хешируют.
    • 0
      Я думаю за полтара месяца они всё же сменили пароли
    • 0
      Естественно, пароли хранятся шифрованные и с солью. Поэтому при попытке восстановления пароля, вам не приходит ваш старый пароль (мы его не знаем), а приходит новый.

      При регистрации пароль отправляется на e-mail до того, как мы его зашифровали и положили в базу.
      Хорошо или плохо отправлять пароль на e-mail при регистрации — это уже другой разговор.
      • –1
        Очень-очень-очень плохо. Ломаешь мыло и всё, на руках пароли от чего только можно.
        • +1
          В целом, я согласен что лучше пароль не отправлять в открытом виде даже при регистрации. Думаю, мы поправим этот момент.

          Но:
          >Очень-очень-очень плохо. Ломаешь мыло и всё, на руках пароли от чего только можно.

          Если ломанут ваше мыло. То злоумышленнику достаточно пройтись по вашим письмам, узнать где вы регистрировались, а затем тупо по всем сайтам пройтись и сделать ретрив пароля на сломанное мыло.

          Итог: сильно легче вам от этого не будет.
          • –1
            Ретрив может быть ограничен, как у вас например, по телефону. А вот зная пароль, заходим в открытые двери.
  • 0
    Пароли, исходный код… Я вот после смены пароля на сайт не могу зайти, сколько бы не менял пароль на другой. Проект стоит, а саппорт кормит ответами об очистке кэша и кукис.
    В общем, epic fail.
    • 0
      Классика жанра, зашифровали, а про сравнение наверно забыли:)
  • 0
    Я хоть надеюсь, что у них пароли были зашифрованы в md5 с солью? А то у меня уже начинается мания преследования…
  • +22
    администрация фриланса была бы умнее, дала бы денег ТС как за услугу проверки безопасности сайта и получили бы неразглашение, а так зажмотили пару сотен и теперь лицом в гавно. Ежегодная смена паролей блядь.
  • 0
    Ага, а когда настанет момент использования крана по назначению, вы этот счетчик обратно намотаете, пока будет протекать холодная вода из горячего крана =)
    • 0
      Можно же больше, чем твои трубы вмещают, и тогда остальную холодную соседи пропустят
  • +1
    За такое ТС должен был бы получить денежное вознаграждение.
  • +7
    Здравствуйте.

    Данная ошибка никаким образом не связана со вчерашней сменой паролей.

    Ошибка действительно была в самом начале декабря.
    Повторялась ошибка у некоторых пользователей и только с определенной версией браузера Opera, в которой наши заголовки обрабатывались некорректно. Причем в других браузерах и версиях всё было хорошо.

    Мы подкрутили настройки сервера, поменяли все нужные пароли и круглосуточно контролировали ситуацию, чтобы никого постороннего до нашей базы данных не добралось.
    Кроме того, извне к нашей базе достучаться сложно. А если возможно, то стоит ограничение доступа по определенным IP-адресам разработчиков.

    Второй печальный момент в этой истории — низкая квалификация и плохая реакция нашего сотрудника обратной связи. К сожалению, не сразу после прихода заявки сотрудник начал бить тревогу и продолжил вести разъяснительные беседы с пользователем.
    Сотрудник был уволен.

    Итог: максимум, что можно было выжать из этой истории — полюбоваться (или ужасаться) кодом нашей системы. До базы добраться у вас не получилось бы.

    Мы приносим свои извинения ещё раз и обещаем, что ситуация не повторится в будущем.

    С уважением, Дмитрий Григорьев
    Руководитель отдела разработки Free-lance.ru
    • 0
      yes!
    • +1
      Повторялась ошибка у некоторых пользователей и только с определенной версией браузера Opera, в которой наши заголовки обрабатывались некорректно. Причем в других браузерах и версиях всё было хорошо.

      IE7 выдавал тоже самое.
      • +2
        К сожалению, у нас получилось повторить только в Opera.

        В любом случае, причина была одна — криво настроен сервер.
      • 0
        А при этом была уволена какая-то девушка, которая в силу своего «незнания», пытался выяснить побольше информации для разработчиков, а не бить тревогу.
        • +6
          У нас есть определенные требования для всех сотрудников. Если возникает критическая ошибка, то первым делом нужно в любое время дня донести её до меня.
          И все критические ошибки мы исправляем сразу же, бросаем все силы на это.

          Кроме того, с заявками на ошибки у нас работают тестировщики. Которые должны быть в состоянии отличить критическую ошибку от не критической.

          Поэтому не беспокойтесь, сгоряча никто не рубил головы.
          • 0
            Ребята, после взлома вашей базы пошел СПАМ, которого я в Gmail за всю свою историю пользования не встречал:
            img-fotki.yandex.ru/get/5500/aikongroup.0/0_500d3_a98f558a_L
            • 0
              Никакого «взлома нашей базы» не было.
              habrahabr.ru/blogs/infosecurity/112237/#comment_3591958

              Причину спама нужно искать в другом месте. Скорее всего, вам приходило письмо от спам-бота, а вы приняли его за письмо от работодателя и ответили на него.
              После этого, ваш e-mail автоматически попал в спам-лист.

              Это очень популярная практика для того чтобы собрать актуальную спам-базу с определенного ресурса.
              • 0
                Писем не было, я сам забыл, что у меня есть регистрация на фри-ланс.ру, т.к. гикогда ей не пользовался. Можно объяснить только совпадением. Но вы мами то в них верите?
    • +17
      Очень весело )) особенно про оперу и заголовки.
      Объясните мне, кто понял, КАК ЭТО? Веб сервер видит что это опера и забывает отдать запрос на back-end, возвращая text-plain?
      На самом деле даже интересно. Насколько я понял подобное происходило только при обращении к файлам с расширением php. И то, через раз. Насколько я понимаю в nginx`е получается несколько правил отправки запроса на back-end, соответственно для файлов с расширением php несколько иное правило, чем для других, не статичных uri. Но даже если и так, каким образом мы получаем text-plain? Ведь даже если предположить, что back-end в данный момент занят, должна вылетать 504, запрос не должен обрабатываться без back-end`а на прямую.
      Вероятнее всего дело в кеше фриланса. Все мы помним замечательные глюки при переходе фриланса на кеши. Быть может для основного локейшена были прописаны заголовки кеширования, которые возвращали статику в виде сгенеренных страниц без участия back-end`ов, а для локейшена обработки .php файлов эти заголовки были не дописаны?
    • +13
      Простите за нескромный вопрос как к руководителю разработки, вы сами верите про Оперу и определенную версию? Не, я так, чисто гипотетически…
      • +3
        Нет, конечно. Не всё так просто.
        Ошибка действительно у нас повторялась только в определенной версии Opera.

        Но как я уже сказал, причина одна — криво настроенный сервер. Видимо, я совсем корректно написал про оперу в своем первом сообщении. Извиняюсь за это.

        Если дальше вдаваться в детали, то баг был связан с:
        sysoev.ru/nginx/docs/http/ngx_http_core_module.html#internal
        Директивы nginx при определенной ситуации срабатывали не так, как нам хотелось.

        Дальше раскрыть подробности я не могу. Конфиг сервера я показать не могу.
        Ошибка была исправлена в декабре месяце.
        • +7
          Деректива тут не при чём ) я делал пару файл-хостеров, не очень больших. Порядка 20-30 файл-серверов, миллионы файлов, на каждом сервере по 2/4 интерфейса в пик забиты по самые помидоры. Дериктива internal ни разу не подвела вот уже за 3 года.
          Другое дело не верное её использование?
          Да ладно вам, покажите часть условия, которое было написано не верно ) людям интересно.
          • –4
            >Другое дело не верное её использование?

            Это верно. Поэтому я и написал «срабатывали не так, как нам хотелось».

            >Да ладно вам, покажите часть условия, которое было написано не верно ) людям интересно.

            К сожалению, нет такой возможности. В данный момент мы её не используем.
            • +5
              Тем более, если сервер сейчас настроен иначе, покажите где была потенциальная дыра. Глядишь, избавите ещё кого-нибудь от подобной проблемы.
              • –3
                Как я понял он пытается объяснить что их сервер при запросе к /classes/*.php должен был возвращать 404, и использовали они для этого директиву internal.

                Но опера типа неверно обрабатывала заголовок 404 и вместо того чтобы выводить обычную страницу 404 она показывала то, что вернул ей сервер, т.е. исходный код. (так он сначала написал, что опера неверно понимала заголовки)

                Потом оказалось что все-таки вина не оперы, а сервер виноват — internal не всегда срабатывала и вместо 404 отдавала 200 и исходный код.

                Звучит правда такое объяснение странновато, и таки непонятно в чем была ошибка. Может это баг nginxа, а может косяк программиста, а может (с учетом множественного F5) у них балансировщик отдавал часть запросов на другой сервер на котором не был настроен internal, или еще чего — не знаю.
                • +3
                  ни опера, и любой другой браузер не подставляет контент в зависимости от заголовков. Т.е. даже если ты отправляешь 404, но при этом отдаёшь нормальную страницу, браузер покажет нормальную страницу. По крайней мере потому, что решит, что это код 404 страницы сайта.
                  • +1
                    Разве ж я спорил?

                    Я просто пытаюсь из объяснений Дмитрия Григорьева составить какую-то логически стройную схему, а не так что «опера неверно обрабатывала заголовки, отправляемые нашим сервером» а потом «nginx неверно работал, директива internal глючит», а что за заголовки, как глючит, что вообще произошло так и не понятно.
                    • +1
                      Я не говорил «nginx неверно работал, директива internal глючит». Давайте не будем слова перефразировать — это всегда неприятно. Нам некого винить, кроме самих себя.

                      habrahabr.ru/blogs/infosecurity/112237/#comment_3592122

                      Не вижу смысла сейчас ещё раз обсуждать, что мы не правильно использовали данную директиву и какой у нас был конфиг месяц назад. В данном случае это не изменит ситуацию.

                      У нас всё было примерно так:

                      location ~* ^/(classes|бла-бла) {
                      internal;
                      }

                      Уточнил только что у системного администратора.
                      • 0
                        Тем не менее вы все равно вините:
                        браузера Opera, в которой наши заголовки обрабатывались некорректно

                        Директивы nginx при определенной ситуации срабатывали не так, как нам хотелось.


                        В общем-то я более менее все верно расписал вот тут выходит:
                        habrahabr.ru/blogs/infosecurity/112237/#comment_3592170

                        Вы действительно использовали internal чтобы не отдавать исходники classes, и действительно утверждаете что опера принимая от сервера 404 показывала исходный код (видимо сервер его все-таки отдавал)

                        Собственно, не только меня интересует вопрос: при каких же ситуациях internal работал не так, как вам хотелось (т.е. вместо 404 отдавал код?)
                        Как вы решили эту проблему?
                        • –1
                          >В общем-то я более менее все верно расписал вот тут выходит:
                          >habrahabr.ru/blogs/infosecurity/112237/#comment_3592170

                          В теории — да. На практике получилось не совсем так.

                          >Как вы решили эту проблему?

                          Отказались от internal, заменили на deny. По крайней мере до тех пор, пока полностью не разберемся. Всё таки проблема была срочная.

                          >при каких же ситуациях internal работал не так, как вам хотелось (т.е. вместо 404 отдавал код?)

                          Процитирую ответ системного администратора: «При ситуации с internal, прописанном root на фронте + наличие того самого кода на фронтенде.»
        • +2
          Настройка конечно хорошо, но я как минимум на вашем месте на продакшен выкладывал скрипты с обфускацией, если даже пойти по варианту взлома (тьфу-тьфу-тьфу), то это придаст большей уверенности, что утечки не произойдет, т.к. все будет зашифровано и возможно не прочитано, те же самые конфиги БД например.

          А если идти по правильному пути, то я бы сделал так на вашем месте:
          1. Заказал аудит безопасности
          2. Закрыл все коды
          3. Нанял проффи, чтобы таких казусов не было

          это я вам как руководитель проекта говорю, сам веду крупную социалку :)
          • +1
            Спасибо за советы.
            К сожалению, в данном случае пункт 1 большой погоды не сделал бы. А так всё верно.
            На будущее мы сделали для себя выводы и выписали необходимые меры, которые постепенно будем реализовывать.
            • +3
              Я бы не стал пренебрежительно относиться к безопасности, информация пользователей — самое ценное, что есть у любого проекта. if(«потеряна информация» === true){
              echo «потеря клиентов»;
              }
              • +2
                >Я бы не стал пренебрежительно относиться к безопасности, информация пользователей — самое ценное,

                Вы не верно поняли мои слова. Я не сказал, что он не нужен. Я сказал, что в данном случае в данном конкретном баге конфига сервера, этот пункт не сыграл бы большой роли.

                Естественно, аудит безопасности нужен. И его нужно проводить периодически, иначе никакого смысла от него нет.
    • +11
      Ваши айтишники вас обманывают, Дмитрий. Басни с оперой и заголовками это же просто смешно.
      Увольняйте их!
      • +1
        Я постарался в первом сообщении более поверхностно дать ответ и не вдаваться в детали. Так как на хабре есть люди различных профессий и в этом блоге в том числе.

        habrahabr.ru/blogs/infosecurity/112237/#comment_3592082
        тут больше технических подробностей. Причина только в кривых настройках сервера.

        Извиняюсь, если запутал.
  • –1
    С какой целью призывать всех менять пароли? Они же всё равно хранятся у них в MD5. Или не нет?
    • +2
      Вы все еще верите в md5?
      Тогда ищите радугу.
      Хотя… С солью и md5 прокатит.
    • +2
      Дмитрий уже отвечал habrahabr.ru/blogs/infosecurity/112237/#comment_3591973
      • 0
        Только из этого ответа все равно не понятно зачем пароли-то менять
        • +1
          «Традиция» такая ))) Раз год мы ходим в баню меняем пароли.
  • 0
    Наткнулся на нулледе на пару очень интересных линков:

    www.nulled.cc/showthread.php?t=201097
    www.nulled.cc/showthread.php?t=201189
    • +1
      Если поискать по лучше, то будет видно, что продажей аккаунтов на нашем сайте злоумышленники промышляют уже давно (как только сайт стал достаточно популярным).
      Схема простая: ломают почту у человека, делает ретрив на неё, получают новый пароль и всё.
      Иногда просто регистрируют аккаунты, заполняют всю информацию, получают отзывы и потом уже пробуют продать.

      Но такие аккаунты мы всегда блокируем, как только узнаем об этом.

      Поэтому мы и сделали возможность привязки аккаунта к мобильному телефону и возможность восстановления пароля только на телефон.
      • +1
        А о продаже БД думаете фэйк?
        • +3
          Уверен, что фэйк или человек приравнивает продажу БД к продаже отдельных аккаунтов (о чём я писал выше). Кстати, по вашему первому линку уже ничего не доступно, там как раз был блог о продаже аккаунта.

          И если взглянуть на ситуацию с другой стороны и чисто теоретически предположить, что это не фэйк. То мне было бы непонятно зачем и кто её купит.

          Так как:
          — пароли все шифрованы с солью;
          — у нас доступен публичный каталог, из которого можно «выдрать» ФИО и логин юзеров;
          — почта юзера, как правило, указана в аккаунте самого же человека и доступна для просмотра;
          — мы только вчера меняли пароли всем юзерам без исключения и для профилактики, изменили соль. Данную профилактику смены паролей и алгоритма хранения паролей мы планируем проводить ежегодно.
          В этом году прошло не всё гладко. Мы поняли свои ошибки и больше их не повторим. В будущем, пользователи всегда будут проинформированы заранее и схему смены паролей мы доработаем.

          Ну и самое простое — это уголовное преступление. Умный человек палиться не стал бы и уж тем более писать об этом на публичных форумах.
          Хочу ещё отметить, что мы очень тесно сотрудничаем с отделом К и в случае чего, очень быстро решили бы данную проблему.
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Чтож, спасибо за честность.
            • 0
              Знаете, Артём, я тут пол поста высмеивал «некомпетентность» Дмитрия, его попытки отмазаться, переформулировать пояснения уязвимости итп, но с вами я не соглашусь.
              Как в той рекламе, «Ты просто не умеешь их готовить». Фриланс породил отличную площадку для удалённых специалистов. И всё что нужно, чтобы ей воспользоваться — уметь работать с фрилансерами. У меня своя студия, много контактах в разных агенствах, постоянные подряды крупных клиентов, аля данон, санафи, мтс. Работали с рбк, мейлом и яндексом. Аккаунты с агенств очень любят спорить по поводу смет, агитируя «да вон фрилансеров наймём...» и я всегда отвечал «а нанимайте». Т.к. я знаю что это такое — работа с фрилансерами. У меня под фриланс, под удалённую работу, отдельные менеджеры сидят. На моей памяти как минимум 2 попытки агенства сделать часть работы на фрилансе. Оба раза в последствии мы эту работу переделывали с более высокими сметами, чем в начале. И я абсолютно уверен, что никогда, НИКОГДА, люди подобного уровня не будут работать с фрилансерами, это слишком специфичная работа. Вы правильно заметили, для работы с фрилансерами, нужно чуть больше чем просто деньги. Их нужно заинтересовывать, узнавать как их дела, как их бабушка, из-за которой человека не было 3 дня в сети, как их провайдеры, которые постоянно глючат и отключают интернеты итп. Подход «я заплачу мало и получу работу на уровне» не для фриланса, это было понятно с самого начала.
              Однако на моём опыте сотни закрытых проектов за 4 года. От вёрстки дизайна и отрисовки визиток, до платформ под крупные проекты. От курсовых по физике до мобильных приложений. За 4 года меня ни разу не кинули, я ни разу никого не кинул. Были не очень приятные моменты, были удивительно приятные моменты. И я уверен, я не один такой — кто может построить нормальный интерфейс с фрилансером и получить ожидаемый результат.

              А что до остальных, до негатива, тут всё ясно. Обычные рассуждения менеджера среднего звена в любой студии.
              «А зачем мне нанимать в подряд профессионалов за XXX денег, когда я могу нанять фрилансеров и они согласятся сделать то же самое за Х денег?». В итоге человек пробует, понимает что это полный пипец, харкается и плюётся и выносит из всего 2 мысли: 1) «Фрилансеры сволочи, ненадёжные и вообще кидалы», 2) «И всё же эта работа стоит Х денег».

              Я не новичок и не подхалим, но я искренне могу сказать «спасибо» фри-лансу.ру и всей его команде за данный проект. А вам могу посоветовать «не использовать» его и сохранить свои нервы. Я вот, например, кинзу не переношу. И знаю людей, кто её не переносит ) но это не значит, что она портит культуру всех трав съедобных.
              • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    как пароли надумают сменять, значит опять кто то получил доступ к базе :) «оперативно» баг замечен в декабре, а пароли сменены в январе…
    • 0
      Прежде чем писать, лучше топик читать )

      habrahabr.ru/blogs/infosecurity/112237/#comment_3591958

      Пароли всем пользователям менять из-за этого бага смысла не было. Абсолютно.
      • 0
        А из-за чего был? Может я не хотел менять, почему пароль сменили за меня?
        • 0
          Ни за кого не меняли. Предлагали ввести новый. Я ввел обычный свой — прошло.
  • 0
    С удовольствием бы покопался в исходниках, без плохого умысла =). Если у вас есть архивная копия — напишите пожалуйста в ЛС.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.