æ¬ç¨¿ã¯CodeZineã«2015å¹´12æ28æ¥ã«æ²è¼ãããè¨äºã®åæ²ã¨ãªãã¾ãã
ã¯ãã¹ãµã¤ãã¹ã¯ãªããã£ã³ã°(XSS)ã¯ãå¤ãããåå¨ãéçºè
ã«ãã£ã¨ãããç¥ãããã»ãã¥ãªãã£ä¸ã®åé¡ã®ã²ã¨ã¤ã§ãããªãããOWASP Top 10ã§ã2010å¹´ã«å¼ãç¶ã2013å¹´ã§ã3ä½ã¨ãæªã ã«æ ¹çµ¶ã§ãã¦ããªãèå¼±æ§ã§ãã
æ¬è¨äºã§ã¯ãWebã¢ããªã±ã¼ã·ã§ã³ã®éçºã«ããã¦XSSãæ ¹çµ¶ããããã«å¿
è¦ãªå¯¾çã®åºæ¬ãæ¬æ°ã§ãä¼ããã¾ãã
ã¯ããã«
OWASPã§ã¯éçºè
ã«åããã»ãã¥ãªãã£å¯¾çã®ããã®ããã¥ã¡ã³ãããã¼ãã·ã¼ããå¤æ°ç¨æãã¦ãããXSSã¸ã®å¯¾çã¨ãã¦ããXSS (Cross Site Scripting) Prevention Cheat Sheetãã¨ããããã¥ã¡ã³ããç¨æããã¦ãã¾ãã
ãã ãããã®XSS Prevention Cheat Sheetã¯ã·ã³ãã«ãªã«ã¼ã«ãå®ãããã¼ãã·ã¼ãã§ããã¨è¬³ãã¤ã¤ããéçºè
ãç´é¢ããããããå ´é¢ã§å
æ¬çã«é©ç¨ã§ããæãã®ãªããã®ãç®æãã¦ããããã«ãå¤å²ã«æ¸¡ãæ¡ä»¶ã®ãã¨ã§ã®è©³ç´°ãªã«ã¼ã«ãå®ãããã¦ãããæ®å¿µãªãã決ãã¦èª°ãããç°¡åã«ããé©ç¨ã§ãããã®ã§ã¯ãªãã¨ããã®ãç¾ç¶ã§ãã
ããã§ãæ¬è¨äºã§ã¯ããä¸è¬çã§é »ç¹ã«ééããå
±éçãªç¶æ³ä¸ã«éå®ãããã¨ã§ãXSSã¸ã®å¯¾çæ¹æ³ãç°¡æ½ã«èª¬æãããã¨æãã¾ãã
æ¬è¨äºã§ã¯ç©è¶³ããªãæ¹ãæ¬è¨äºã ãã§ã¯èªèº«ã®éçºãã¦ããWebã¢ããªã±ã¼ã·ã§ã³ã¸ã®å¯¾çã¨ãã¦ä¸ååã ã¨æããæ¹ã¯ãã²XSS Prevention Cheat Sheetã®ã»ãã«ãç®ãéãã¦ã¿ã¦ãã ããã
復ç¿: ããããXSSã¨ã¯
XSSã¸ã®å¯¾çæ¹æ³ã解説ããåã«ãæ¹ãã¦XSSã¨ã¯ã©ã®ãããªèå¼±æ§ã§ããã®ããæ¯ãè¿ã£ã¦ããã¾ãããã
ä¾ãã°ãhttp://shop.example.jp/search?item=OWASP ã¨ããURLã§ã¢ã¯ã»ã¹ããã¨ãåååã«ãOWASPããå«ãååã®ä¸è¦§ã表示ããã·ã§ããã³ã°ãµã¤ãããã£ãã¨ãã¾ãã
ã¬ã¹ãã³ã¹ã¨ãã¦è¿ãããHTMLã®ä¸é¨ã«ã¯ãURLã®itemãã©ã¡ã¼ã¿ã§æå®ãããæååãOWASPããå«ã¾ãã¦ãã¾ãã
<div> <span>OWASP</span>ã«é¢ããæ¤ç´¢çµæï¼20件 </div>
ããã§ãhttp://shop.example.jp/search?item=<s>OWASP</s>ã®ããã«ãOWASPãã¨ããæååã®ãããã«ã<s>OWASP</s>ãã¨ããæååãä¸ãã¦ã¢ã¯ã»ã¹ããå ´åã«ããµã¼ãå´ããã®ã¾ã¾ã<s>OWASP</s>ãã¨ããæååãHTMLå ã«å«ãã¦è¿ããã¨ãã¾ãã
<div> <span><s>OWASP</s></span>ã«é¢ããæ¤ç´¢çµæï¼0件 </div>
ãã©ã¦ã¶ä¸ã«æååã¨ãã¦ã<s>OWASP</s>ãã¨è¡¨ç¤ºãããã«ã¯ãHTMLå
ã«ã¯ã<s>OWASP</s>ãã¨çæãããªããã°ãããªãã®ã§ããããµã¼ãä¸ã§HTMLãçæããéã«ã<ããã>ããã¨ã¹ã±ã¼ãããã«ãã®ã¾ã¾åºåãã¦ããããã«ããã©ã¦ã¶å
ã§ã¯ãã®ã¾ã¾HTMLã¿ã°ã¨ãã¦åãæ±ããã¦ãã¾ãã¾ãã
ãã®ããã«ãHTMLãçæãã段éã§ã®ã¨ã¹ã±ã¼ãã«æ¼ãã®ããç¶æ
ã§ãæ»æè
ãã<script>alert("hacked!")</script>ãã®ãããªæååãä¸ãããã®ã¨ãã®URL http://shop.example.jp/search?item=<script>alert("hacked!")</script> *1ãSNSãªã©ãéãã¦å¤æ°ã®äººã«æ¡æ£ããã¨ãã¾ãã
ãã®URLã«ã¢ã¯ã»ã¹ããä¸è¬ã®å©ç¨è
ã¯ããã©ã¦ã¶ä¸ã§ãããªã表示ããããhacked!ãã®ã¡ãã»ã¼ã¸ã«ããã®ã·ã§ããã³ã°ãµã¤ããæ»æè
ã«æ¹ããããã¦ãã¾ã£ãã®ã§ã¯ãªããã¨å¼·ãä¸å®ãæãã¦ãã¾ãã§ãããã
ãã®ä¾ã§ã¯æ»æè
ã¯alerté¢æ°ã«ãã£ã¦ã¡ãã»ã¼ã¸ã表示ãããã¨ããåç´ã§å®è³ªçã«ã¯ç¡å®³ãªãã¨ããè¡ã£ã¦ãã¾ããããæ»æè
ã®ä½æããJavaScriptãå©ç¨è
ã®ãã©ã¦ã¶ä¸ã§åãã¨ãããã¨ã¯ãããæªè³ªãªæ»æãè¡ããã¨ãããã¨ãæå³ãã¦ãã¾ãã
ä¾ãã°ãæ»æè
ã¯JavaScriptã«ãã£ã¦HTMLã«èªç±ã«ã¡ãã»ã¼ã¸ãæ¸ãè¾¼ãè¦ããä¸ã®æ¹ãããè¡ããã¨ãã§ãã¾ããããã®ã·ã§ããã³ã°ãµã¤ãã«å©ç¨è
èªèº«ãç»é²ãã¦ããæ°åãä½æãã¡ã¼ã«ã¢ãã¬ã¹ãªã©ãçã¿è¦ããã¨ãã§ãã¾ããã¾ããå½ã®ã¯ã¬ã¸ããã«ã¼ãçªå·å
¥åç»é¢ãä½æããããã«å
¥åãããã«ã¼ãçªå·ãæ¾åãããã¨ããã»ãã·ã§ã³Cookieã«httponlyå±æ§ãä»ä¸ããã¦ããªãå ´åã«ã¯document.cookieãéãã¦å©ç¨è
ã®ã»ãã·ã§ã³ãæ»æè
ãã¾ãã¾ãä¹ã£åã£ã¦ãã¾ããã¨ãã§ãã¾ãã
ãã®ããã«ãHTMLãçæããéã«æååãã¨ã¹ã±ã¼ãããã¦ããããæ»æè
ã«ãã£ã¦ä½æãããHTMLã¿ã°ãJavaScriptãå©ç¨è
ã®ãã©ã¦ã¶ä¸ã§è¡¨ç¤ºãå®è¡ãããèå¼±æ§ãXSSã¨å¼ã³ã¾ãã
XSSã®çºçããåå
å
ã»ã©ã®ä¾ã§ã¯ãããã¹ãã¨ãã¦è¡¨ç¤ºãããã¹ãé¨å(ããã¹ããã¼ã)ã«æ»æè
ã«ãã£ã¦ä¸ããããã<ããã>ããã¨ã¹ã±ã¼ãããããã®ã¾ã¾åãè¾¼ã¾ããããã«HTMLã®ã¿ã°ã¨ãã¦æ±ããããã¨ã§XSSãçºçãã¾ãããããã以å¤ã«ãXSSãçºçããåå ã¨ãã¦ããããã®ã¯ãå±æ§å¤ã¸åºåããéã«ã"ããã'ããã¨ã¹ã±ã¼ãããã¦ããªãã¨ãããã®ã§ãã
åè¿°ã¨åãã http://shop.example.jp/search?item=OWASP ã¨ããURLã«ã¢ã¯ã»ã¹ãããã¨ã§ãOWASPããå«ãååä¸è¦§ã表示ããã·ã§ããã³ã°ãµã¤ãããããããã§ã¯ã¬ã¹ãã³ã¹ã¨ãã¦è¿ãããHTMLã®ä¸é¨ã«inputè¦ç´ ã®valueå±æ§ã®å¤ã¨ãã¦URLã®itemãã©ã¡ã¼ã¿ã§æå®ããããOWASPãã¨ããæååãå«ã¾ãã¦ããã¨ãã¾ãã
<form method="GET" action="/search"> æ¤ç´¢æåå: <input type="text" name="item" value="OWASP"> <input type="submit" vaue="æ¤ç´¢"> </form>
ãã®ã¨ãã«ãæ»æè ãæ¤ç´¢æååã¨ãã¦ã" onmouseover="alert('hacked!')ãã¨ããæååãä¸ããå ´åã«ããµã¼ãå´ã以ä¸ã®ãããªHTMLãè¿ããã¨ãã¾ãã
<form method="GET" action="/search"> æ¤ç´¢æåå: <input type="text" name="item" value="" onmouseover="alert('hacked!')"> <input type="submit" vaue="æ¤ç´¢"> </form>
ããããã¨ãinputè¦ç´ ä¸ã§ã¯valueå±æ§ã¯ç©ºã«ãªããonmouseoverå±æ§ã«ãã£ã¦ãã¦ã¹ç§»åæã®ã¤ãã³ããã³ãã©ãè¨å®ãããHTMLã¨ãã¦ãã©ã¦ã¶ã«ã¯è§£éããã¾ãã
æ»æè
ã«ãã£ã¦èªå°ãããå©ç¨è
ããã©ã¦ã¶ã§ãã®URLãéãã¨ãonmouseoverã¤ãã³ããã³ãã©ãæå¹ã§ããããã«inputè¦ç´ ã®ä¸ã§ãã¦ã¹ãåãããç¬éã«ãã©ã¦ã¶å
ã§æ»æè
ã®ä½æããJavaScriptãåä½ãã¦ãã¾ãã¾ãã
ãã®ããã«ãããã¹ããã¼ãã§ã¯ã<ãã>ããã¨ã¹ã±ã¼ãããã¦ããªãããã«XSSãçºçãã¾ããããå±æ§å¤ã¸ã®åºåã§ã¯ã"ã(HTMLã®æ¸ãæ¹ã«ãã£ã¦ã¯ã'ãã®å ´åãããå¾ã¾ã)ã®ã¨ã¹ã±ã¼ãããªããã¦ããªãããã«XSSãçºçãã¾ããã
ã¾ããããã¹ããã¼ãã¨å±æ§å¤ä»¥å¤ã«ãããªã³ã¯å
ã¨ãã¦è¨å®ãããURLã«javascript:ã¹ãã¼ã ãªã©ãåãè¾¼ã¾ããå ´åã«ãXSSãçºçãã¾ãã
ä¾ãã°ãèªèº«ã®ãããã£ã¼ã«ã®è¨å®ã¨ãã¦ä»»æã®URLãç»é²ã§ããSNSããã£ãã¨ãã¾ããä»ã®å©ç¨è
ããã®äººç©ã®ãããã£ã¼ã«ãã¼ã¸ã表示ãããã¨ãã«ã¯ãURLã¯èªåçã«ãªã³ã¯ã¨ãã¦aè¦ç´ ã¨ãªãã¨ãã£ããã®ã§ãã
<div> <a href="https://www.owasp.org/index.php/Kansai">https://www.owasp.org/index.php/Kansai</a> </div>
ãã®ãããªå ´åã«ãæ»æè ãèªèº«ã®ãããã£ã¼ã«ã«URLã¨ãã¦ãjavascript:alert('hacked!')ãã¨ãã£ãæååãè¨å®ããå ´åã«ã以ä¸ã®ããã«ãã®ã¾ã¾aè¦ç´ ã®hrefå±æ§ã«ãã®æååãè¨å®ãããã¨ã©ããªãã§ããããã
<a href="javascript:alert('hacked!')">javascript:alert('hacked!')</a>
ãã®æ»æè
ã®ãããã£ã¼ã«ãã¼ã¸ãä¸è¬ã®å©ç¨è
ãé²è¦§ãããã®ã¨ãã«ãªã³ã¯å
ã®URLãã¯ãªãã¯ãã¦ãã¾ãã¨ãæ»æè
ã®ä½æããJavaScriptãå©ç¨è
ã®ãã©ã¦ã¶ä¸ã§åä½ãã¦ãã¾ãã¾ãã
ãã®ããã«ãæ»æè
ãä¸ããURLã«ãã£ã¦ãªã³ã¯ãçæããå ´åã«javascript:ã¹ãã¼ã ãªã©ã許容ãã¦ããã¨ãã¨ã¹ã±ã¼ãæ¼ãã®å ´åã¨åæ§ã«XSSãçºçãããã¨ã«ãªã£ã¦ãã¾ãã¾ãã
XSSã®å¯¾ç
ããã¾ã§èª¬æãã¦ããã¨ãããXSSãçºçããåå ã¯ä»¥ä¸ã®3種é¡ã大é¨åãå ãã¦ãã¾ãã
- ããã¹ããã¼ãã«åºåããéã®ã<ãã>ãã®ã¨ã¹ã±ã¼ãæ¼ã
- å±æ§å¤ã«åºåããéã®ã"ãã'ãã®ã¨ã¹ã±ã¼ãæ¼ã
- URLããªã³ã¯ã¨ãã¦åãæ±ãéã®ãããã³ã«ã¹ãã¼ã ã®ç¢ºèªæ¼ã
1.ããã³2.ã¯ã¨ã¹ã±ã¼ãæ¼ããXSSã®åå ã§ãããã¨ã¯èªæã§ãã®ã§ãHTMLã¨ãã¦åºåããéã«ããããã¨ã¹ã±ã¼ããã¾ããã¨ã¹ã±ã¼ããã¹ã対象ã¯ä»¥ä¸ã®5æåã§ãã
ã&ãã¯ç´æ¥XSSã®åå ã«ãªãããã§ã¯ããã¾ãããããã®æåãã¨ã¹ã±ã¼ãããªããã°ã¦ã¼ã¶ã¼ããå
¥åãããã&ããæ£ãã表示ã§ãã¾ããã®ã§ãã¨ã¹ã±ã¼ããå¿
è¦ã§ãã
< > " ' &
ã¾ãã2.ã«ã¤ãã¦ã¯ã¨ã¹ã±ã¼ãã«å ãã¦ãå±æ§å¤ãå¿
ãã"ãã¾ãã¯ã'ãã§å²ãããã«ãã¾ããããã§ãªããã°ã"ã'ãã¨ã¹ã±ã¼ããã¦ããã¨ãã¦ãXSSã®çºçã«ã¤ãªãããã¨ãããããã§ããå¤ãã®ããã°ã©ãã³ã°è¨èªãWebã¢ããªã±ã¼ã·ã§ã³ä½æç¨ã®ãã¬ã¼ã ã¯ã¼ã¯ã§ã¯ãHTMLã«åºåããããã«ãããã®æåãé©åã«ã¨ã¹ã±ã¼ãããé¢æ°ããããããç¨æããã¦ãããã¨ãå¤ãã§ãããã
PHPã§ããã° htmlspecialchars é¢æ°ãããã«ãããã¾ãã
<?php // GETã§ä¸ããããitemãã©ã¡ã¼ã¿ãåå¾ $item = $_GET[ 'item' ]; // æ§ã ãªå¦ç ... ?> <body> <!-- itemãã¨ã¹ã±ã¼ããã¦HTMLå ã®ããã¹ããã¼ãã«åºå --> <span><?php echo htmlspecialchars( $item, ENT_QUOTES, 'UTF-8' ); ?></span> ... <!-- itemãã¨ã¹ã±ã¼ããã¦HTMLå ã®å±æ§å¤ã«åºå --> æ¤ç´¢æåå: <input type="text" name="item" value="<?php echo htmlspecialchars( $item, ENT_QUOTES, 'UTF-8' ); ?>"> </body>
ã¨ã¹ã±ã¼ãããã®ã¯ãHTMLã¨ãã¦åºåããç´åã§ããå¤é¨ããå
¥åãããæååãåãåã£ãç´å¾ã«ã¨ã¹ã±ã¼ããã¦ãã¾ãã¨ããã®å¾ãã®æååãç¨ãã¦æ§ã
ãªå¦çãä¾ãã°æååã®æåæ°ã«ä¾åãã¦ãããªã©ã®å¦çãè¡ãéã«åé¡ãçºçãããããªãããã§ããå¿
ãããHTMLã¨ãã¦åºåããç´åã«ã¨ã¹ã±ã¼ãããååã¨ãã¾ãããã
3.ã«ã¤ãã¦ã¯ãURLããªã³ã¯ã¨ãã¦åºåããéã«ã¯ã¹ãã¼ã ãhttpãããã¯httpsã§ãããã¨ãããªãã¡URLããhttp://ãã¾ãã¯ãhttps://ãã§å§ã¾ããã¨ã確èªããããã«ãã¾ããå ´åã«ãã£ã¦ã¯ã/fooãã®ããã«ã/ãã§å§ã¾ãURLã許容ãã¦ãããã§ãããã*2
決ãã¦ãjavascript:ã¹ãã¼ã ã§ããã°NGãã®ãããªç¢ºèªãè¡ããªãããã«ãã¦ãã ãããXSSãçºçããã®ã¯javascript:ã¹ãã¼ã ã ãã§ãªãvbscript:ã¹ãã¼ã ãå§ãè¤æ°ã®ç¨®é¡ãããããããhttpãhttpsã®ããã«å®å
¨ãªãã®ã ãã許å¯ãããã¨ããæ¹éã®ã»ããå
å®ã ããã§ãã
ä¾ãã°ãPHPã§ããã°ä»¥ä¸ã®ããã«æ£è¦è¡¨ç¾ãç¨ãã¦æååã®å
é ããhttp://ããhttps://ããããã¯ã/ãã§ãããã¨ã確èªããããã§ããå ´åã«ã®ã¿aè¦ç´ ã®hrefå±æ§ã«URLãè¨å®ãããã¨ã§ããªã³ã¯ã«ããXSSãé²ããã¨ãã§ãã¾ãã
<?php function checkUrl( $url ){ if( preg_match( "/\Ahttps?:\/\//", $url ) || preg_match( "/\A\//", $url ) ){ return $url; }else{ return ""; } } ?> ... <div> <a href="<?php echo htmlspecialchars( checkUrl( $url ), ENT_QUOTES, 'UTF-8' ); ?>"> <?php echo htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' ); ?></a> </div>
ããã§ãaè¦ç´ ã®hrefå±æ§ã®å±æ§å¤ã¨ãã¦åºåãã¦ãã¾ãã®ã§ãå ã»ã©åæ§ã«htmlspecialcharsã«ããã¨ã¹ã±ã¼ããå¿ãã¦ã¯ããã¾ããã
ã¾ã¨ã
ããã¾ã§è§£èª¬ããã¨ãããXSSã®å¯¾çã¨ãã¦æå¹ãªåºæ¬çãªã«ã¼ã«ã¯ä»¥ä¸ã®ãããªãã®ã«ãªãã¾ãã
- ããã¹ããã¼ããå±æ§å¤ã¨ãã¦HTMLãåºåããæç¹ã§ã<ãã>ãã"ãã'ãã&ãã®5æåãã¨ã¹ã±ã¼ããã
- å±æ§å¤ã¯å¼ç¨ç¬¦ã§å²ã
- URLããªã³ã¯ã¨ãã¦åãæ±ãå ´åã«ã¯httpããã³httpsã¹ãã¼ã ã«éå®ãã
ããã§ãã¹ã¦ã®XSSãé²ããããã§ã¯ããã¾ããããç¾å®ã«çºçãã¦ããXSSã®å¤ãã¯ãã®ã«ã¼ã«ãå¾¹åºãããã¨ã§é²ãããã®ã大åã§ãã
æ¬ç¨¿ã§ã¯ãXSSã®åçã¨å¯¾çã®åºæ¬ã«ã¤ãã¦è§£èª¬ãè¡ãã¾ããã
ä¸æ¹ãXSSã¯æ»æã®ç¨®é¡ãçºçåæãå¤å²ã«æ¸¡ããããæ¬ç¨¿ã ãã§ã¯ã«ãã¼ã§ãã¦ããªãå
容ãå¤æ°ããã¾ãããããã«ã¤ãã¦ã¯å
ã«ç´¹ä»ããXSS (Cross Site Scripting) Prevention Cheat Sheetãªã©ãæ´»ç¨ãã¦ã¿ã¦ãã ãããã¾ããè¿å¹´ã¯JavaScriptã«ããã¯ã©ã¤ã¢ã³ãå´ã§ã®ã³ã¼ãéãå¢ãããã¨ã«ãã£ã¦ãJavaScriptä¸ã§çºçããDOM Based XSSã¨å¼ã°ãã種é¡ã®XSSãå¢å ãã¦ãã¾ããããã«ã¤ãã¦ã¯DOM based XSS Prevention Cheat Sheetãªã©ãåèã«ãã¦ã¿ã¦ãã ããã
æ¬ç¨¿ãã»ãã¥ã¢ãªWebã¢ããªã±ã¼ã·ã§ã³æ§ç¯ã®ä¸å©ã«ãªãã°å¹¸ãã§ãã
*1:å®éã«ã¯URLã®itemãã©ã¡ã¼ã¿ã¯item=%3Cscript%3E...ã®ããã«ãªãã¾ãããããã§ã¯å¯èªæ§ãåªå ãã¦ä¾¿å®ä¸URLã¨ã³ã³ã¼ãã£ã³ã°ã解ããç¶æ ã§è¡¨è¨ãã¾ãã以éã®URLã«å¯¾ããä¾ãåæ§ã§ãã
*2:注2. æ»æè ã®æå®ããURLããªãã¤ã¬ã¯ãå ã¨ãã¦ç¨ããå ´åã«ã¯ããªãã¤ã¬ã¯ãå ã許å¯ããããã¡ã¤ã³ã§ãããã確èªããªã¼ãã³ãªãã¤ã¬ã¯ã¿ã¨å¼ã°ããèå¼±æ§ãé²ãå¿ è¦ãããã¾ãããªã¼ãã³ãªãã¤ã¬ã¯ã¿ã«ã¤ãã¦ã®èª¬æã¯æ¬ç¨¿ã®ç¯å²ãè¶ ãã¾ãã®ã§ä»åã¯å²æãã¾ãã