DOM API‚ÆinnerHTML‚Í“™‰¿‚Å‚Í‚È‚¢

Posted by Hiraku on 2011-06-05

Å‹ßA“¿ŠÛ–{‚ð‚¶‚í‚¶‚í“Ç‚ñ‚Å‚¢‚é‚Ì‚Å‚·‚ªADOM based XSS‚̘b‚ª‘‚¢‚Ä‚ ‚Á‚½‚̂ŁA­‚µŒ¾‹y‚µ‚Ä‚¨‚±‚¤‚ÆŽv‚¢‚Ü‚·B

“¿ŠÛ–{‚©‚çˆø—p

DOM based XSS‚ƌĂ΂ê‚éXSS‚ª‚ ‚è‚Ü‚·B‚±‚ê‚́AJavaScript‚É‚æ‚èƒNƒ‰ƒCƒAƒ“ƒg‘¤‚Å•\Ž¦ˆ—‚·‚é‰ÓŠ‚ª‚ ‚èA‚»‚±‚ɐƎ㐫‚ª‚ ‚éê‡‚ÌXSS‚Å‚·B

ƒTƒ“ƒvƒ‹‘‚¢‚Ä‚Ý‚Ü‚µ‚½B

<script>
document.write(unescape(location.href));
</script>

‚±‚¢‚‚ð“K“–‚ȃtƒ@ƒCƒ‹–¼‚Å•Û‘¶‚µ‚āAdomxss.html#<script>alert("hello")<script>‚È‚Ç‚ÌURL‚ŃAƒNƒZƒX‚·‚é‚Æalert‚ª•\Ž¦‚³‚ê‚é‚Í‚¸‚Å‚·B”CˆÓ‚̃XƒNƒŠƒvƒg‚ªŽÀs‰Â”\‚ȏó‘Ô‚Á‚Ä‚±‚Æ‚Å‚·‚ˁB”CˆÓ‚̃XƒNƒŠƒvƒg‚ªŽÀs‰Â”\‚Á‚Ä‚±‚Ƃ́AƒZƒbƒVƒ‡ƒ“ƒNƒbƒL[“‚Ý•ú‘è‚ŁA‘¼l‚ɐ¬‚èÏ‚Ü‚µ‚Ä”ƒ‚¢•¨‚Å‚«‚¿‚á‚Á‚½‚è‚·‚郌ƒxƒ‹‚Å‚·B

ˆ«‚¢‚Ì‚Ídocument.write()‚âinnerHTML‚¾

—á‚Í‚©‚È‚è‚í‚´‚Ƃ炵‚¢‚Å‚·‚ªAdocument.write()‚âinnerHTML‚Æ‚¢‚Á‚½A•¶Žš‚»‚Ì‚Ü‚Ü‚ð‘‚«o‚·ƒƒ\ƒbƒh‚âƒvƒƒpƒeƒB‚ðŽg‚¤‚ƁA‚»‚±‚ÉDOM based XSS‚ª‰Â”\‚É‚È‚é—]’n‚ª¶‚Ü‚ê‚Ü‚·B
‘΍ô‚Æ‚µ‚Ä‚Íhtml‚ðƒGƒXƒP[ƒv‚·‚éA‚¿‚á‚ñ‚Æ‚µ‚½ƒeƒ“ƒvƒŒ[ƒgƒGƒ“ƒWƒ“‚ðŽg‚¤AƒEƒFƒu•W€‚ÌDOM API‚ðŽg‚¤‚È‚Ç‚ª‹“‚°‚ç‚ê‚Ü‚·B

DOM‚ðŽg‚Á‚½‘΍ô—á

DOM‚ÌAPI‚Í“KØ‚ȃGƒXƒP[ƒvˆ—‚ðŽ©“®‚ōs‚Á‚Ä‚­‚ê‚邽‚߁AXSS‚̑΍ô‚É‚È‚è‚Ü‚·B‚½‚Æ‚¦‚΂³‚Á‚«‚̐Ǝã‚ȃR[ƒh‚Í‚±‚ñ‚È•—‚ɏ‘‚¯‚ÎOKB

<script>
onload=function(){
  document.body.appendChild(document.createTextNode(location.href));
};
</script>

‚µ‚©‚µinnerHTML‚Ì•û‚ªl‹CŽÒH

uDOM vs innerHTMLv‚ŃOƒO‚é‚ƁAƒpƒtƒH[ƒ}ƒ“ƒX‚ð”äŠr‚·‚é‹LŽ–‚ª‚½‚­‚³‚ñŒ©‚‚©‚è‚Ü‚·B‚È‚©‚È‚©”äŠr‚·‚é‚͓̂‚¢‚¯‚ê‚ǁA’Pƒ‚Ȑ«”\‚ÅŒ¾‚¦‚ÎinnerHTML‚Ì•û‚ª‘¬‚¢ŒXŒü‚É‚ ‚é‚炵‚¢‚Å‚·‚ˁB

‚ ‚ÆDOM‚ÌAPI‚Í–Ê“|‚­‚³‚¢‚±‚Æ‚ª‘½‚¢‚Å‚·Bdocument.createElement()‚Æ‚©appendChild()‚µ‚Ü‚­‚é‚æ‚è‚́AinnerHTML‚Å•¶Žš—ñ˜AŒ‹‚µ‚¿‚á‚Á‚½•û‚ªŠy‚©‚à‚µ‚ê‚È‚¢B

‚Ȃ̂ŁA‘æŽOŽÒ‚Ì“ü—Í‚ðŽó‚¯•t‚¯‚é•”•ª‚¾‚¯‚¿‚á‚ñ‚ÆDOM‚ŏ‘‚¢‚āAŠO•”“ü—Í‚Ì“ü‚荞‚Þ—]’n‚Ì‚È‚¢•”•ª‚¾‚¯innerHTML‚ŏ‘‚­A‚®‚ç‚¢‚ª‚æ‚¢‚ÆŽv‚¢‚Ü‚·B

‚½‚¾AAA‚±‚¤‚¢‚¤innerHTML‚ð‚΂è‚΂èŽg‚Á‚½‹LŽ–‚ªA–¢‚¾‚ɐl‹C‚ðW‚ß‚é‚Æ‚±‚ë‚ðŒ©‚é‚ƁAuDOM‚̏‘‚«Š·‚¦‚ÍinnerHTML‚ðŽg‚Á‚ď‘‚­‚à‚Ì‚È‚ñ‚Å‚·‚ˁIƒƒ‚ƒƒ‚`™v‚Ý‚½‚¢‚ÈŠ¨ˆá‚¢‚ð‚·‚él‚ª‘½‚»‚¤‚ŁA¡‚̏󋵂͗ǂ­‚È‚¢‹C‚ª‚µ‚Ä‚¢‚Ü‚·B

Œ¾‚¢‚½‚¢‚±‚Æ

  • DOM API‚ÆinnerHTML‚Í“™‰¿‚Å‚Í‚È‚¢BƒpƒtƒH[ƒ}ƒ“ƒX‚¾‚¯‚Å”äŠr‚·‚é‚̂̓iƒ“ƒZƒ“ƒXB
  • innerHTML‚͊댯‚ȏ‘‚«•û‚Å‚ ‚éB‰½‚Å‚à‚©‚ñ‚Å‚àinnerHTML‚ðŽg‚¤‚Ì‚Í‚â‚ß‚½•û‚ª‚¢‚¢B
  • JavaScript‚É‚¾‚Á‚ÄXSS‚ðì‚荞‚މ”\«‚ª‚ ‚éBDOM based XSS‚Í‚à‚¤­‚µŽü’m‚³‚ê‚é‚ׂ«

‚à‚Á‚Əڂµ‚­’m‚肽‚¢l‚Í

DOM based XSS‚Í‚±‚±‚ª‚©‚È‚èÚ‚µ‚¢B‰pŒê‚¾‚¯‚ǁB
DOM based XSS Prevention Cheat Sheet - OWASP

–`“ª‚Ì“¿ŠÛ–{‚Á‚Ä‚Ì‚Í‚±‚ê‚Ì‚±‚ƂˁBƒT[ƒo[ƒTƒCƒh‚̘b‚ª‘½‚¢‚¯‚ǁAWeb‰®‚³‚ñ‚Í’m‚Á‚Ä‚¨‚­‚ׂ«“à—eB(DOM based XSS‚Íp115‚Ì•Ó‚è)
‘ÌŒn“I‚ÉŠw‚Ô ˆÀ‘S‚ÈWebƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚̍ì‚è•û@ÆŽã«‚ª¶‚Ü‚ê‚錴—‚Ƒ΍ô‚ÌŽÀ‘H [‘åŒ^–{] / “¿ŠÛ _ (’˜); ƒ\ƒtƒgƒoƒ“ƒNƒNƒŠƒGƒCƒeƒBƒu (Š§)
‘ÌŒn“I‚ÉŠw‚Ô ˆÀ‘S‚ÈWebƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚̍ì‚è•û@ÆŽã«‚ª¶‚Ü‚ê‚錴—‚Ƒ΍ô‚ÌŽÀ‘H [‘åŒ^–{] / “¿ŠÛ _ (’˜); ƒ\ƒtƒgƒoƒ“ƒNƒNƒŠƒGƒCƒeƒBƒu (Š§)

ƒnƒCƒpƒtƒH[ƒ}ƒ“ƒXJavaScript‚ÉDOM‚ÆinnerHTML‚Ì‘¬“x”äŠr‚Ì‹LŽ–‚ªÚ‚Á‚Ä‚½Bip37 3Í‚Ì‚ ‚½‚èj
ƒnƒCƒpƒtƒH[ƒ}ƒ“ƒXJavaScript [‘åŒ^–{] / Nicholas C. Zakas (’˜); …–ì ‹M–¾ (–|–ó); ƒIƒ‰ƒCƒŠ[ƒWƒƒƒpƒ“ (Š§)
ƒnƒCƒpƒtƒH[ƒ}ƒ“ƒXJavaScript [‘åŒ^–{] / Nicholas C. Zakas (’˜); …–ì ‹M–¾ (–|–ó); ƒIƒ‰ƒCƒŠ[ƒWƒƒƒpƒ“ (Š§)

innerHTML‚ðŽg‚í‚È‚¢DOM‚ÌŽQl}‘BuDOM Scriptingv“I‚È–¼‘O‚Ì–{‚È‚ç‚ ‚Ü‚èƒnƒYƒŒ‚Í‚È‚¢‹C‚ª‚·‚éBŽ„‚Í‚±‚ê‚ŕ׋­‚µ‚Ü‚µ‚½‚ªA‘¼‚É‚à‚¢‚¢–{‚ª‚ ‚é‚©‚à‚µ‚ê‚È‚¢B
Web•W€ƒeƒLƒXƒg(1) DOM Scripting (Web•W€ƒeƒLƒXƒgƒVƒŠ[ƒY) [’Ps–{iƒ\ƒtƒgƒJƒo[j] / ŒÃâ× ˆê_ (’˜); ‹Zp•]˜_ŽÐ (Š§)
Web•W€ƒeƒLƒXƒg(1) DOM Scripting (Web•W€ƒeƒLƒXƒgƒVƒŠ[ƒY) [’Ps–{iƒ\ƒtƒgƒJƒo[j] / ŒÃâ× ˆê_ (’˜); ‹Zp•]˜_ŽÐ (Š§)

keyword: javascript Security

JavaScript‚̍ŐV‹LŽ–

×

‚±‚̍L‚Í90“úˆÈãV‚µ‚¢‹LŽ–‚Ì“Še‚ª‚È‚¢ƒuƒƒO‚É•\Ž¦‚³‚ê‚Ä‚¨‚è‚Ü‚·B