Безопасность сайта по его заголовкам, или что делать, если хочется залезть во внутренности каждого сайта

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

    image

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

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

    И я решил сделать свое приложение, которое могло бы с лету анализировать все сайты, которые я посещаю, анализируя HTTP headers и выставляя оценку подобно сайту Mozilla. А еще очень хотелось, чтобы оно сразу определяло не использует ли сервер уязвимые технологии. И чтобы готовить умело. Но от последней фичи впоследствии пришлось отказаться.

    Код можно посмотреть на GitHub, хотелось бы выразить благодарность noomorph за советы в непрофильном для меня JavaScript. Само расширение доступно по ссылке: HeaderView

    Для демонстрации работы, можно просто открыть хабр, и если вы им воспользуетесь вскоре после публикации статьи, то скорее всего увидите следующее:

    image

    Оценка безопасности сайта F+, из расчета что А — наивысшая оценка, и F — наинизшая. Хабр имеет хедеры безопасности, но вместе с тем, он показывает на каком языке он работает, и версия этого языка малость устарела (на момент публикации статьи актуальная версия PHP 5.6.29 согласно официальной документации. Расширение автоматически формирует ссылку по которой вы можете увидеть уязвимости данной версии.

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

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

    Что интересно, при переходе с Geektimes на хабр, редирект проходит через другой сервер, у которого версия PHP чуть поновее:

    image

    Хотя и недостаточно.

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

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

    Буду рад подсказкам и идеям что добавить, а так же чем расширить распознаваемые технологии!
    Поделиться публикацией
    Комментарии 31
      0
      А есть сайт с оценкой A?
        0
        Наверняка, но я видел самое лучшее «B»)
          0
          И что же это за сайт такой интересный?
            0
            Это поисковик уязвимостей что я использую (https://vulners.com/), если бы они настроили «CONTENT-SECURITY-POLICY», у них был бы «A».
          0
            0
            A+
            Хех, не зря CSP настраивал :)
            https://observatory.mozilla.org/analyze.html?host=bugs.drweb.com
              0
              На этот сайт расширение у меня C+ показывает.
                0
                Observatory by Mozilla показывает A+. Расширение показывает вообще F
                0
                Согласен, это баг, исправлю.
              0
              Буду рад подсказкам и идеям что добавить, а так же чем расширить распознаваемые технологии!

              Совместимость с Firefox? К сожалению, я не умею отлаживать дополнения браузера, но ваше, после конвертации, отображает пустой серый dropdown по нажатию.
                +1
                Глупый вопрос — Вы обновляли страницу перед нажатием? На уже открытых и не обновлённых страницах даже в хроме ничего не покажет — и это нормальная ситуация, у расширения же нет пакетов с этого сайта.
                  0
                  Да конечно, даже браузер перезапустил. На одной вкладке на иконке появилась цифра «302», но как там она оказалась- загадка.
                  +1
                  Я до конца не уверен, но думаю дело в следующем:
                  Расширение использует API браузера(google chrome), где оно подписывается на конкретные события. По вашей ссылке расширение, которое помогает устанавливать расширения из магазина google. Я попробовал, и мое расширение установилось без изменений (я открыл в редакторе установленный в Firefox файл и изменений не обнаружил), что натолкнуло меня на мысль, что расширение от googl конвертацию не производит, оно создает что то типа обертки над методами Firefox. Возможно не все методы имеют обертки, или суть в том что я подписываюсь на события браузера chrome, а в Firefox они другие.
                    0
                    Расширение использует API браузера(google chrome)

                    А почему не WebExtensions API? Вроде как раз его и придумали для того, чтобы дополнения работали во всех актуальных браузерах.
                    +1
                    Для Firefox есть Wappalyzer.
                      0
                      Показывает версии, но не предупреждает об уязвимостях и не ставит всякие там оценки.
                    0
                    Если найденная версия софта не самая свежая и это подсвечивается красным, правила хорошего тона требуют так же дать информацию о текущей, считающейся актуальной версии.
                      0
                      Согласен, хорошая идея
                        0
                        Не забывайте о пользователях enterprise-дистрибутивов — там уязвимости исправляются БЕЗ повышения версии, а отдельным патчем.
                        +6
                        > но вместе с тем, он показывает на каком языке он работает, и версия этого языка малость устарела

                        Это если верить хидерам. Но это же просто буковки и циферки. Я, например, на некоторых серверах специально отдаю «левые» значения в server, x-powered-by и тп, не имеющие отношения к реальному софту. Глупенькие боты радостно бросаются искать дыры в php или апаче, а их там отродясь не стояло :)
                        Зато тем самым они отлично себя выдают и попадают в бан.
                          +1
                          Тема на самом деле важная и как показала проверка различных сайтов актуальная. Молодец что поднял.
                          UPD а и добавь фишку с обзервера, чтобы было ясно за что снимаются баллы, а что хорошо.
                            +1
                            Думаю, можно зеленым подсвечивать headers которые расширение считает валидными. Добавлю.
                            +1
                            Хм, ну вот я проверил свой сайт и получил рейтинг F.
                            «Отлично», но что дальше? Ни одна строчка не подсвечена, куда двигаться для исправления — неясно.
                            Версию ни PHP ни вебсервера не отдаю, только server: nginx и всё, про PHP ни слова.
                            Было бы очень неплохо, если бы выдавались рекомендации по исправлению, типа как в Page Speed Insights или SSLLabs.
                              0
                              Да, хорошая идея.
                              0
                              по этому тесту даже у google.com и microsoft.com всего D
                              чего уж про остальные сайты…
                                0
                                Эти сайты и не должны быть сверхбезопасными, они стремятся к большей совместимости в ущерб безопасности, так как с их посещаемостью даже 0,5% это очень много.
                                  +1
                                  да, вы правы
                                0
                                Можно еще немножко расширить функционал и добавить к учету рейтинга факт использования уязвимой версии ПО.
                                Если использовать запрос на Vulners вот так:

                                Поисковый запрос:

                                affectedSoftware.name:"nginx" AND affectedSoftware.version:"1.11.0"


                                Делаем запрос API

                                То получаем выхлоп с уязвимостью. Можно использовать параметр «total»: 1 как метрику.
                                Не на все софты это сработает подобным образом, но на многие.

                                Вот еще пример для Apache:

                                (affectedSoftware.name:*apache*) AND (affectedSoftware.version:"2.4.18")


                                P.S.
                                Мануал по query лежит вот тут.
                                  0
                                  Спасибо огромное за пример!
                                  Идея хорошая, но так почему-то находит гораздо меньше. Я пробовал

                                  affectedSoftware.name:«php» AND affectedSoftware.version:«5.3.3»

                                  и просто

                                  php-5.3.3

                                  в последнем случае найдено намного больше (хоть и не все по делу).

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

                                    Хоть и не очень удобный, но правильный путь это посмотреть на все коллекции. Потом выбрать один элемент из нее, к примеру на Nginx.

                                    Дальше там есть малозаметная но полезная кнопка «JSON source»:
                                    image

                                    И посмотреть как выглядит разметка для автоматизации сканирования:

                                    "affectedSoftware": [
                                    {
                                    "operator": "le",
                                    "version": "1.9.9",
                                    "name": "nginx"
                                    }
                                    ],


                                    Соответственно, «operator» подразумевает оператор сравнения, который надо применить между целевой версией софта и указанной в advisory. Если оператор выдал True, значит уязвимость присутствует.

                                    Для поиска по конкретным полям в запросах надо применять разделитель "."
                                    То есть, если мы хотим искать по name из примера, то affectedSoftware.name:«запрос»

                                      0
                                      Теперь понял, спасибо)

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

                                Самое читаемое