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

Итак, один из моих друзей пришел с js-кодом и спросил: «Это уязвимо для DOM XSS?» поэтому я решил поделиться со всеми вами кодом и дать вам понять, как этот код работает, а позже мы выясним, насколько он уязвим или нет.

Вот код

<script>document.write(decodeURI(window.location.search.substr(1).split('=')[1]));</script>

Теперь мы поймем каждую часть этого кода.

Предоставленный код JavaScript извлекает значение из строки запроса текущего URL-адреса, а затем декодирует его с помощью функции `decodeURI()`. Вот разбивка того, что делает код:

  1. window.location.search извлекает часть строки запроса текущего URL-адреса, включая начальный '?' символ.
  2. substr(1) удаляет начальный '?' символ из строки запроса.
  3. split('=')[1] разбивает строку запроса по символу '=' и извлекает значение после знака '='. Это предполагает, что строка запроса следует формату пар ключ-значение, где значению предшествует знак «=».
  4. decodeURI() декодирует любые символы URL-кодирования в извлеченном значении. Например, если значение содержит «%20», оно будет преобразовано в символ пробела (« »).

Наконец, document.write() используется для вывода извлеченного и декодированного значения на веб-страницу, где выполняется скрипт.

Что означает substr(1) в javascript?

В JavaScript функция substr() используется для извлечения подстроки из строки. Вы можете прочитать о substr() в моей статье Здесь.

В данном фрагменте кода substr(1) используется для извлечения подстроки из строки window.location.search. Вот что это значит:

window.location.search представляет часть строки запроса текущего URL-адреса, включая начальный '?' символ. Например, если URL-адрес https://www.example.com/page?data=Hello%20World, то window.location.search будет ?data=Hello%20World.

substr(1) применяется к window.location.search для извлечения подстроки, начиная с индекса 1. При этом начальный '?' символ опущен, и только часть после '?' символ сохраняется.

В примере URL применение substr(1) к window.location.search приведет к data=Hello%20World, исключая '?'.

Теперь со второй частью "использование split('=')[1] во фрагменте кода"

Освежите свои знания о расколе из здесь.

если вы освежились то ответьте на мой вопрос до прочтения "А что если бы было split('=')[2]"?

Если вы измените код на split('=')[2], он попытается получить доступ к третьему элементу массива, возвращаемому split('='). Однако в этом конкретном фрагменте кода это вряд ли будет работать должным образом. Вот почему:

Функция split('=') разбивает строку запроса на массив, используя символ '=' в качестве разделителя. Например, если строка запроса data1=Hello&data2=World, split('=') вернет массив с двумя элементами: ["data1", "Hello&data2"].

Обращаясь к split('=')[2], вы пытаетесь получить третий элемент массива. Однако массивы в JavaScript имеют нулевой индекс, поэтому первый элемент имеет индекс 0, второй элемент — индекс 1 и так далее. Поскольку массив в этом случае имеет только два элемента, попытка доступа к split('=')[2] приведет к undefined, поскольку третьего элемента нет.

Следовательно, в данном фрагменте кода использование split('=')[2] не даст желаемого результата.

Теперь, получив столько знаний, можете ли вы сказать мне, уязвим ли этот код для DOM xss или нет?

Фрагмент кода (document.write(decodeURI(window.location.search.substr(1).split('=')[1]));) сам по себе не является непосредственно уязвимым для атак межсайтового скриптинга (XSS) на основе DOM.

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

Если извлеченное значение (window.location.search.substr(1).split('=')[1]) напрямую выводится или вставляется в DOM без надлежащей очистки или кодирования, это может привести к уязвимостям XSS. Например, если извлеченное значение представляет собой входные данные, контролируемые пользователем, которые впоследствии внедряются в innerHTML или другое динамическое содержимое без надлежащего экранирования, это может позволить злоумышленнику внедрить вредоносный код.

или если этот код прямо прописан в теге ‹body› Да, он уязвим.

Вот почему его можно считать уязвимым:

  1. Источник управляемого пользователем ввода: код извлекает значение из строки запроса текущего URL-адреса (window.location.search.substr(1).split('=')[1]). Если злоумышленник может манипулировать строкой запроса, он может контролировать извлекаемое значение.

2. Отсутствие очистки: извлеченное значение затем передается непосредственно в document.write(), который вставляет значение непосредственно в DOM. Без надлежащей очистки или кодирования это может позволить злоумышленнику внедрить вредоносный код на страницу.

Спасибо, что остаетесь так долго. 😉