Dom Clobbering
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Możliwe jest generowanie zmiennych globalnych w kontekście JS za pomocą atrybutów id
i name
w tagach HTML.
Tylko niektóre elementy mogą używać atrybutu name, aby zniszczyć globalne zmienne, są to: embed
, form
, iframe
, image
, img
i object
.
Interesująco, gdy używasz elementu form do zniszczenia zmiennej, otrzymasz wartość toString
samego elementu: [object HTMLFormElement]
, ale w przypadku anchor wartość toString
będzie href
anchor. Dlatego, jeśli zniszczysz używając tagu a
, możesz kontrolować wartość, gdy jest traktowana jako ciąg:
Możliwe jest również przeładowanie tablicy oraz atrybutów obiektów:
Aby zniszczyć 3. atrybut (np. x.y.z), musisz użyć form
:
Clobbering więcej atrybutów jest bardziej skomplikowane, ale wciąż możliwe, używając iframe:
Tag stylu jest używany do dania wystarczająco dużo czasu na renderowanie iframe. Bez niego napotkasz alert o niezdefiniowanym.
Aby zniszczyć głębsze atrybuty, możesz użyć iframe'ów z kodowaniem html w ten sposób:
Jeśli filtr przechodzi przez właściwości węzła używając czegoś takiego jak document.getElementByID('x').attributes
, możesz zastąpić atrybut .attributes
i złamać filtr. Inne właściwości DOM, takie jak tagName
, nodeName
lub parentNode
i inne, również są zastępowalne.
window.someObject
W JavaScript powszechnie można znaleźć:
Manipulowanie HTML na stronie pozwala na nadpisanie someObject
węzłem DOM, co potencjalnie wprowadza luki w zabezpieczeniach. Na przykład, możesz 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 URL podwójnych cudzysłowów. Oznacza to, że możesz wstrzyknąć zakodowany podwójny cudzysłów, który zostanie zdekodowany w czasie wykonywania. Dlatego wstrzyknięcie czegoś takiego jak <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:"onerror=alert(1)//">
spowoduje, że HTML zakodowany "
zostanie zdekodowany w czasie wykonywania i ucieknie 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, aby je oczyścić. Jednak dodając input
z id=attributes
wewnątrz formularza, skutecznie nadpisujesz właściwość atrybutów, uniemożliwiając sanitariuszowi dostęp do rzeczywistych atrybutów.
Możesz znaleźć przykład tego typu klobberingu w tym opisie CTF.
Zgodnie z dokumentacją możliwe jest nadpisanie atrybutów obiektu dokumentu za pomocą DOM Clobbering:
Interfejs Document obsługuje właściwości nazwane. 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 wprowadził, ignorując późniejsze duplikaty, a wartości z atrybutów id pojawiają się przed wartościami z atrybutów name, gdy ten sam element wnosi oba:
- Wartość atrybutu treści name dla wszystkich exposed elementów embed, form, iframe, img i exposed elementów object, które mają niepusty atrybut treści name i znajdują się w drzewie dokumentu z dokumentem jako ich korzeniem; - Wartość atrybutu treści id dla wszystkich exposed elementów object, które mają niepusty atrybut treści id i znajdują się w drzewie dokumentu z dokumentem jako ich korzeniem; - Wartość atrybutu treści id dla wszystkich elementów img, które mają zarówno niepusty atrybut treści id, jak i niepusty atrybut treści name, i znajdują się w drzewie dokumentu z dokumentem jako ich korzeniem.
Korzystając z tej techniki, możesz nadpisać powszechnie używane wartości takie jak document.cookie
, document.body
, document.children
, a nawet metody w interfejsie Document, takie jak document.querySelector
.
Wyniki wywołań document.getElementById()
i document.querySelector()
mogą być zmieniane przez wstrzyknięcie tagu <html>
lub <body>
z identycznym atrybutem id. Oto jak można to zrobić:
Ponadto, stosując style do ukrywania tych wstrzykniętych tagów HTML/body, można zapobiec zakłóceniom ze strony innego tekstu w innerText
, co zwiększa skuteczność ataku:
Badania nad SVG ujawniły, że tag <body>
może być również skutecznie wykorzystywany:
Aby tag HTML działał w SVG w przeglądarkach takich jak Chrome i Firefox, konieczny jest tag <foreignobject>
:
Możliwe jest dodanie nowych wpisów wewnątrz formularza po prostu określając atrybut form
wewnątrz niektórych tagów. Możesz to wykorzystać do dodania nowych wartości wewnątrz formularza oraz nawet do dodania nowego przycisku do wysłania go (clickjacking lub nadużywanie niektórego kodu JS .click()
):
Aby uzyskać więcej atrybutów formularza w przycisku sprawdź to.
Heyes, Gareth. JavaScript dla hakerów: Naucz się myśleć jak haker.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)