Найти Π² Π”Π·Π΅Π½Π΅
ΠšΠΎΠ΄ΠΎΠ²Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

πŸ”’ Мой ΠΎΠΏΡ‹Ρ‚ поиска ΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ DOM XSS уязвимостСй

НСдавно я столкнулся с интСрСсной ΠΈ опасной ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ β€” DOM-based XSS (мСТсайтовый скриптинг Π½Π° основС DOM). Π­Ρ‚ΠΎ Π½Π΅ обычная XSS, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ловят Π½Π° сСрвСрС, Π° Π±ΠΎΠ»Π΅Π΅ хитрая Π°Ρ‚Π°ΠΊΠ°, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ прямо Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΆΠ΅Ρ€Ρ‚Π²Ρ‹. РасскаТу, ΠΊΠ°ΠΊ я Π΅Ρ‘ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» ΠΈ Ρ‡Ρ‚ΠΎ сдСлал, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. πŸ•΅οΈβ€β™‚οΈ DOM XSS Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° JavaScript Π±Π΅Ρ€Ρ‘Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π½Π΅Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΠ³ΠΎ источника (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ· URL) ΠΈ вставляСт ΠΈΡ… Π² опасныС мСста Π½Π° страницС (sinks), Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ: ΠŸΡ€ΠΈΠΌΠ΅Ρ€ уязвимого ΠΊΠΎΠ΄Π°: Если Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ подставит Π² URL Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅: β€” Ρ‚ΠΎ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ выполнится врСдоносный скрипт. ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ jQuery: Оказалось, Ссли Π² Ρ…Π΅ΡˆΠ΅ (#) ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ <img src=x onerror=alert(1)>, Ρ‚ΠΎ jQuery вставит Π΅Π³ΠΎ Π² DOM ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΊΠΎΠ΄! DOM XSS β€” коварная ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅Ρ‘ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ Π² исходном ΠΊΠΎΠ΄Π΅ страницы (ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡƒΠΆΠ΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅). Но Ссли ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ всС мСста, Π³Π΄Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² DOM, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ бСзопасныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, риск ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΎΠ²Π΅Ρ‚: всСгда провСряйтС сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (jQuery
ОглавлСниС

НСдавно я столкнулся с интСрСсной ΠΈ опасной ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ β€” DOM-based XSS (мСТсайтовый скриптинг Π½Π° основС DOM). Π­Ρ‚ΠΎ Π½Π΅ обычная XSS, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ловят Π½Π° сСрвСрС, Π° Π±ΠΎΠ»Π΅Π΅ хитрая Π°Ρ‚Π°ΠΊΠ°, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ прямо Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΆΠ΅Ρ€Ρ‚Π²Ρ‹. РасскаТу, ΠΊΠ°ΠΊ я Π΅Ρ‘ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» ΠΈ Ρ‡Ρ‚ΠΎ сдСлал, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. πŸ•΅οΈβ€β™‚οΈ

πŸ€” Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ DOM XSS?

DOM XSS Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° JavaScript Π±Π΅Ρ€Ρ‘Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π½Π΅Π½Π°Π΄Ρ‘ΠΆΠ½ΠΎΠ³ΠΎ источника (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ· URL) ΠΈ вставляСт ΠΈΡ… Π² опасныС мСста Π½Π° страницС (sinks), Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ:

  • innerHTML
  • document.write()
  • eval()
  • ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ уязвимого ΠΊΠΎΠ΄Π°:

-2

Если Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ подставит Π² URL Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅:

-3

β€” Ρ‚ΠΎ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ выполнится врСдоносный скрипт.

πŸ” Как я искал DOM XSS Π² своём ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ» всС мСста, Π³Π΄Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· URL ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² DOM 🌐
    location.search, location.hash, document.referrer β€” всё это ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ источники Π°Ρ‚Π°ΠΊΠΈ.
  2. Искал опасныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (sinks) ⚠️
    innerHTML, outerHTML, document.write(), eval(), jQuery-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ (html(), append()) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.
  3. ВСстировал с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простых payloads οΏ½
    Вставлял
    "><script>alert(1)</script> ΠΈ смотрСл, сработаСт Π»ΠΈ.

ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ jQuery:

-4

Оказалось, Ссли Π² Ρ…Π΅ΡˆΠ΅ (#) ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ <img src=x onerror=alert(1)>, Ρ‚ΠΎ jQuery вставит Π΅Π³ΠΎ Π² DOM ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΊΠΎΠ΄!

πŸ›‘οΈ Как я защитился ΠΎΡ‚ DOM XSS

  1. Π­ΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Π» Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄ вставкой Π² DOM πŸ›‘οΈ
    Использовал
    textContent вмСсто innerHTML, Ссли Π½Π΅ Π½ΡƒΠΆΠ΅Π½ HTML.
    Для динамичСского HTML примСнял санитайзСры, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€
    DOMPurify.
  2. ΠžΡ‚ΠΊΠ°Π·Π°Π»ΡΡ ΠΎΡ‚ опасных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ 🚫
    Π—Π°ΠΌΠ΅Π½ΠΈΠ»
    eval() Π½Π° JSON.parse().
    ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ
    document.write().
  3. Настроил CSP (Content Security Policy) πŸ”’
    Π”ΠΎΠ±Π°Π²ΠΈΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ:
-5
  1. β€” это Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ inline-скриптов.

πŸ’‘ Π’Ρ‹Π²ΠΎΠ΄

DOM XSS β€” коварная ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΅Ρ‘ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ Π² исходном ΠΊΠΎΠ΄Π΅ страницы (ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡƒΠΆΠ΅ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅). Но Ссли ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ всС мСста, Π³Π΄Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² DOM, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ бСзопасныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, риск ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π‘ΠΎΠ²Π΅Ρ‚: всСгда провСряйтС сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (jQuery, AngularJS) β€” ΠΎΠ½ΠΈ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ источником ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ!

А Π²Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с DOM XSS? Π”Π΅Π»ΠΈΡ‚Π΅ΡΡŒ Π² коммСнтариях! πŸ‘‡

#Security #WebDev #XSS #ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅