Привет, специалисты по безопасности, эта статья предназначена для новичков или среднего уровня, поэтому я объясню каждый возможный отдельный код.
Итак, один из моих друзей пришел с js-кодом и спросил: «Это уязвимо для DOM XSS?» поэтому я решил поделиться со всеми вами кодом и дать вам понять, как этот код работает, а позже мы выясним, насколько он уязвим или нет.
Вот код
<script>document.write(decodeURI(window.location.search.substr(1).split('=')[1]));</script>
Теперь мы поймем каждую часть этого кода.
Предоставленный код JavaScript извлекает значение из строки запроса текущего URL-адреса, а затем декодирует его с помощью функции `decodeURI()
`. Вот разбивка того, что делает код:
window.location.search
извлекает часть строки запроса текущего URL-адреса, включая начальный '?' символ.substr(1)
удаляет начальный '?' символ из строки запроса.split('=')[1]
разбивает строку запроса по символу '=' и извлекает значение после знака '='. Это предполагает, что строка запроса следует формату пар ключ-значение, где значению предшествует знак «=».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› Да, он уязвим.
Вот почему его можно считать уязвимым:
- Источник управляемого пользователем ввода: код извлекает значение из строки запроса текущего URL-адреса (
window.location.search.substr(1).split('=')[1]
). Если злоумышленник может манипулировать строкой запроса, он может контролировать извлекаемое значение.
2. Отсутствие очистки: извлеченное значение затем передается непосредственно в document.write()
, который вставляет значение непосредственно в DOM. Без надлежащей очистки или кодирования это может позволить злоумышленнику внедрить вредоносный код на страницу.
Спасибо, что остаетесь так долго. 😉