DOM Clobbering

Czym jest i czy dalej ma znaczenie w 2025 roku?

DOM Clobbering
Kacper

O Autorze

Kacper Rusin

Kacper Rusin

Uczeń ZSTI w Gliwicach

  • Certyfikat MTCNA
  • Uczestnik MSHP w Krakowie (z Sekuraka)
  • Pasjonat Cyberbezpieczeństwa
  • Uczestnik Akademii Sekuraka

Moje projekty:

  • sfi.biz.pl
  • ktsgliwice.pl
  • barglowka.pl
  • i wiele innych...
MSHP Lorys

Disclaimer

Przedstawione informacje można wykorzystywać tylko i wyłącznie w celach edukacyjnych.

System Hacked Teemo

Czym jest DOM Clobbering?

DOM Clobbering to technika polegająca na wstrzykiwaniu kodu HTML do strony w celu manipulowania DOM i ostatecznie zmiany zachowania JavaScript na stronie

Teemo

1. Nowe właściwości w Window

Według specyfikacji HTML, nowe właściwości w window tworzy:

Atrybut id

Dla wszystkich elementów HTML

<img id="abc"></img>

Atrybut name

Tylko dla: embed, form, img, object

<img name="xyz">
window.abc  // → <img id="abc">
window.xyz  // → <img name="xyz">

2. Nowe właściwości w Document

Według specyfikacji HTML, nowe właściwości w document tworzy:

Element object

z niepustym atrybutem id

<object id="abc"></object>

Element img

z niepustym id ORAZ name

<img id="xyz" name="xyz">
document.abc  // → <object id="abc">
document.xyz  // → <img id="xyz" name="xyz">

⚠️ Można nadpisać wbudowane właściwości jak document.getElementById!

3. Nowe właściwości w Form

Według specyfikacji HTML, właściwości form tworzy:

Listed elements

z atrybutem id lub name

(input, select, textarea, button, ...)
⚠️ oprócz <input type="image">

Element img

z atrybutem id lub name

którego form owner to dany form

<form id="f">
  <input name="action">
  <input id="method">
</form>
f.action  // → <input name="action"> (nadpisuje form.action!)
f.method  // → <input id="method"> (nadpisuje form.method!)

Kolizje nazw

<div id="abc"></div>
<div id="abc"></div>

window.abc zwróci HTMLCollection (iterowalną listę).

Zagnieżdżony dostęp

<img id="abc"></>
<img id="abc" name="second"></>

Możemy odwołać się do konkretnego elementu:

window.abc.second

toString() Magic

Większość elementów po konwersji na string zwraca [object HTMLElement].

Ale <a> i <area> zwracają swój href!

const a = document.createElement("a");
a.href = "tel:997";
a.toString(); // "tel:997"
Teemo

Przykład 1: Obejście prostego sanitizera

Ręcznie pisane sanitizery często są podatne na DOM Clobbering.

const EVIL_TAGS = ['script', 'noscript', 'style', 'svg', 'math'];
function sanitize(html) {
    const doc = new DOMParser()...
}

Atakujący może nadpisać wbudowane metody i obejść walidację!

Demo

Demo

Przykład 2: Psujemy kod, aby usunąć style

DOM Clobbering może być użyty do zepsucia działania kodu JavaScript.

// Kod zakłada że document.querySelectorAll(); działa normalnie
    setTimeout(() => {
      const styles = document.querySelectorAll('#render style');
      styles.forEach(s => s.remove());
    }, 1000);

Wstrzyknięcie HTML może nadpisać document.querySelectorAll('#render style'); i zepsuć logikę!

Demo

Demo

Przykład: Angular Sanitizer

Błąd w sanitizerze Angulara pozwalał na ominięcie zabezpieczeń.

Demo

Przykład: VKontakte (VK)

VK udostępnia kod embed do wklejania na strony.

<div id="vk_post_-1_1"></div>
<script type="text/javascript">
  (function(d, s, id) {
    // ... kod ładujący skrypt VK ...
  }(document, 'script', 'vk_openapi_js'));
</script>

Jeśli atakujący może wstrzyknąć HTML przed tym skryptem, może nadpisać zmienne używane przez skrypt VK i przejąć kontrolę nad ładowanym zasobem.

Demo

Jak się bronić przed DOM Clobbering?

Używaj sprawdzonych bibliotek do sanityzacji HTML:

  • DOMPurify (cure53)
    Sprawdza czy element jest faktycznie elementem DOM
  • safevalues (Google)
    Moduł no_clobber.ts chroni przed nadpisywaniem
  • Closure Library (Google)
    Plik noclobber.js w sanitizerze HTML

💡 Kluczowa technika: sprawdzanie instanceof i używanie Object.getOwnPropertyDescriptor

Podsumowanie typów

  • Typ 1: Nowe właściwości w window
  • Typ 2: Nowe właściwości w document
  • Typ 3: Nowe właściwości w form

Dziękuję za uwagę!

Prezentacja inspirowana prezką Michała Bentkowskiego (Google).

Pytanie na ocene: Ile razy pojawił się Teemo na prezentacji?

3


Teemo

3