Dom Clobbering
Podstawy
Możliwe jest generowanie globalnych zmiennych w kontekście JS za pomocą atrybutów id
i name
w tagach HTML.
Tylko określone elementy mogą używać atrybutu name do nadpisania globalnych zmiennych, są to: embed
, form
, iframe
, image
, img
i object
.
Co ciekawe, gdy używasz elementu formularza do nadpisania zmiennej, otrzymasz wartość toString
tego elementu: [object HTMLFormElement]
, ale z anchor wartość toString
będzie wartością atrybutu href
. Dlatego, jeśli nadpisujesz za pomocą znacznika a
, możesz kontrolować wartość, gdy jest traktowana jako ciąg znaków:
Tablice i atrybuty
Możliwe jest również nadpisanie tablicy i atrybutów obiektu:
Aby nadpisać trzeci atrybut (np. x.y.z), musisz użyć formularza
:
Nadpisywanie większej liczby atrybutów jest bardziej skomplikowane, ale wciąż możliwe, przy użyciu ramek (iframes):
Tag style jest używany, aby dać wystarczająco dużo czasu na renderowanie iframe. Bez niego otrzymasz alert o undefined.
Aby nadpisać głębsze atrybuty, możesz użyć iframe'ów z kodowaniem HTML w ten sposób:
Ominięcie filtrów
Jeśli filtr pętli przez właściwości węzła, używając czegoś takiego jak document.getElementByID('x').attributes
, możesz nadpisać atrybut .attributes
i złamać filtr. Inne właściwości DOM, takie jak tagName
, nodeName
lub parentNode
, również są nadpisywalne.
Nadpisywanie window.someObject
window.someObject
W języku JavaScript często można znaleźć:
Manipulowanie HTML na stronie umożliwia nadpisanie someObject
za pomocą węzła DOM, co potencjalnie wprowadza podatności na bezpieczeństwo. Na przykład, można zastąpić someObject
elementem kotwicy wskazującym na złośliwy skrypt:
W podatnym kodzie, takim jak:
Ta metoda wykorzystuje źródło skryptu do wykonania niechcianego kodu.
Sztuczka: DOMPurify
pozwala na użycie protokołu cid:
, który nie koduje podwójne cudzysłowy w adresie URL. Oznacza to, że można wstrzyknąć zakodowany podwójny cudzysłów, który zostanie zdekodowany w czasie wykonania. Dlatego wstrzyknięcie czegoś takiego jak <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
spowoduje, że zakodowany HTML "
zostanie zdekodowany w czasie wykonania i wydostanie się z wartości atrybutu, aby utworzyć zdarzenie onerror
.
Inna technika wykorzystuje element form
. Niektóre biblioteki po stronie klienta sprawdzają atrybuty nowo utworzonego elementu formularza w celu ich oczyszczenia. Jednak dodanie input
z id=attributes
wewnątrz formularza skutecznie nadpisuje właściwość atrybutów, uniemożliwiając dostęp do rzeczywistych atrybutów przez oczyszczacz.
Możesz znaleźć przykład tego rodzaju nadpisywania w tym opisie CTF.
Nadpisywanie obiektu dokumentu
Zgodnie z dokumentacją możliwe jest nadpisanie atrybutów obiektu dokumentu za pomocą DOM Clobbering:
Interfejs Document obsługuje nazwane właściwości. Obsługiwane nazwy właściwości obiektu Document w dowolnym momencie składają się z następujących, w kolejności drzewa zgodnie z elementem, który je dostarczył, ignorując późniejsze duplikaty, a wartości z atrybutów id pochodzą przed wartościami z atrybutów name, gdy ten sam element dostarcza oba:
- Wartość atrybutu name dla wszystkich eksponowanych elementów embed, form, iframe, img i eksponowanych elementów object, które mają niepusty atrybut name i są w drzewie dokumentu z dokumentem jako korzeniem; - Wartość atrybutu id dla wszystkich eksponowanych elementów object, które mają niepusty atrybut id i są w drzewie dokumentu z dokumentem jako korzeniem; - Wartość atrybutu id dla wszystkich elementów img, które mają zarówno niepusty atrybut id, jak i niepusty atrybut name, i są w drzewie dokumentu z dokumentem jako korzeniem.
Za pomocą tej techniki można nadpisać powszechnie używane wartości, takie jak document.cookie
, document.body
, document.children
, a nawet metody w interfejsie Document, takie jak document.querySelector
.
Pisanie po zastąpieniu elementu
Wyniki wywołań document.getElementById()
i document.querySelector()
mogą być zmienione poprzez wstrzyknięcie znacznika <html>
lub <body>
z identycznym atrybutem id. Oto jak to można zrobić:
Ponadto, poprzez zastosowanie stylów do ukrycia wstrzykniętych tagów HTML/body, można zapobiec zakłóceniom spowodowanym przez inne teksty w innerText
, co zwiększa skuteczność ataku:
Badania nad SVG wykazały, że tag <body>
może być również skutecznie wykorzystany:
Aby tag HTML działał wewnątrz SVG w przeglądarkach takich jak Chrome i Firefox, konieczne jest użycie tagu <foreignobject>
:
Nadpisywanie formularzy
Możliwe jest dodawanie nowych wpisów do formularza poprzez określenie atrybutu form
wewnątrz niektórych tagów. Można to wykorzystać do dodawania nowych wartości do formularza oraz do dodawania nowego przycisku do jego wysłania (clickjacking lub nadużycie kodu JS .click()
):
Aby uzyskać więcej atrybutów formularza, sprawdź to.
Referencje
Heyes, Gareth. JavaScript dla hakerów: Naucz się myśleć jak haker.
Last updated