PHP-консоль под MODx Revolution

    Продолжая статью уважаемого bezumkin-а, хочу поделиться одним небольшим, но очень полезным модулем для админки MODx Revolution. Это, так сказать, Ajax-консоль для выполнения PHP-кода (само собой на стороне сервера) и вывода результатов в браузер.

    P.S. Не надо лишних комментариев на счет безопасности. Если не знаете MODx Revolution, лучше вообще ничего не говорить. Так же перед постингом по безопасности читаем тут.

    image


    !!! Не забудьте после установки протестировать этот модель на уязвимости. Как это сделать? Попробуйте будучи не авторизованными в админке выполнить запрос типа ваг_сайт/connectors/console/console.php?action=exec&code=какой-либоКод
    Если в ответ получите какой-либо результат, заморачивайтесь дополнительной защитой в этом коннектор-файле. У меня Рево 2.1.3, никаких дополнительных хаков не потребовалось.

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

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

    Итак, если вы не меняли файловой структуры своего сайта, заливайте файлы как есть из этого архива, создавайте новый компонент console, у компонента прописываете путь {core_path}components/console/.
    Далее заходите в закладку Действия, создаете новое действие console, контроллер указываете console

    image

    Там же создаем новый пункт меню.

    image

    Все, теперь обновляйте страничку в админке и можете опробовать свой новый компонент.
    По-хорошему, надо бы это все оформить в установочный пакет (кто-нибудь оформит? Кстати, можно и подробный топик написать с описанием процесса сборки пакетов), и codemirror прикрутить к нему, а так же навесить событие отправки запроса при нажатии Ctrl+Enter. Кто сделает?
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 52
    • +1
      Завтра злоумышленник подбирает пароль к админке сайта, заходит в консоль — и вуаля — у него есть UNIX-шелл c пользователем WWW. Закачиваем эксплоит (или просто копипастим его код), компилируем и исполняем. Вуаля у нас root.

      А теперь внимание вопрос: А стоит ли подставлять жопу ради фичи, которая нужна один раз в год?

      Неужели вы думаете что в большинстве крупных CMS отсутствует консоль только потому что разрабы ленивые или забывчивые?

      Не ставьте консоль на админку. Вы получите деньги и уйдете, а бороться с «хакерствующей» и психически нестабильной частью интернет сообщества не вам.
      • 0
        Вы, судя по всему, с Рево вообще не работаете. Я вам открою небольшую тайну: в админке Рево есть файл-маганер. Если пользователь подберет пароль к админке, то он получит доступ и к файл-манагеру, и к редактору сниппетов и плагинов (а это объекты, выполняющие чистый PHP-код). Так в чем же такая консоль снижает безопасность? Может тогда вообще нах админку?
        Детский сад…
        • +5
          Специально установил MODX, и выяснил следующее:

          Редактировать можно ФАЙЛЫ. Поэтому ставим на все файлы в каталоге 0755 (что нужно делать впервую очередь всегда) — и все — редактор файлов превращается в просмотрщик, и жопа цела.

          А что делает ваша консоль? она исполняет файл? А нет, она исполняет любой скрипт, который я захочу. Захочу /etc/passwd посмотрю, захочу шелл в home залью. Да мало ли что я смогу с линуксом сделать, если я уже залогинен под пользователем.

          А, у меня еще и доступ в базу есть!!! Ваши пользователи будут вам благодарны за то, что вы спалили их е-mail.

          Одним словом, развлекаться можно долго. И не в вашу пользу.
          • 0
            Во-первых, /etc/passwd в принципе не должен быть доступен для системного веб-пользователя (группы apache, web, www или кто как настроит ось).
            Во-вторых, копайте дальше MODx, раз уж заморочились. Изучайте сниппеты. Вы откроете огромную дыру! Вы можете создать сниппет, прописать в нем PHP-код, залить шелл и все прочее, чего вы очень боитесь… С админскими правами в MODx — все решето. Только в этом и загвоздка — права получить еще надо (пароль подобрать или что вы там еще хотели делать). А если взлома виртуальный хостинг, то там вообще много чего накопать можно. В путь!!!

            А если серьезно, хватит тут флудить. Вы говорите то, что итак понятно. Но я знаю Рево больше вас, а значит если я делаю этот компонент, значит взвешиваю все За и Против.
            • +5
              «в принципе не должен быть доступен для системного веб-пользователя» — это с каких это пор?
              /etc/passwd как раз то и открыт для чтения всем желающим пользователям. Закрыт /etc/shadow.

              Да, я могу создать сниппет, но сниппет — это ФАЙЛ. А ваша консоль исполняет все с помощью eval.

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

              Если ваша консоль тоже будет писать в файл, а потом его инклюдить, дыра исчезнет. Но тогда исчезнет и необходимость в консоли.

              Называть всех, кто не согласен с вашим мнением флудерами — хорошая тактика спора. Но я пишу это не для вас, а для тех, кто прочитав этот пост подумает «отличная идея!». И в итоге еще одним дырявым сайтом будет больше.

              Может быть и Рево вы и знаете лучше меня, но UNIX знаете точно хуже, обозначив это первой строчкой предыдущего комментария.

              «Так вот, это как правило всего несколько строк кода, и для выполнения этого небольшого кода больше времени уходит на создание файла-обработчика.» — это нужно делать с помощью команды php в SSH-сессии.

              Кроме того, что это дыра в безопасности, представьте, что после выполнения вот таких вот «несколько строчек» вдруг к вам неожиданно придет осознание того, что они будут выполняться несколько дольше, чем вы ожидали, и отвалятся по лимиту. Повторно запустите скрипт? А если скрипт не предполагает возможности повторного запуска? Например, это рассылка или операция по конвертированию данных?

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

              Вот мои против. А какие ваши «за»?
              • –4
                <<< Да, я могу создать сниппет, но сниппет — это ФАЙЛ. А ваша консоль исполняет все с помощью eval.
                Что за бред? Чем выполнение кода через eval() отличается от выполнения чистого PHP-кода из файла? Бред. Что нельзя прописать на выполнение в файле, что можно выполнить через eval()? Идите учите PHP.
                • +1
                  Тем, что код через eval выполнится, а в файл с правами 0755 вы просто не сможете этот код записать.

                  habrahabr.ru/blogs/modx/126733/#comment_4178401 вот задачка с небольшой, но нередкой ситуацией, показывающей сценарий, по которому можно воспользоваться уязвимостью.

                  А про то, как избежать ситуации, обозначенной в habrahabr.ru/blogs/modx/126733/#comment_4178150 (первом комментарии поста) вы мне так и не объяснили. Я нашел способ избежать такого сценария развития событий — не пользоваться консолью. Вообще. Какие ваши предложения?
                  • –4
                    <<< Тем, что код через eval выполнится, а в файл с правами 0755 вы просто не сможете этот код записать
                    Для каждого сниппета и т.п. создаются свои собственные файлы при вызове. Даже если вы для всех папок зададите права 500, а для файлов 400, у вас все равно будут эти дыры в админке, так как такова MODx. Это баланс между безопасностью и динамикой. Это как для того, чтобы обезопасить себя от атак из Интернета, надо не подключаться к нему. Так же и если все это вас очень беспокоит, не ставьте MODx, да и вообще лучше отказаться от ЦМС-ок.
                    Результат всех этих ваших диалогов — трата времени впустую. Идите в раздел habrahabr.ru/blogs/infosecurity/ и там реализовывайте свой потенциал.
                    • +2
                      И каким, интересно, способом modx создаст файл в папке с правами 500?

                      modx работает из-под рута?

                      Чудеса какие-то.

                      PS: Существуют правильные решения и костыли. Ваша консоль — это костыль, использование которого может привести к серьезным проблемам.

                      PPS: MODx мне понравился — отличная CMS. Стоит вас поблагодарить за то, что открыли мне на нее глаза — пусть и таким нестандартным методом.
                      • –1
                        <<< И каким, интересно, способом modx создаст файл в папке с правами 500?
                        modx работает из-под рута?

                        Да, тут я сплоховал, ибо сам же выше говорил, что Рево отказался от eval() и посчитал, что даже если он не сможет создать файл-кэш сниппета, то он его просто проэвалит, хотя первая секундная мысль была более правильная — я посчитал сначала, что Рево просто перестанет работать.
                        И вот что я интересное узнал — даже если поставить на кэш-папку права 000, то Рево сам меняет права кэш-папок и кэш-файлов на доступные для записи)))
                        То есть без этого он в принципе не будет работать. Как я и говорил уже, таково наследие Рево.

                        Но я остаюсь при своем мнении — моя консоль ни сколько не снижает безопасность, ибо снижать ее некуда уже)))
                • +1
                  вы очень плохо знаете modx. сниппеты — не файлы (они ток кешируются в виде файлов), а строка в бд. которая парсится все тем же eval-ом.вы очень плохо знаете modx. сниппеты — не файлы (они ток кешируются в виде файлов), а строка в бд. которая парсится все тем же eval-ом.
                  • +1
                    Не совсем так. В Revolution ушли от eval. Сниппеты, плагины и т.п. сохраняются в БД, но при первом же обращении генерируются в реальные файлы в виде функций и выполняются в чистом виде.
                    Вот заголовок одного из таких файлов:
                    <?php
                    function elements_modsnippet_15($scriptProperties= array()) {
                    global $modx;
                    if (is_array($scriptProperties)) {
                    extract($scriptProperties, EXTR_SKIP);
                    }
                    • +1
                      Да, действительно. Вот только на эти файлы права доступа особо не попроставляешь. При обновлении сниппета глючить уж больно будет. В виде кэша всё это хранится.
                    • 0
                      и в какой таблице? в таблице site_snippets не нашел.
                      • 0
                        Именно в modx_site_snippets они и хранятся, но как раз с целью удобства их дальнейшего редактирования.
                        У вас эта таблица видимо пустая еще, потому что ни одного сниппета не создано.
                        • 0
                          создано, и там есть запись о том, что такой сниппет существует. Но нет его кода. Где искать именно php код?

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

                          Кроме того, это потенциальная дыра в безопасности — вполне возможно есть способы как ей воспользоваться.

                          Кстати, я нашел, кто хранит код в базе — это плагины.

                          Но исполнение плагинов и сниппетов требует редактирования файлов шаблонов.

                          Отсюда вывод: Если не хотите, чтобы вас поимели, не пользуйтесь плагинами в modx. Это — потенциальный путь к приватным данным ваших пользователей.
                          • 0
                            В колонке snippet.
                            Тут очень много целей:
                            во-первых, легче извлекать код для повторного открытия сниппета для редактирования.
                            во-вторых, устанавливается много зависимых связей, типа объединения в группы ресурсов, права доступов и т.п.

                            Затраты на безопасность должны соответствовать уровню конфиденциальности информации. Если это просто сайт-визитка, да пох кто его когда взломает, если им вообще кто-нибудь заинтересуется.
                    • –1
                      А он давно зарекомендовал себя как долбоёб, который не в сидах осилить что-то кроме своей жалкой цмски и яростно ее защищающий.
                      • –3
                        это ты кого долбоебом назвал?
                        • +2
                          а ты угадай!
                          • –6
                            слышишь, чмо, подъезжай на новый арбат, скажешь мне это в лицо. Сейчас я тебе в личко черкану
                            • –4
                              ну ты что гасишься? в личку не отвечаешь, тут потерялся. замялся? очередной аноним. из-за экрана тяфкаешь, а в реале рожу свою показать хер, да?
                  • 0
                    Более того, админка даже не позволит залить вам файл пакета через нее. Вам сначала нужно залить в папку core/packages а потом уже админка просканирует эту папку и выделит то, что можно установить.

                    Это отличная и внешне безопасная система (внутри может тоже ничего — но я не лез, поэтому не знаю).

                    А вы выставляете ее решетом.
                    • 0
                      Завтра злоумышленник подбирает пароль к админке сайта, заходит в консоль — и вуаля — у него есть UNIX-шелл c пользователем WWW
                      С таким же успехом можно подобрать пароль к панели хостинга, а там в большинстве случаев есть файлменеджер со всеми правами. Узнать хостинг и адрес панели совсем не сложно.
                      • –2
                        Да ей Богу заколупал чел со своими предположениями. Сразу видно, перечитал Хакер.ру
                        • +1
                          Виртуальный хостинг? Вы это серьезно?

                          Убить хомяк можно и более действенными способами. Натравить Jmeter и хостинг сразу вас попросит за превышение нагрузки — тут даже мозг напрягать не надо.

                          Кроме того, опять же файловый менеджер виртуалок работает от www.

                          Распечатайте себе огромную надпись «ВСЕГДА СТАВЬ 0755 на *.php» и больше не пишите глупостей.

                          PS: На большинстве виртуалок eval не работает. Поэтому на них данная консоль бесполезна.
                          • 0
                            А вы думаете из данной консоли вам будет позволено делать что-то большее чем имея доступ к файлменеджеру? Обоснуйте.
                            • 0
                              Хорошо. Объясняю.

                              Установив на файлы права 0755 вы запретите их запись и редактирование все, кроме владельца. А т.к. сейчас на большинстве хостингов (не берем в рассчет откровенное гавно, где этого еще не сделали) FTP пользователь и WWW-пользователь (от которого и запускается файл-менеджер) — это разные пользователи, то установка прав доступа 0755 приводит к тому, что файлы не отредактировать через файловый менеджер. Ваши скрипты в безопасности, никто не сможет подсунуть в странички вашего сайта вредоносный код и остаться незамеченным.

                              Конечно, вам могут подчистить базу — но по сравнению с попаданием в черные списки поисковиков — это мелочи.

                              Вообще, на просторах интернета есть немало материалов на эту тему — про разграничения прав пользователей, и про PHP инъекции. Советую ознакомиться для общего развития.
                              • 0
                                Хорошо, через файлменеджер редактировать нельзя, но можно по FTP. Имея доступ в панель хостинга, можно получить доступ на FTP или даже подобрать пароль FTP. В любом случае где-то есть пароль, который можно подобрать.
                                А при желании можно:
                                1. спрятать админку MODX на другой никому не известный адрес.
                                2. Разрешить доступ в админку только с определенного IP (это можно с любой админкой сделать).
                                и т.д.
                                Да и имея доступ в админку, можно также разместить вредоносный код на сайте. Вы уж не уходите от ответа (про поисковик и т.п.). Цель взломать сайт или взломать весь сервер? Если первое, доступ в админку это всё что нужно. Если второе, данная консоль тут не поможет (в нормальном случае).
                                • +1
                                  Пароль всегда можно подобрать, согласен.

                                  Но как считаете, что сложнее подобрать — 5-ти символьный пароль на админку, 20ти символьный на SSH или подобрать ключ авторизации для данного сервера?

                                  Админкой пользуются только программисты, которые понимают смысл слов «не раскрывать пароль ни под каким предлогом» или ей пользуются девочки-менеджеры, которым ничего не стоит вызвать компьютерную помощь на дом с висящим на рабочем столе файликом «РАБОТА_ПАРОЛИ.txt».

                                  Из 10 магазинов, которые мы делаем, у 6 хоть раз взламывают админку, причем не по вине именно одного из менеджеров, для которой «аккаунт с нужными правами потом создадим» или «ой. я заходила в админку с wi-fi в кафешке.»

                                  Кроме того, пароли палят на скриншотах, в смсках, когда дают своему одногруппнику / собутыльнику телефон поиграться, расшаривают в локалке через DC++.

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

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

                                  В случае, если на всех файлах у вас стоит 0755 и нет консоли, а также отсутствует phpMyadmin на серваке, а также к базе запрещены внешние коннекты, то, хоть злоумышленник и получить пароль, но не сможет, например, слить таблицу с хешами пользователей или получить доступ к переписке. Максимум, на что он может надеятся — это на дефейс.

                                  В случае, если у него есть консоль, небольшой скрипт — и в наших руках уже куча приватной инфы.
                                  • –1
                                    Возвращаемся к нашим баранам: если пользователь получил доступ к админке MODx, он получит все, что она позволяет. А она позволяет ВСЕ!!!, что только можно пожелать выполнить админка MODx. Следовательно моя консоль никак не снижает безопасность, потому что ничего нового она не дает, чего не может сделать админ в админке.
                                    Хватит уже свою агитацию проводить. Вы говорите правильные, но не уместные вещи.
                                    • 0
                                      Да, верно, давайте к баранам.
                                      Вот у меня задача: Слить базу пользователя с хешами.

                                      Условия такие:

                                      На всех файлах у вас стоит 0755, отсутствует phpMyadmin на серваке, а также к базе запрещены внешние коннекты.

                                      Как средствами modX я смогу удовлетворить свой интерес?

                                      Надеюсь, как его удовлетворить с помощью консоли, вы понимаете:
                                      mysql_query(«SELECT бла-бла-бла

                                      Но как это сделать через админку при указанных выше условиях?
                                      • 0
                                        Очень просто.
                                        По порядку:
                                        1. Создаем новый сниппет hack.
                                        2. Прописываем в нем код mysql_query(«SELECT бла-бла-бла
                                        3. Создаем новый документ сайта и прописываем для него контент [[hack]], то есть вызов сниппета hack.
                                        4. Обращаемся к новой странице по ее УРЛ-у и даже для не авторизованного пользователя выполнится код mysql_query(«SELECT бла-бла-бла

                                        Можно было бы еще несколько способов наковырять, но этот самый очевидный.
                                        • +1
                                          Сами вверху написали, что для отработки сниппета нужно создать файл. Как это может случиться, если у вас права 0755 на файлах? и запись в папки запрещена?
                                          • +2
                                            Сниппеты (а также плагины и компоненты) для того и нужны чтобы в них писать PHP-код и исполнять его. Иначе какой в них смысл? Зачем ставить права, которые не позволят исполнять код в сниппетах? Может хватит бредить?
                                            • 0
                                              Я разве говорил об исполнении? Я говорил о запрещении именно записи. Вы заливаете на боевой уже готовую версию сайта, изменять на которой что-то не имеет никакого смысла. Все изменения проводите на тестовой, в том числе и сниппеты. В итоге сниппеты то будут исполняться, а вот подсунуть вредоносный код злоумышленник не сможет — т.к. на готовом сайте запрещена запись файлов и вредоносный сниппет просто не сможет исполниться. Все просто.
                                              • +2
                                                На боевом сайте и пользоваться данной консолью не нужно (но можно в стадии разработки), по вашей же логике. О чем тогда спор?
                                        • +1
                                          1. Идете Система
                                          2. Управление пакетами
                                          3. Установить расширение
                                          4. ищете пакет Janitor
                                          5. Ставите
                                          6. У вас доступ к БД, нужен только логин\пароль
                                          7. Подглядываете логbн\пароль в /core/congig/config.inc

                                          Хочу заметить, что если на директории стоит разрешение 755, а на файлы 644 — можно любой компонент на сервера, или даже написать его прямо в админке.
                                      • +1
                                        У MODX есть такая вещь как разграничение прав. Девочкам-менеджерам ни к чему давать права супер-админа. Также им можно запретить запускать любой компонент.
                                        • –3
                                          Совершенно верно. И этому компоненту можно назначить права. Если авторизованный пользователь в админке не будет иметь прав на запуск этого компонента, то он вообще ничего не сможет сделать.
                                          • –9
                                            Блин, вот так всегда. Пишешь для MODx-прогеров, чтобы поделиться полезной разработкой, развить MODx-сообщество, а лезут начинающие сисадмины. Что им вообще делать в разделе MODx CMS?
                                    • 0
                                      Блин, понял что не по теме ответил.

                                      Файловый менеджер действительно с тем или иным успехом позволит делать все, что позволяет php, за исключением, может, совсем долбанутых использований, для которых нужен именно PHP (с ходу даже не смогу их придумать). Но, пардон, я и не говорил что с помощью файлового менеджера хостинг-провайдера можно сделать меньшие проблемы.

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

                                      Ни один нормальный проект, взламывать который имеет смысл не будет на виртуальном хостинге. А если вам просто нужно, чтобы сайт васьки из соседнего подъезда полежал пару дней в дауне, то для этого не обязательно что-то взламывать и искать какие-то пароли.
                                      • 0
                                        Что ты привязался к виртуальному хостингу? Где я писал про виртуальный? У «реального» тоже может быть web-панель управления. В любом случае БАКАП наше всё :).
                                        • +2
                                          *ля, хотел минуснуть и промахнулся. Отдай мой голос, Хабр!
                            • НЛО прилетело и опубликовало эту надпись здесь
                              • –3
                                еще один…
                                читаем всю переписку сверху, в частности это: habrahabr.ru/blogs/modx/126733/#comment_4178157
                                и тоже понимаем, как не уместен ваш коммент.
                                • НЛО прилетело и опубликовало эту надпись здесь
                                  • –3
                                    Вот про чекер кода, это вы классно подсказали:-)
                                    Вообще по хорошему нужно прописать Exception, но я где угодно освоил его, но только не в PHP)))
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                      • –2
                                        Спасибо!
                                        Обязательно изучу на досуге.
                              • +2
                                На мой взгляд, проблема безопасности несколько надуманная.

                                Вернее, она есть, но от наличия\отсутствия консоли ничего не изменится.

                                Можно написать любой сниппет, с любым кодом. Можно написать себе эту консоль, прямо через админку. Если злоумышленник пролез в админку как суперюзер — он может все, что может веб-сервер.

                                Лично я ограничиваю вход в manager по ip на своих сайтах. На хостингах используют open_basedir.

                                Короче, тема безопасности она в целом про сайт. Говорить, что эта консоль — большая дыра, на мой взгляд неправильно.

                                Скорее, большая дыра в безопасности — вся админка MODX Revolution. Но я за это и его и люблю, за то, что он меня не ограничивает.
                                • –1
                                  Вот именно.
                                  Много буков потратилось впустую. Давно уже понял, что чем меньше народ знает, тем больше ему хочется спорить.

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