Czym jest i czy dalej ma znaczenie w 2025 roku?
Kacper Rusin
Uczeń ZSTI w Gliwicach
Moje projekty:
Przedstawione informacje można wykorzystywać tylko i wyłącznie w celach edukacyjnych.
DOM Clobbering to technika polegająca na wstrzykiwaniu kodu HTML do strony w celu manipulowania DOM i ostatecznie zmiany zachowania JavaScript na stronie
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">
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!
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!)
<div id="abc"></div>
<div id="abc"></div>
window.abc zwróci HTMLCollection (iterowalną listę).
<img id="abc"></>
<img id="abc" name="second"></>
Możemy odwołać się do konkretnego elementu:
window.abc.second
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"
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ę!
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ę!
Błąd w sanitizerze Angulara pozwalał na ominięcie zabezpieczeń.
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.
Używaj sprawdzonych bibliotek do sanityzacji HTML:
no_clobber.ts chroni przed nadpisywaniem
noclobber.js w sanitizerze HTML
💡 Kluczowa technika: sprawdzanie instanceof i używanie Object.getOwnPropertyDescriptor
windowdocumentformPrezentacja inspirowana prezką Michała Bentkowskiego (Google).
Pytanie na ocene: Ile razy pojawił się Teemo na prezentacji?
3
3