
å ¥åãã§ãã¯ã ãã§å®å šãšèšããŸããââSQLã€ã³ãžã§ã¯ã·ã§ã³ã»XSSã»CSRFããå€ã®äœ¿ãéãã§èªãïœæ¯æŽå£«è§£èª¬2ã®5
ãã®èšäºã®éèŠåºŠïŒSã©ã³ã¯ïŒååŸã§ç¹°ãè¿ã䞻圹ã«ãªãæéèŠã®åéïŒ
ãã®èšäºã§åããããšïŒ
SQLã€ã³ãžã§ã¯ã·ã§ã³ãXSSãCSRFãªã©ãããªãèµ·ããããããå ¥åå€ã®äœ¿ããæ¹ãã説æã§ãã
ååŸã®åé¡ã§ããœãŒã¹ã³ãŒããHTTPã®ããåãããæ¬ é¥ã®å Žæãšå¯Ÿçãç¹å®ã§ãã
è§£çæ¬ã«æžããåå ããšã察çãã®åãåãã
ã·ã©ãã¹ãšã®å¯Ÿå¿ïŒå°é ç®2-5ãã»ãã¥ã¢ããã°ã©ãã³ã°ããã»ãã·ã§ã³ç®¡çã»JWTã»Cookie屿§ã®è©³çŽ°ã¯æ¯æŽå£«è§£èª¬2ã®4ãè匱æ§ãèŠã€ãã蚺æã®æ¹æ³ã¯æ¯æŽå£«è§£èª¬2ã®6ã§æ±ããŸãã
ååŸã®è©Šéšã§ã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®åé¡ãããåºãŸããJavaãJavaScriptã®ã³ãŒããèªãŸããåé¡ãå€ããçšèªãèŠããŠããã ãã§ã¯è§£ããŸãããåãããã®ã¯ãåé¡æã«æžãããå ¥åå€ããã©ãã§äœãšããŠäœ¿ãããã©ãã§å¢çã厩ããŠããããèªã¿åãåã§ãã
ãã®èšäºã¯ããã®èªã¿æ¹ãäžã€ã®è»žã§æŽçããŸãã軞ã¯ãå€ã®äœ¿ãéãã§ããå€ãSQLã®åœä»€ã«ãªããHTMLã®ã¿ã°ã«ãªããéä¿¡ã®è¡ãå ã«ãªããä»äººã®ããŒã¿ãæããã©ã®è匱æ§ãããã®åœ¢ã§èª¬æã§ããŸãã
1. èãæ¹ã®è»žïŒå€ã¯ã䜿ãå Žæã§ãåœä»€ãããè¡ãå ãã«ãªã

ãå³1ãå ¥åããå©çšå ãŸã§ãå¢çã远ã
å€ããå±ãå€ã¯ããã©ãŒã ã®å ¥åæ¬ã ãã§ã¯ãããŸãããURLã®ãã©ã¡ãŒã¿ãHTTPããããCookieãhiddenãã£ãŒã«ããã¢ããããŒãããããã¡ã€ã«ãå€éšAPIã®å¿çããå©çšè ãæ»æè ãæžãæããããŸããããŒã¿ããŒã¹ã«äžåºŠä¿åããå€ããåºã©ãããå€éšãªããåãåºããŠäœ¿ããšãã«ã¯ä¿¡çšã§ããŸããã
è匱æ§ãæ¢ããšãã¯ã次ã®åã€ãç·ã§ã€ãªããŸãïŒå³1ïŒã
å ¥åïŒå€ã¯ã©ãããæ¥ãã
æ€èšŒïŒåã»é·ãã»åœ¢åŒã»æ¥åäžã®æ¡ä»¶ãããµãŒãåŽã§ç¢ºãããŠããã
å©çšå ïŒå€ã¯SQLãHTMLãOSã³ãã³ãããã¡ã€ã«ã®ãã¹ãéä¿¡å ã®URLã®ã©ãã«äœ¿ãããã
å¶åŸ¡ïŒå©çšå ã«åã£ãå®å šãªåŠçïŒå€ãšåœä»€ãåãããåºåæã«ãšã¹ã±ãŒããããè¡ãå ãèš±å¯ãªã¹ãã§éå®ããïŒãããŠããã
ããã§å€§åãªã®ã¯ãå ¥åæã®æ€èšŒãšãå©çšå ã§ã®åŠçã¯å¥ã®åãã ãšããããšã§ããå ¥åæã®æ€èšŒã¯ãæ¥åäžèš±ãããå€ããã確ãããŸããäžæ¹ãå©çšå ã§ã®åŠçã¯ããã®å€ãåœä»€ãšããŠè§£éãããªãããã確ãããŸãã人åã«ã¯ã¢ãã¹ãããã£ïŒã·ã³ã°ã«ã¯ã©ãŒãïŒãå«ãŸããããšããããŸãããã®ãããèšå·ãæåŠããããå®å šããšã¯èšããŸãããéã«ãèšå·ãéããŠããå©çšå ã§æ£ããæ±ãã°åé¡ã¯èµ·ããŸããã
å€ã®æ±ããšã¯å¥ã«ããã®å¯Ÿè±¡ãæäœããŠãããïŒèªå¯ïŒãå¿ ã確ãããŸãïŒ8ç¯ïŒããŸããå€ããæ¥ãå€ã ãã§ãªããã¡ã¢ãªã®é åããåæã«æŽæ°ãããããŒã¿ã®ãããªå ±æããç¶æ ãå¢çã«ãªããŸãïŒ10ã»11ç¯ïŒã
ããäžã€ã®è»žã¯æš©éã§ããå€ã®æ±ãã«æ¬ é¥ããã£ãŠããã¢ããªã±ãŒã·ã§ã³ãããŒã¿ããŒã¹ã«æ¥ç¶ããã¢ã«ãŠã³ãã®æš©éãæå°éã«ããŠããã°ã被害ãå°ããã§ããŸãããã ãããã¯è¢«å®³ãæãã察çã§ãæ¬ é¥ãã®ãã®ãçŽããã®ã§ã¯ãããŸããã
2. SQLã€ã³ãžã§ã¯ã·ã§ã³ïŒå€ãSQLã®åœä»€ã«ãªã
ä»çµã¿
Webã¢ããªã¯ãå©çšè ã®å ¥åå€ã䜿ã£ãŠSQLæãçµã¿ç«ãŠãããŒã¿ããŒã¹ã«åãåãããŸãããã°ã€ã³ç»é¢ã§ã次ã®ããã«æååãã€ãªãåãããŠSQLæãäœããšããŸãã
SELECT * FROM members WHERE name = 'ïŒå
¥åããååïŒ' AND passwd = 'ïŒå
¥åãããã¹ã¯ãŒãïŒ'ãã¹ã¯ãŒãæ¬ã«ã次ã®å€ãå ¥åããããšããŸãã
' OR '1'='1ã§ããããSQLæã¯æ¬¡ã®ããã«ãªããŸãã
SELECT * FROM members WHERE name = 'taro' AND passwd = '' OR '1'='1'å ¥åå€ã®å é ã®ã·ã³ã°ã«ã¯ã©ãŒããæååã®çµãããšããŠè§£éããããã®åŸãã®OR以éãSQLã®åœä»€ã®äžéšã«ãªããŸãããSQLã§ã¯ANDãORããå ã«è©äŸ¡ãããã®ã§ãæ¡ä»¶ã¯ãïŒååãtaroãã€ãã¹ã¯ãŒãã空ïŒãŸãã¯ïŒåžžã«çã«ãªãæ¡ä»¶ïŒãã«ãªããŸããåŸåã¯åžžã«çãªã®ã§ããã¹ã¯ãŒããç¥ããªããŠãèªèšŒãééã§ããŸãã
åå ã¯ãå±éºãªèšå·ãå ¥ã£ãŠããããšèªäœã§ã¯ãããŸãããããŒã¿ãšããŠæ±ãã¹ãå€ããSQLã®æ§æãšããŠè§£éãããããšãã€ãŸãå€ãšåœä»€ã®å¢çã厩ããããšã§ãã
æªçšããããšã次ã®ãããªè¢«å®³ãèµ·ããŸãã
èªèšŒãåé¿ãããïŒäžã®äŸïŒ
UNIONã䜿ã£ãååããä»ãè¶³ãããæ¬æ¥ã®æ€çŽ¢çµæã«å¥ã®è¡šïŒäŒå¡æ å ±ãªã©ïŒã®å å®¹ãæ··ããŠè¡šç€ºããã
ããŒã¿ãæ¹ããã»åé€ããã
ç»é¢ã«åºãªããŠãæ å ±ã¯æŒããïŒãã©ã€ã³ãSQLã€ã³ãžã§ã¯ã·ã§ã³
æ€çŽ¢çµæããšã©ãŒãç»é¢ã«è¡šç€ºãããªããŠããæ»æã¯æç«ããŸãããã©ã€ã³ãSQLã€ã³ãžã§ã¯ã·ã§ã³ã¯ãæ¡ä»¶ãå€ãããªã¯ãšã¹ããéããå¿çã®éãã芳å¯ããŠãããŒã¿ããŒã¹ã®æ å ±ãå°ããã€å²ãåºãææ³ã§ãã
æ°å€ãšããŠäœ¿ããããã©ã¡ãŒã¿ã¯ãåŒçšç¬Šã§å²ãŸããŸããããã®ããã·ã³ã°ã«ã¯ã©ãŒãã§æååãæãåºããªããŠããåŸãã«æ¡ä»¶ãä»ãè¶³ããŸããããšãã°ã次ã®äºã€ã®ãªã¯ãšã¹ããéã£ãŠå¿çãæ¯ã¹ãŸãã
article=20250401 and 1=1 ïŒåžžã«çïŒâ éåžžã©ãã衚瀺ããã
article=20250401 and 1=0 ïŒåžžã«åœïŒâ 衚瀺ãããªãå¿çãå€ããã°ãå ¥åãSQLã®æ¡ä»¶ãšããŠè§£éãããŠãããšåãããŸããããã«ãããŒãã«åã®1æåç®ã¯aããã®ãããªæ¡ä»¶ãäžã€ãã€è©Šãã°ãããŒã¿ãç»é¢ã«åºãªããŠãããŒãã«åãªã©ãç¹å®ã§ããŸãã
æ ¹æ¬å¯ŸçïŒãã¬ãŒã¹ãã«ã

ãå³2ãæååé£çµãšãã¬ãŒã¹ãã«ãã®éã
æ ¹æ¬å¯Ÿçã¯ãã¬ãŒã¹ãã«ãïŒãã€ã³ãæ©æ§ïŒã§ãïŒå³2ïŒã
SQLæã®å€ã®éšåã«ã?ããªã©ã®èšå·ã眮ããSQLæã®ãã²ãªåœ¢ããå ã«çšæãã
å®éã®å€ã¯ãåŸããå¥ã«å²ãåœãŠãïŒãã€ã³ãããïŒ
å²ãåœãŠãå€ã¯ããã ã®å€ïŒæååãæ°å€ïŒãšããŠæ±ããããå€ã®äžã«ã·ã³ã°ã«ã¯ã©ãŒãããã£ãŠããæ§æãšããŠã¯è§£éãããªã
Javaã§ã¯ã次ã®ããã«æžããŸãïŒèª¬æçšã«ç°¡ç¥åããäŸïŒã
String sql = "SELECT * FROM members WHERE name = ? AND passwd = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, name);
stmt.setString(2, passwd);1è¡ç®ïŒå€ãå ¥ããå Žæãã?ãã«ããSQLæãçšæãã
2è¡ç®ïŒSQLæãæºåãããããã§åœä»€ã®æ§é ãæ±ºãŸã
3ã4è¡ç®ïŒ1çªç®ãš2çªç®ã®ã?ãã«ãå ¥åå€ãå²ãåœãŠã
ããŒã¿ããŒã¹åŽã§SQLæã®æ§æãè§£æããŠããå€ãå²ãåœãŠãæ¹åŒããéçãã¬ãŒã¹ãã«ããšãããŸããå€ãå ¥ãåã«ãã©ããåœä»€ã§ãã©ããå€ããã確å®ããŠããã®ã§ãåŸããå ¥ãå€ã¯æ§æã®äžéšã«ãªããŸãããããããã¬ãŒã¹ãã«ããæ ¹æ¬å¯Ÿçã«ãªãçç±ã§ãããªããã©ã€ãã©ãªã®åŽã§å€ããšã¹ã±ãŒãããŠããSQLæã«åã蟌ãåçãã¬ãŒã¹ãã«ãããããŸãããã¡ãã¯ãã©ã€ãã©ãªã®ãšã¹ã±ãŒãåŠçãæ£ããããšãåæã«ãªããŸãã
ãã¬ãŒã¹ãã«ãã§æž¡ããªããã®
衚åã»ååã»ORDER BYã®äžŠã³é ïŒSQLã®æ§é ãã®ãã®ãªã®ã§ãå€ãšããŠãã€ã³ãããŠãæå³ã©ããã«ã¯åããŸãããç»é¢ã§äžŠã³é ãéžã°ãããªãããæ°ããé ããªããcreated_at DESCãã«çœ®ãæããããšããããã«ãããã°ã©ã åŽã§æ±ºããåè£ã®äžããéžã°ããŸããå ¥åå€ããã®ãŸãŸé£çµããŸããã
LIKEå¥ã®ã¯ã€ã«ãã«ãŒãïŒå€ã®äžã®ããŒã»ã³ãèšå·ïŒ%ïŒãã¢ã³ããŒã¹ã³ã¢ïŒ_ïŒã¯ããã¬ãŒã¹ãã«ãã§æž¡ããŠãã¯ã€ã«ãã«ãŒããšããŠæ±ãããŸããããã¯SQLã€ã³ãžã§ã¯ã·ã§ã³ãšã¯å¥ã®ãæå³ããªãç¯å²ãæ€çŽ¢ããããåé¡ã§ãããã ã®æåãšããŠæ±ããããªããå¥ã«ãšã¹ã±ãŒãããŸãã
ORMãã¹ãã¢ãããã·ãŒãžã£ã䜿ã£ãŠããŠããå éšã§æååãé£çµããŠããã°å®å šãšã¯èšããŸãããã³ãŒããèªããšãã¯ãSQLãå®è¡ããã¡ãœããã䜿ã£ãŠãããã©ããã§ã¯ãªããSQLæãçµã¿ç«ãŠãŠããç®æã«å ¥åå€ãçŽæ¥ã€ãªãã£ãŠããªãããèŠãŸãã
ãã®ä»ã®å¯Ÿç
ãšã¹ã±ãŒãåŠçïŒãã¬ãŒã¹ãã«ãã䜿ããªãå Žåã«ãã·ã³ã°ã«ã¯ã©ãŒãã2ã€éãããªã©ããŠãç¹å¥ãªæå³ãæã€æåããã ã®æåã«ããŸãããã ãæŒããèµ·ããããæ¹æ³ã§ããããšãã°æ°å€ãšããŠåã蟌ãå€ã¯åŒçšç¬Šã§å²ãŸããªãã®ã§ãã·ã³ã°ã«ã¯ã©ãŒãã眮ãæããŠã广ããããŸããã
WAFïŒSQLã€ã³ãžã§ã¯ã·ã§ã³ã«å žåçãªãã¿ãŒã³ã鮿ã§ããŸãããã ããããæããããå Žåãããã®ã§ãæ ¹æ¬å¯Ÿçã®ä»£ããã«ã¯ãªããŸããã
被害ãå°ãããã察çïŒDBãžã®æ¥ç¶ã¢ã«ãŠã³ãã®æš©éãæå°éã«ããŸãããŸããããŒã¿ããŒã¹ã®ãšã©ãŒã®è©³çްãå©çšè ã®ç»é¢ã«åºããŸããããšã©ãŒã®å 容ã¯ãè¡šã®æ§é ãªã©ã®ãã³ããæ»æè ã«äžããããã§ãã
ååŸã§ã®åããæ¹
什å5å¹ŽåºŠæ¥æ ååŸIå1ïŒJavaã®ãœãŒã¹ã³ãŒãã®ç©ºæ¬ã«ããã¬ãŒã¹ãã«ãã䜿ã£ãSQLæïŒæ¡ä»¶ã®å€ã®éšåãã?ãã«ããïŒãšãPreparedStatementã䜿ãèšè¿°ãåããããåé¡ã§ãããæååãé£çµããŠSQLæãäœã£ãŠããç®æãèŠã€ãããã¬ãŒã¹ãã«ãã«çœ®ãæããã®ããã³ãŒãèªè§£åé¡ã®å®çªã§ãã
什å7å¹ŽåºŠæ¥æ ååŸå2ïŒè匱æ§èšºæã§ææããããã£ã³ããŒã³ããŒãžã顿ã§ãããåžžã«åœã»åžžã«çã«ãªãæ¡ä»¶ãä»ãè¶³ãããã©ã¡ãŒã¿ã§å¿çã®éãã確ããããã©ã€ã³ãSQLã€ã³ãžã§ã¯ã·ã§ã³ã«ãã£ãŠDBã®ããŒãã«åãç¹å®ã§ããããšããæµãã瀺ãããŸããã
æ¡ç¹è¬è©ã§ææãããã€ãŸãã
什å5å¹ŽåºŠæ¥æ ååŸIå1ã§ã¯ããã¬ãŒã¹ãã«ãã䜿ãè¡ã«å ¥ãåããPreparedStatementããšãã¹ããšãããããStatementããšçããåéšè ãå€ãã£ããšææãããŠããŸãããã¬ãŒã¹ãã«ãä»ãã®SQLæãæ±ãã®ã¯ PreparedStatement ã§ããã¯ã©ã¹åãšã¡ãœããåïŒprepareStatementïŒãã»ããã§æžããããã«ããŠãããŸãã
èšè¿°ã®å
åå ïŒãå ¥åå€ãæååé£çµã§SQLæã«çµã¿èŸŒãã§ãããããå ¥åå€ãSQLæã®æ§æãšããŠè§£éãããã
察çïŒããã¬ãŒã¹ãã«ããçšããŠSQLæãçµã¿ç«ãŠãã
察çã®çç±ïŒãSQLæã®æ§é ãå ã«ç¢ºå®ãããå ¥åå€ãå€ãšããŠæ±ãããã
ãã©ã€ã³ãSQLã€ã³ãžã§ã¯ã·ã§ã³ã®å±éºæ§ïŒãå¿çã®éããããDBã®ããŒãã«åãªã©ã®æ å ±ãç¹å®ãããã
被害ãå°ãããã察çïŒãDBæ¥ç¶ã¢ã«ãŠã³ãã®æš©éãå¿ èŠæå°éã«ãããã詳现ãªãšã©ãŒã¡ãã»ãŒãžã衚瀺ããªãã
3. OSã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ã»ãã¹ãã©ããŒãµã«ã»ãã¡ã€ã«ã¢ããããŒã
SQLã€ã³ãžã§ã¯ã·ã§ã³ãšåãæ§å³ã¯ãOSããã¡ã€ã«ã§ãèµ·ããŸãã
OSã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³
å€ãã®èšèªã«ã¯ãsystem颿°ã®ããã«ã·ã§ã«ïŒã³ãã³ããè§£éããŠå®è¡ããããã°ã©ã ïŒãèµ·åããŠOSã®ã³ãã³ããå®è¡ãã颿°ããããŸããã·ã§ã«ã¯ãã»ãã³ãã³ã瞊æ£ïŒãã€ãïŒãªã©ããã³ãã³ãã®åºåãããšããŠè§£éããŸãããã¡ã€ã«åãåãåã£ãŠåŠçããã³ãã³ãã«ã次ã®ãããªå€ãå ¥ãããããšããŸãã
report.txt; rm -rf /ãããšãæ¬æ¥ã®ã³ãã³ãã®åŸãã§ãã»ãã³ãã³ã®åŸãã«æžãããå¥ã®ã³ãã³ããå®è¡ãããŸãã
察çã¯æ¬¡ã®ãšããã§ãã
ã·ã§ã«ãèµ·åãã颿°ããã§ããã ã䜿ããªãããã¡ã€ã«ã®ç§»åãåé€ã¯ãèšèªã®å°çšã®æ©èœïŒãã¡ã€ã«æäœã®ã©ã€ãã©ãªïŒã§è¡ã
å€éšããã°ã©ã ã䜿ããããªãå Žåã¯ãã³ãã³ããšåŒæ°ãåããŠæž¡ããåŒæ°ãšããŠæž¡ããŠããåŒã³åºãå ããã®å€ããªãã·ã§ã³ãšããŠè§£éããå Žåãããã®ã§ãåŒæ°ã®ä»æ§ã確ããã
䜿ããæåã®çš®é¡ãšæžåŒã決ããåããªãå ¥åã¯ãšã©ãŒã«ããŠåŠçããªããã·ã§ã«åãã®ãšã¹ã±ãŒãã¯è€éã§æŒããããã®ã§ãéãããåãä»ããªãã»ããå®å š
å®è¡ããã¢ã«ãŠã³ãã®æš©éãæå°éã«ãã
ãã¹ãã©ããŒãµã«ïŒãã£ã¬ã¯ããªãã©ããŒãµã«ïŒ
å ¥åãããã¡ã€ã«åã§ãµãŒãã®ãã¡ã€ã«ãéãæ©èœã«ãäžã€äžã®ãã£ã¬ã¯ããªã瀺ãèšå·ãå«ãå€ãå ¥ããããå ¬éããã€ããã®ãªããã¡ã€ã«ãèªãŸããåé¡ã§ããããšãã°ã決ãŸã£ããã©ã«ãã®äžã®ãã¡ã€ã«ãéãæ©èœã«æ¬¡ã®å€ãå ¥åããããšããµãŒãã®éèŠãªãã¡ã€ã«ãèªãŸããŸãã
../../etc/passwdãããããå€éšããåãåã£ãæååã§ãã¡ã€ã«åãæå®ãã仿§ãããããããšãã°ãç³è«IDãããµãŒãåŽã§æ±ºãããã¡ã€ã«ãåŒã
ãããåŸãªãå Žåã¯ããã¹åãããã¡ã€ã«åã ããåãåºã颿°ïŒbasename颿°ãªã©ïŒã䜿ã
äžã®èšå·ã®æç¡ã ãã調ã¹ãæ¹æ³ã¯ç Žããããããã¹ã©ãã·ã¥ãURLãšã³ã³ãŒãããå€ãããããããã«ãšã³ã³ãŒãããå€ã¯ããã§ãã¯ã®åŸã§ãã³ãŒãããããšã¹ã©ãã·ã¥ã«æ»ãããšãããïŒäžã®äŸïŒ
/ â %2F ïŒã¹ã©ãã·ã¥ãURLãšã³ã³ãŒãïŒ
%2F â %252F ïŒå
é ã®%ãããã«ãšã³ã³ãŒãïŒãã¡ã€ã«ã¢ããããŒã
ãã¡ã€ã«åã®æ¡åŒµåãPDFã§ããäžèº«ãPDFã ãšããä¿èšŒã¯ãããŸãããã¢ããããŒããåãä»ãããšãã¯ã次ã®ç¹ãçµã¿åãããŠç¢ºãããŸãã
æ¡åŒµåãšäžèº«ã®åœ¢åŒãäžèŽããŠããã
容éãäžéãè¶ ããŠããªãã
ä¿åãããã¡ã€ã«åã¯ãå ã®ååã§ã¯ãªããµãŒãåŽã§çæããååã«ãã
å ¬éé åã®å€ã«ä¿åããããŠã³ããŒãã®ãã³ã«æš©éã確ããã
圢åŒã®ç¢ºèªãæ ããšãã¹ã¯ãªãããå¥ã®åœ¢åŒã«èŠããããŠã¢ããããŒããããXSSãšçµã¿åãããŠæªçšãããããšããããŸãïŒ4ç¯ã®ä»€å7å¹ŽåºŠç§æ ååŸå1ïŒã
èšè¿°ã®å
OSã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ã®å¯ŸçïŒãã·ã§ã«ãèµ·åãã颿°ã䜿ããªãã
ãã¹ãã©ããŒãµã«ã®å¯ŸçïŒãå€éšããåãåã£ãå€ãããã¡ã€ã«åã ããåãåºããŠäœ¿ãããå€éšã®å€ã§ãã¡ã€ã«åãæå®ããªãã
ã¢ããããŒãã®å¯ŸçïŒãã¢ããããŒãããããã¡ã€ã«ã®åœ¢åŒããæ¡åŒµåãšæŽåããŠãããã確èªããã
4. XSSïŒã¯ãã¹ãµã€ãã¹ã¯ãªããã£ã³ã°ïŒïŒå€ãHTMLãã¹ã¯ãªããã«ãªã
ãªãå±éºãªã®ãïŒåäžãªãªãžã³ããªã·ãŒãè¶ããŠããŸã
XSSã¯ãæ»æè ãçšæããã¹ã¯ãªããããè匱æ§ã®ããæ£èŠãµã€ãã®ããŒãžã®äžéšãšããŠãå©çšè ã®ãã©ãŠã¶ã§å®è¡ãããŠããŸãè匱æ§ã§ãã
ãã©ãŠã¶ã«ã¯åäžãªãªãžã³ããªã·ãŒïŒSame-Origin PolicyïŒãšããå¶éããããŸããã¹ããŒã ã»ãã¹ãåã»ããŒãçªå·ã®äžã€ããã¹ãŠäžèŽãããã®ãåäžãªãªãžã³ãšããããªãªãžã³ãéãããŒãžã®ããŒã¿ã¯èªããªãããã«ãªã£ãŠããŸãããã®ãããæ»æè ã®ãµã€ãã«çœ®ããã¹ã¯ãªããããã¯ãæ£èŠãµã€ãã®CookieãããŒãžã®äžèº«ãèªããŸããã
ãšãããXSSã§ã¯ãã¹ã¯ãªãããæ£èŠãµã€ãã®ããŒãžã®äžéšãšããŠåãã®ã§ããã®å¶éãåããŸãããæ»æè ã®ã¹ã¯ãªããã«ã¯ã次ã®ããšãã§ããŠããŸããŸãã
ãã®ãµã€ãã®Cookieãèªã¿åããå€éšãžéãïŒã»ãã·ã§ã³ã®ä¹ã£åãã«ã€ãªããïŒ
ããŒãžã«åœã®å ¥åæ¬ã衚瀺ããŠãã«ãŒãçªå·ãªã©ãå ¥åãããæ»æè ã®ãµã€ããžéããã
å©çšè ã«ãªãããŸããŠããã®ãµã€ããžæäœã®èŠæ±ãéã
äžã€ã®åã¯ãã¹ã¯ãªããã®éãéãã§èŠåãã

ãå³3ãXSSã®äžã€ã®åïŒã¹ã¯ãªããã®éãéãšçŽãå Žæ
åå°åïŒãªã¯ãšã¹ãã«å«ãŸããã¹ã¯ãªãããããµãŒãããã®ãŸãŸã¬ã¹ãã³ã¹ã«åã蟌ãã§è¿ããå žåäŸã¯æ€çŽ¢çµæç»é¢ããšã©ãŒã¡ãã»ãŒãžãæ»æè ã¯çœ ã®URLãå©çšè ã«ã¯ãªãã¯ããã
æ ŒçŽåïŒæ»æè ãæçš¿ããã¹ã¯ãªããããã£ãããµãŒãïŒããŒã¿ããŒã¹ãªã©ïŒã«ä¿åããããã®ããŒã¿ã衚瀺ãããã³ã«å®è¡ããããå žåäŸã¯æ²ç€ºæ¿ãã¬ãã¥ãŒããããã£ãŒã«æ¬ãçœ ã®URLã¯äžèŠã§ãããŒãžãéããäººå šå¡ã被害ãåãã
DOM-basedïŒãã©ãŠã¶äžã§åãæ£èŠã®JavaScriptããURLãªã©ã®å€ããã®ãŸãŸããŒãžã«æžã蟌ãããšã§èµ·ãããDOMã¯ããã©ãŠã¶ãHTMLãèªã¿èŸŒãã ããšãJavaScriptããèŠçŽ ã远å ã»å€æŽã§ããããã«çµã¿ç«ãŠãæšæ§é ã®ããšãã¹ã¯ãªãããçµã¿ç«ãŠãã®ã¯ãã©ãŠã¶åŽãªã®ã§ããµãŒãåŽã®åŠçã«åé¡ããªããŠãæç«ãããURLã®ã#ãããåŸãïŒãã©ã°ã¡ã³ãïŒã¯ãµãŒãã«éãããªãã®ã§ããµãŒãã®ãã°ã«ãæ®ããªã
èŠåãããšãã¯ã次ã®äºã€ã確ãããŸãïŒå³3ïŒã
ã¹ã¯ãªããã¯ãµãŒãã«ä¿åãããã â ä¿åããããªãæ ŒçŽå
ã¹ã¯ãªããã¯ãµãŒãã®ã¬ã¹ãã³ã¹ã«å«ãŸããã â å«ãŸããããã©ãŠã¶ã®äžã§çµã¿ç«ãŠããããªãDOM-based
åå°åãšæ ŒçŽåã®åå ã¯ããµãŒããHTMLãçµã¿ç«ãŠãŠåºåããåŠçã«ãããŸããDOM-basedã®åå ã¯ããã©ãŠã¶åŽã®JavaScriptã«ãããŸããçŽãå Žæãéãããšãããã®åé¡ãèŠããæå³ã§ããã¹ã¯ãªãããDOMãæäœããŠããŠãããµãŒãã«ä¿åãããŠããåºåããããªãæ ŒçŽåã§ãããDOMãè§Šã£ãŠããããDOM-basedããšæ©åç¹ããªãããã«ããŸãã
æ ¹æ¬å¯ŸçïŒåºåããçŽåã«ãåºåå ã«åãããŠãšã¹ã±ãŒããã
åå°åãšæ ŒçŽåã®æ ¹æ¬å¯Ÿçã¯ãHTMLãåºåãããšãã«ãå€ããæåããšããŠæ±ããããšã¹ã±ãŒãåŠçã§ããHTMLã®æ¬æã«å€ãåã蟌ããªããå°ãªããšãæ¬¡ã®æåã眮ãæããŸãã
& â &
< â <
> â >
" â "
' â 'ãããããšãscriptã¿ã°ãå ¥åãããŠããç»é¢ã«ã¯ã¿ã°ã®æåããã®ãŸãŸè¡šç€ºãããã ãã§ãã¹ã¯ãªãããšããŠã¯å®è¡ãããŸããã
ãšã¹ã±ãŒãã¯ãå ¥åãåãä»ãããšãã§ã¯ãªããåºåããçŽåã«è¡ããŸããåãå€ã§ããåã蟌ãå Žæã«ãã£ãŠå¿ èŠãªåŠçãéãããã§ãã
HTMLã®æ¬æïŒäžã®çœ®ãæã
ã¿ã°ã®å±æ§å€ïŒäžã®çœ®ãæãã«å ããŠã屿§å€ãå¿ ãããã«ã¯ã©ãŒãã§å²ããå²ãŸãªããšã空çœã®åŸããæ°ãã屿§ïŒã€ãã³ããã³ãã©ïŒãšããŠè§£éãããïŒäžã®äŸïŒ
hrefã»srcãªã©URLãå ¥ãã屿§ïŒãšã¹ã±ãŒãã ãã§ã¯äžååãjavascriptã¹ããŒã ã®URLãå ¥ãããããšã¹ã¯ãªãããåãã®ã§ãhttpãhttpsã®ã¹ããŒã ã§å§ãŸãããšã確ããã
ã€ãã³ããã³ãã©å±æ§ã®äžã®JavaScriptæååïŒãŸãJavaScriptã®æååãšããŠãšã¹ã±ãŒãããæ¬¡ã«HTMLã®å±æ§å€ãšããŠãšã¹ã±ãŒãããã2段éãå¿ èŠ
scriptèŠçŽ ã®äžã®JavaScriptæååïŒJavaScriptã®æååãšããŠã®ãšã¹ã±ãŒãã«å ããŠãå€ã®äžã®çµäºã¿ã°ã§èŠçŽ ãçµãã£ãŠããŸããªãããã«ãäžçå·ãªã©ã眮ãæãã
次ã¯ãåŒçšç¬Šã§å²ãã§ããªã屿§å€ã«ãæ»æè ãæååãå ¥ããå Žåã®äŸã§ãã空çœã®åŸãããæ°ãã屿§ïŒã€ãã³ããã³ãã©ïŒãšããŠè§£éãããŸãã
<!-- å
¥åå€ïŒabc onmouseover=alert(1) -->
<input value=abc onmouseover=alert(1)>ããããŠãHTTPã¬ã¹ãã³ã¹ã®Content-Typeãããã§æåã³ãŒããæç€ºããŸãïŒäŸïŒUTF-8ïŒãæå®ããªããšããã©ãŠã¶ãæåã³ãŒããæšæž¬ãããšã¹ã±ãŒããããæããããå ŽåããããŸãã
å©çšè ã«HTMLã®è£ 食ãèš±ã仿§ïŒäžéšã®ã¿ã°ã®å ¥åãèªãããªã©ïŒã§ã¯ãå šéšããšã¹ã±ãŒããããšæ©èœãå£ããŸãããã®å Žåã¯ãèš±å¯ããã¿ã°ãšå±æ§ãéå®ããä¿å®ããããµãã¿ã€ãºã®éšåã䜿ããŸãã
DOM-based XSSã®å¯ŸçïŒå±éºãªAPIã䜿ããªã
DOM-based XSSã¯ãã©ãŠã¶ã®äžã§å®çµããã®ã§ããµãŒãåŽã§ããããšã¹ã±ãŒãããŠãé²ããŸããã察çã¯JavaScriptã®æžãæ¹ã§ãã
document.getElementById('msg').innerHTML = decodeURIComponent(location.hash.slice(1));URLã®ã#ã以éãåãåºããŠããã®ãŸãŸããŒãžã«æžã蟌ãåŠçã§ããããã«ã次ã®ãããªãã©ã°ã¡ã³ããä»ããURLãèžãŸãããšãç»åã®èªèŸŒã¿ãšã©ãŒããã£ããã«ã¹ã¯ãªãããå®è¡ãããŸãã
#<img src=x onerror=alert(1)>innerHTMLã§æžã蟌ãã scriptã¿ã°ã¯å®è¡ãããªããããæ»æã§ã¯ãããã圢ã䜿ãããŸãã
å€ãHTMLãšããŠè§£éããAPIïŒinnerHTMLãdocument.writeãeval ãªã©ïŒã«ãå€éšããã®å€ãæž¡ããªã
å€ãæåãšããŠæ±ãAPIïŒtextContentãcreateElement ãªã©ïŒã䜿ããäžã®ã³ãŒãã¯ãinnerHTML ã textContent ã«å€ããã°ãå€ã¯ãã ã®æåãšããŠè¡šç€ºããã
setAttribute ã䜿ãå Žåããå ¥ãã屿§ã«æ³šæãããã€ãã³ããã³ãã©å±æ§ã«å€éšã®å€ãå ¥ããã°ã¹ã¯ãªãããšããŠå®è¡ãããhrefã»srcã«å ¥ãããªãã¹ããŒã ã®ç¢ºèªãèŠã
䜿ã£ãŠããJavaScriptã®ã©ã€ãã©ãªãææ°ã«ä¿ã€
innerHTML ã¯ãHTMLãšããŠè§£éããŠæžã蟌ãããtextContent ã¯ããã ã®æåãšããŠæžã蟌ãããã³ãŒããèªãŸããèšåã§çãããããéãã§ãã
CSPãšHttpOnlyã¯ãä¿éºã
CSPïŒContent-Security-PolicyïŒã¯ããã©ãŠã¶ãå®è¡ããŠããã¹ã¯ãªããã®èªèŸŒã¿å ãªã©ããHTTPã¬ã¹ãã³ã¹ãããã§æå®ããä»çµã¿ã§ãïŒ6ç¯ïŒãããšãã°æ¬¡ã®æå®ã§ã¯ãèªãµã€ãã®ã¹ã¯ãªããã ããèš±å¯ããŸããunsafe-inlineãšããå€ãå ããªãéããHTMLã«çŽæ¥æžã蟌ãŸããã¹ã¯ãªãããå®è¡ãããŸããã
Content-Security-Policy: script-src 'self'ãã ããCSPã¯ãèš±å¯ããèªèŸŒã¿å ããä¿¡é ŒããŸããæ»æè ãèªãµã€ãã®äžã«ã¹ã¯ãªããã眮ããã°ãèš±å¯ã®ç¯å²å ãšããŠå®è¡ãããŸããCSPã¯è¢«å®³ãå°ããããä»çµã¿ã§ããšã¹ã±ãŒãã®ä»£ããã«ã¯ãªããŸããã
Cookieã® HttpOnly 屿§ã¯ãJavaScriptããCookieãèªããªãããŸããCookieãçãŸããããšã¯é²ããŸãããåœã®å ¥åæ¬ã®è¡šç€ºãããªãããŸãã®èŠæ±ã¯é²ããŸããããHttpOnlyã«ããã°XSSã¯èµ·ããªããã¯èª€ãã§ããCookie屿§ã®è©³çŽ°ã¯æ¯æŽå£«è§£èª¬2ã®4ã§æ±ããŸãã
ååŸã§ã®åããæ¹
什å5å¹ŽåºŠç§æ ååŸå1ïŒWebã¢ããªã®è匱æ§ãæªçšãããã€ã³ã·ãã³ãã顿ã§ãããè§£çäŸã®å¯Ÿçã¯ãã¬ãã¥ãŒã¿ã€ãã«ãåºåããåã«ãšã¹ã±ãŒãåŠçãæœãããšãããã®ã§ããä¿åãããå€ã衚瀺ã®ãã³ã«äœ¿ãããã®ã§ãåã¯æ ŒçŽåã§ãã
什å7å¹ŽåºŠç§æ ååŸå1ïŒHTTPã¬ã¹ãã³ã¹ãããã§ãCSPã®default-srcã«èªãµã€ãïŒselfïŒã ããæå®ããŠãããµãŒãã¹ã顿ã§ãããæ»æè ã¯ãã¹ã¯ãªãããå¥åœ¢åŒïŒæ¡åŒµåã¯xlsxïŒã®ãã¡ã€ã«ã«èŠããããŠãµãŒãã¹å ã«ã¢ããããŒãããåºåæã«ãšã¹ã±ãŒããããŠããªãã¿ã¹ã¯åã«ãã¢ããããŒããããã¡ã€ã«ãèªã¿èŸŒãscriptã¿ã°ãå·®ã蟌ã¿ãŸããããã¡ã€ã«ã¯èªãµã€ãäžã«ããã®ã§ãCSPã®èš±å¯ã®ç¯å²ã«å ¥ã£ãŠããŸããŸããè§£çäŸã§ã¯ããã¢ããããŒãããããã¡ã€ã«ã®åœ¢åŒãæ¡åŒµåãšæŽåããŠãããããã§ãã¯ãããããšãšããåºåæã«ãšã¹ã±ãŒãåŠçãæœããããšã察çãšããŠç€ºãããŠããŸãã
æ¡ç¹è¬è©ã§ææãããã€ãŸãã
什å5å¹ŽåºŠç§æ ååŸå1ã§ã¯ãXSSã®çš®é¡ãéžã¶èšåã§ãã¹ã¯ãªãããDOMã䜿ã£ãŠããããšãããããDOM Based XSSããšèª€ã£ãŠçããåéšè ãæ£èŠããããšææãããŠããŸããåã¯ãã¹ã¯ãªããããµãŒãã«ä¿åãããããã¬ã¹ãã³ã¹ã«å«ãŸãããã§å€æããŸãã
什å7å¹ŽåºŠç§æ ååŸå1ã§ã¯ãCSPã®å 容ã广ãåãèšåã®æ£ççãããäœãã£ããšãããŠããŸããCSPãäœãå¶éããã©ãã«æãéãæ®ããã説æã§ããããã«ããŠãããŸãã
èšè¿°ã®å
åå ïŒãå ¥åå€ããšã¹ã±ãŒãããã«ãHTMLãšããŠåºåããŠããã
察çïŒãåºåæã«ãšã¹ã±ãŒãåŠçãæœãã
DOM-basedã®å¯ŸçïŒãinnerHTMLã§ã¯ãªãtextContentãçšããã
åã®å€å¥ïŒããµãŒãã«ä¿åããããããã¬ã¹ãã³ã¹ã«å«ãŸããããã®2ç¹ã§å€æãã
æ»æè ãå ¥åããæååïŒåºåãããå Žæã確ãããïŒäžã®äŸïŒ
CSPãHttpOnlyã§ååãïŒã被害ãæãã广ã¯ããããXSSãã®ãã®ã¯çŽããªãã
åºåãããå Žæããšã®ãæ»æè ãå ¥åããæååã®äŸã§ãã
HTMLã®æ¬æ ïŒ <script>âŠ</script>
åŒçšç¬Šã®ãªã屿§å€ ïŒ ïŒç©ºçœïŒonmouseover=âŠ
innerHTMLãžã®æžèŸŒã¿ ïŒ <img src=x onerror=âŠ>5. CSRFïŒã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªïŒïŒæ¬äººã®ãã©ãŠã¶ããèŠæ±ãéããã
ä»çµã¿
CSRFã¯ããã°ã€ã³äžã®å©çšè ã«ãæ»æè ãçšæãããªã¯ãšã¹ããéãããæ»æã§ãã
å©çšè ãããµã€ãAã«ãã°ã€ã³ããŠãã
ãã°ã€ã³ãããŸãŸãæ»æè ãçšæããçœ ãµã€ããéã
çœ ãµã€ãã«ä»èŸŒãŸãããã©ãŒã ã«ãã£ãŠãå©çšè ã®ãã©ãŠã¶ãããµã€ãAãžããã¹ã¯ãŒã倿Žããç»é²æ å ±ã®å€æŽããªã©ã®ãªã¯ãšã¹ããéããã
ãã©ãŠã¶ã¯ãµã€ãAã®CookieïŒã»ãã·ã§ã³IDïŒãèªåã§ä»ããŠéãã®ã§ããµã€ãAã¯æ¬äººã®æ£èŠã®æäœã ãšæã£ãŠåŠçãã
ãã©ãŠã¶ã®åäžãªãªãžã³ããªã·ãŒã¯ãä»ã®ãµã€ãã®ç»é¢ã®å 容ãèªã¿åãããšã¯å¶éããŸããããããä»ã®ãµã€ããžãã©ãŒã ãéä¿¡ããããšãŸã§ã¯æ¢ããŸãããçœ ãµã€ãã¯ãµã€ãAã®ç»é¢ãèªããŸãããããµã€ãAãžã®ãªã¯ãšã¹ããéãããããšã¯ã§ããŸãã
XSSãšã®éã

ãå³4ãXSSãšCSRFã¯ãäœãéãã®ã
XSSïŒè匱ãªãµã€ãã®ããŒãžã®äžã§ãæ»æè ã®ã¹ã¯ãªãããåã
CSRFïŒæ»æè ã®ãµã€ããããå©çšè ã®ãã©ãŠã¶ã䜿ã£ãŠãè匱ãªãµã€ããžæå³ããªãèŠæ±ãéããããè匱ãªãµã€ãã§ã¹ã¯ãªãããåããå¿ èŠã¯ãªããCookieãçãå¿ èŠããªã
察çãå¥ç©ã§ãïŒå³4ïŒãXSSã®å¯Ÿçã¯åºåæã®åŠçã§ãCSRFã®å¯Ÿçã¯ç¶æ ãå€ããèŠæ±ãåãä»ããåã®ç¢ºèªã§ããäºãã«ä»£ããã«ã¯ãªããŸããããªããXSSããããšãæ»æè ã®ã¹ã¯ãªãããæ£èŠã®ããŒãžããCSRFããŒã¯ã³ãèªã¿åããå ŽåããããŸããäž¡æ¹ã®æ¬ é¥ããããããçŽããŸãã
察ç
CSRFããŒã¯ã³ïŒãµãŒããæšæž¬å°é£ãªå€ïŒããŒã¯ã³ïŒãçºè¡ããæ£èŠã®ç»é¢ã®ãã©ãŒã ã®hiddenãã£ãŒã«ãã«å ¥ããŠããããªã¯ãšã¹ããåããããããŒã¯ã³ãæ£ãããã確ããããçœ ãµã€ãã¯ãµã€ãAã®ç»é¢ãèªããªãã®ã§ãæ£ããããŒã¯ã³ãç¥ãããšãã§ããªã
SameSite屿§ïŒä»ã®ãµã€ãããã®ãªã¯ãšã¹ãã«Cookieãä»ããªãããã«ãããå€ã¯äžã€ãã
StrictïŒä»ã®ãµã€ãããã®é·ç§»ã§ã¯ãCookieãäžåéããªããæãå®å šã ããå€éšã®ãªã³ã¯ããæ¥ããšãã®æåã®ç»é¢ã§ã¯ãã°ã€ã³ããŠããªãæ±ãã«ãªã
LaxïŒä»ã®ãµã€ãããã®é·ç§»ã§ãããªã³ã¯ããã©ãGETã®ç»é¢é·ç§»ã§ã¯CookieãéãããPOSTã§ã¯éããªãããã®ãããPOSTã«ããå€ãã®CSRFãé²ããããã ãGETã§ç¶æ ãå€ããèšèšã ãšé²ããªã
NoneïŒä»ã®ãµã€ãããã§ãéããSecure 屿§ãå¿ èŠ
SameSiteã¯ãCSRFããŒã¯ã³ãšçµã¿åãããè£å©çãªå¯ŸçãšèãããCookie屿§ã®å šäœã¯æ¯æŽå£«è§£èª¬2ã®4ã§æ±ã
éèŠãªæäœã®åã«ããã¹ã¯ãŒããåå ¥åãããïŒå©çšè ã®è² æ ã¯å¢ãããã广ã¯é«ã
èªå¯ãèŠæ±ããšã«ç¢ºãããïŒããŒã¯ã³ãæ£ãããŠãããã®å©çšè ã«ãã®æäœãèš±ããŠãããã¯å¥ã®ç¢ºèªïŒ8ç¯ïŒ
Refererãããã§ãªã³ã¯å ã確ãããïŒãã ããRefererãéããªãèšå®ã®å©çšè ã¯ãæ£èŠã®æäœã§ã匟ããã
ãPOSTã«ããã ããã確èªç»é¢ã眮ããã ããã§ã¯å¯Ÿçã«ãªããŸãããçœ ãµã€ãã®ãã©ãŒã ã¯ãPOSTã§ãã確èªç»é¢ã®æ¬¡ã®èŠæ±ã§ãéããããã§ãã
ããŒã¯ã³ã¯ã誰ã®ã»ãã·ã§ã³ã®ãã®ãããŸã§ç¢ºããã
CSRFããŒã¯ã³ã確ãããŠããŠãããã®ããŒã¯ã³ããèŠæ±ãéã£ãŠããå©çšè ã®ã»ãã·ã§ã³ã®ãã®ãã確ãããªããã°æå³ããããŸãããå¥ã®å©çšè ã®ã¢ã«ãŠã³ãã§ååŸããããŒã¯ã³ã§ãéããªããæ»æè ã¯èªåã®ã¢ã«ãŠã³ãã§ååŸããããŒã¯ã³ãçœ ã®ãã©ãŒã ã«å ¥ããŠããã°ããããšã«ãªããŸããããŒã¯ã³ã¯å©çšè ã®ã»ãã·ã§ã³ãšçµã³ä»ããŠçºè¡ãããã®ã»ãã·ã§ã³ã®ããŒã¯ã³ãšäžèŽãããã確ãããŸãã
ååŸã§ã®åããæ¹
什å6å¹ŽåºŠæ¥æ ååŸå3ïŒCSRFããŒã¯ã³ã確èªããŠã¯ãããã®ã®ãå¥ã®å©çšè ã¢ã«ãŠã³ãã§ååŸããããŒã¯ã³ã§ãåŠçãããŠããŸãäžåã顿ã§ãããè§£çäŸã®æå£ã¯ããæ»æè ãèªãã®ã¢ã«ãŠã³ãã§ååŸããcsrf_tokenãšäžç·ã«å©çšè æ å ±ããµã€ãã«éãããã«æ§æããçœ ã®ãã©ãŒã ã«ãå©çšè ãèªå°ããå©çšè æ å ±ã倿Žãããããšãããã®ã§ãã
æ¡ç¹è¬è©ã§ææãããã€ãŸãã
什å6å¹ŽåºŠæ¥æ ååŸå3ã§ã¯ãCSRFã®æ»æææ³ãåãèšåã®æ£ççãäœããæ»æè ãååŸããããŒã¯ã³ãæªçšããéšåãæžããŠããªãåéšè ãå€ãã£ããšææãããŠããŸããã誰ããã©ã®ããŒã¯ã³ããã©ãã«å ¥ããŠã誰ã«éããããããŸã§ãæ¬æã®ç¶æ³ã«å³ããŠæžããŸãã
èšè¿°ã®å
CSRFã®æå£ïŒãæ»æè ãçšæããçœ ã®ãã©ãŒã ããããã°ã€ã³äžã®å©çšè ã®ãã©ãŠã¶ã§ãæå³ããªãèŠæ±ãéä¿¡ãããã
CSRFããŒã¯ã³ã®äžåïŒãããŒã¯ã³ãå©çšè ã®ã»ãã·ã§ã³ãšçµã³ä»ããŠããªãã®ã§ãæ»æè ãèªåã§ååŸããããŒã¯ã³ã䜿ããã
察çïŒãCSRFããŒã¯ã³ãå©çšè ã®ã»ãã·ã§ã³ãšçµã³ä»ããŠæ€èšŒããããSameSite屿§ãStrictãŸãã¯Laxã«ããã
6. ãã©ãŠã¶ã®ä»çµã¿ïŒåäžãªãªãžã³ããªã·ãŒã»CORSã»ã»ãã¥ãªãã£ããã
CORSïŒãªãªãžã³ããŸããéä¿¡ãããµãŒããèš±å¯ããä»çµã¿
åäžãªãªãžã³ããªã·ãŒãããããããããµã€ãã®ããŒãžããèªã¿èŸŒãŸããã¹ã¯ãªããããå¥ã®ãªãªãžã³ã®Web APIã«å¯ŸããŠXMLHttpRequestãfetchã§éã£ãèŠæ±ã®å¿çã¯ããã®ãŸãŸã§ã¯èªããŸãããããã§ãå¥ã®ãªãªãžã³ã®è³æºã䜿ããããšãã«äœ¿ãã®ããCORSïŒCross-Origin Resource SharingïŒã§ãã
CORSã§ã¯ãAPIåŽã®ãµãŒããHTTPã¬ã¹ãã³ã¹ãããã§ãã©ã®ãªãªãžã³ããã®ã¢ã¯ã»ã¹ãèš±å¯ãããããã©ãŠã¶ã«äŒããŸãã
Access-Control-Allow-OriginïŒã¢ã¯ã»ã¹ãèš±å¯ãããªãªãžã³
Access-Control-Allow-MethodsïŒäœ¿ã£ãŠããHTTPã¡ãœãã
Access-Control-Allow-HeadersïŒèŠæ±ã«å«ããŠããããã
Access-Control-Allow-CredentialsïŒCookieãªã©ã®èªèšŒæ å ±ãå«ãèŠæ±ãèš±å¯ããã
ãã©ãŠã¶ã¯ãèŠæ±ã® Origin ãããã«éä¿¡å ã®ãªãªãžã³ãå ¥ããŠéããŸãããµãŒãã¯ããã®å€ãèš±å¯ãããªãªãžã³ã®äžèЧãšç §ããåãããäžèŽãããšãã ã Access-Control-Allow-Origin ã«ãã®ãªãªãžã³ãå ¥ããŠè¿ããŸããåçŽã§ãªãèŠæ±ïŒç¬èªã®ããããä»ãããPUTãDELETEã䜿ããªã©ïŒã§ã¯ããã©ãŠã¶ãæ¬çªã®èŠæ±ã®åã«OPTIONSã¡ãœããã§ããªãã©ã€ããšåŒã°ãã確èªãéããŸãã
泚æç¹ã¯ãèš±å¯ãåºããããªãããšã§ããAccess-Control-Allow-Origin ã«éãããŠãã Origin ã®å€ãç¡æ¡ä»¶ã«ãã®ãŸãŸè¿ãå®è£ ã§ã¯ãã©ã®ãµã€ãããã§ãå¿çãèªããŠããŸããŸãããŸããèªèšŒæ å ±ãå«ãèŠæ±ã§ã¯ã¢ã¹ã¿ãªã¹ã¯ïŒãã¹ãŠèš±å¯ïŒã¯äœ¿ããªã仿§ã«ãªã£ãŠããã®ã§ãèš±å¯ãããªãªãžã³ãå ·äœçã«æå®ããŸãã
ã»ãã¥ãªãã£ãããïŒè匱æ§ãæ®ã£ããšãã®è¢«å®³ãå°ãããã
HTTPã¬ã¹ãã³ã¹ãããã§ããã©ãŠã¶ã®åããå¶éã§ããŸããã©ããè匱æ§ãã®ãã®ãçŽããã®ã§ã¯ãªããæ®ã£ãè匱æ§ã«ãã被害ãå°ããããä»çµã¿ã§ãã
Content-Security-PolicyïŒCSPïŒïŒãã©ãŠã¶ãå®è¡ããŠããã¹ã¯ãªããã®èªèŸŒã¿å ãªã©ãããµã€ããæå®ãããscript-srcïŒã¹ã¯ãªããã®èªèŸŒã¿å ïŒãdefault-srcïŒåå¥ã«æå®ããŠããªãè³æºã®æ¢å®å€ïŒãform-actionïŒãã©ãŒã ã®éä¿¡å ïŒãframe-ancestorsïŒèªåã®ããŒãžãä»ã®ãµã€ãã«åã蟌ãŸãããïŒãªã©ãæå®ãã
X-Frame-OptionsïŒèªåã®ããŒãžããä»ã®ãµã€ãã®frameãiframeã®äžã«è¡šç€ºãããããæå®ãããDENY ãªãäžåçŠæ¢ãSAMEORIGIN ãªãåäžãªãªãžã³ã®ããŒãžã®äžã ãèš±å¯ãã
X-Content-Type-OptionsïŒnosniffïŒïŒãã©ãŠã¶ããã¡ã€ã«ã®äžèº«ããçš®é¡ãæšæž¬ããæ©èœãæ¢ããContent-Typeãããã§æå®ããçš®é¡ã匷å¶çã«é©çšããã
Strict-Transport-SecurityïŒHSTSïŒïŒä»¥åŸã®ã¢ã¯ã»ã¹ã§ããã©ãŠã¶ã«HTTPSã§ã®æ¥ç¶ã匷å¶ããããå¹æã¯ max-age ã§æå®ããæéã«éãããåããŠHTTPã§ã¢ã¯ã»ã¹ãããšãã¯å®ããªãã詳ããã¯æ¯æŽå£«è§£èª¬3ã®1ã§æ±ã
Cache-ControlïŒno-storeïŒïŒå人æ å ±ãå«ãããŒãžãããã©ãŠã¶ãªã©ã«ãã£ãã·ã¥ãããªã
ã¯ãªãã¯ãžã£ããã³ã°ã¯ãæ»æè ã®ããŒãžã®äžã«ãéæã«ããæšçã®ãµã€ããiframeã§éããæ»æã§ããå©çšè ãæšçã®ãµã€ãã«ãã°ã€ã³ãããŸãŸã ãšãæ»æè ã®ããŒãžã®ãã¿ã³ãæŒããã€ããã§ãéæãªæšçã®ãµã€ãã®ãã¿ã³ïŒéäŒãèšå®å€æŽãªã©ïŒãæ¬äººã®æš©éã§æŒããŠããŸããŸãã察çã¯ãX-Frame-Options ãCSPã® frame-ancestors ã§ãä»ã®ãµã€ãã«èªåã®ããŒãžãåã蟌ãŸããªãããšã§ãã
ã¬ã¹ãã³ã¹ãããã«WebãµãŒãã®è£œååãããŒãžã§ã³ãåºããŠãããšãæ¢ç¥ã®è匱æ§ãçããããããªããŸããäžèŠãªæ å ±ã¯åºããŸããã
ååŸã§ã®åããæ¹
å¹³æ31å¹ŽåºŠæ¥æ ååŸIå1ïŒWeb APIã®èšèšã顿ã§ãåäžãªãªãžã³ããªã·ãŒã«ããå¶éãšãCORSã䜿ã£ãèš±å¯ãåãããŸãããè§£çäŸã§ã¯ãAccess-Control-Allow-Origin ã«èš±å¯ãããªãªãžã³ãæå®ããããšããèŠæ±ã® Origin ãããã®å€ãèš±å¯ãããªãªãžã³ã®ãªã¹ããšç §åããäžèŽããå Žåã«èš±å¯ããåŠçã瀺ãããŠããŸãã
什å6å¹ŽåºŠç§æ ååŸå4ïŒè匱æ§èšºæã®å ±åæžã顿ã§ãã»ãã¥ãªãã£ãããã®å¹æãåãããŸãããè§£çäŸã«ã¯ããµã€ããžã®æ¥ç¶ãHTTPSã«åŒ·å¶ã§ããããšïŒHSTSïŒããContent-Typeãããã§æå®ããMIMEã¿ã€ãã匷å¶çã«é©çšã§ããããšïŒX-Content-Type-OptionsïŒã瀺ãããŠããŸãã
èšè¿°ã®å
CORSã®èšå®ïŒãOriginãããã®å€ããèš±å¯ãããªãªãžã³ã®ãªã¹ããšç §åããäžèŽããå Žåã ãAccess-Control-Allow-Originã«ãã®ãªãªãžã³ãèšå®ããã
CSPã®å¹æïŒããã©ãŠã¶ãå®è¡ã§ããã¹ã¯ãªããã®èªèŸŒã¿å ããå¿ èŠãªãã¡ã€ã³ã ãã«éå®ã§ããã
X-Content-Type-Optionsã®å¹æïŒãContent-Typeã§æå®ããçš®é¡ãããã©ãŠã¶ã«åŒ·å¶çã«é©çšãããã
ã¯ãªãã¯ãžã£ããã³ã°ã®å¯ŸçïŒãX-Frame-Optionsãframe-ancestorsã§ãä»ãµã€ãã®iframeã§ã®è¡šç€ºãçŠæ¢ããã
7. è¡ãå ãå€ããè匱æ§ïŒSSRFã»ãªãŒãã³ãªãã€ã¬ã¯ãã»ãããã€ã³ãžã§ã¯ã·ã§ã³

ãå³5ãå ¥åå€ããè¡ãå ããå€ããïŒSSRFãšURLã®æ€èšŒ
ããã§æ±ãè匱æ§ã¯ãå ¥åå€ã«ãã£ãŠéä¿¡å ã転éå ãã¡ãŒã«ã®å®å ãšãã£ããè¡ãå ããå€ãã£ãŠããŸããšããå ±éã®æ§å³ãæã¡ãŸãã察çã®åºæ¬ãå ±éã§ãè¡ãå ãèš±å¯ãããã®ã«éå®ããããšã§ãã
SSRFïŒãµãŒãã«ãå éšãžã®éä¿¡ãããã
SSRFïŒServer Side Request ForgeryïŒã¯ãå ¬éããŠããWebãµãŒãã«äžæ£ãªãªã¯ãšã¹ããéãããã®ãµãŒããèžã¿å°ã«ããŠãå€ããã¯çŽæ¥å±ããªãå éšã®ãµãŒããªã©ãžéä¿¡ãããæ»æã§ãã
å žåçãªã®ã¯ããæå®ãããURLã®ããŒãžãããµãŒããåã£ãŠããŠè¡šç€ºãããæ©èœã§ããURLãèªç±ã«æå®ã§ãããšããµãŒãã¯å éšã®ãµãŒãã管çç»é¢ã«ãã¢ã¯ã»ã¹ããŠããŸããŸãããã¡ã€ã¢ãŠã©ãŒã«ãå€ããã®éä¿¡ãæ¢ããŠããŠããéä¿¡ã®éä¿¡å ã¯å éšã«ããå ¬éãµãŒãèªèº«ãªã®ã§ãå éšã®å®å ã«å±ããŸãïŒå³5ã®äžæ®µïŒã
ã¯ã©ãŠãã®ä»®æ³ãµãŒãã«ã¯ããµãŒãèªèº«ããã ãã¢ã¯ã»ã¹ã§ããã¡ã¿ããŒã¿ãµãŒãã¹ããããŸããç¹å®ã®ã¢ãã¬ã¹ïŒããšãã°IPã¢ãã¬ã¹169.254.169.254ã§å§ãŸãURLïŒã«ã¢ã¯ã»ã¹ãããšããã®ãµãŒãã®èšå®æ å ±ããã¯ã©ãŠãã®ãµãŒãã¹ã䜿ãããã®èªèšŒæ å ±ïŒã¯ã¬ãã³ã·ã£ã«ïŒãè¿ããŸããSSRFã§ãããžã¢ã¯ã»ã¹ãããã°ãèªèšŒæ å ±ãçããŸãã
ã¡ã¿ããŒã¿ãµãŒãã¹ãžã®ã¢ã¯ã»ã¹æ¹åŒã«ã¯ã次ã®äºã€ããããŸãã
æ¹åŒ1ïŒç¹å®ã®URLã«GETã§ã¢ã¯ã»ã¹ããã ãã§ãæ å ±ãè¿ã
æ¹åŒ2ïŒãŸãããŒã¯ã³ãçºè¡ããURLã«PUTã¡ãœããã§ã¢ã¯ã»ã¹ããŠããŒã¯ã³ãæã«å ¥ãããã®ããŒã¯ã³ããªã¯ãšã¹ãã®ãããã«å«ããªããšæ å ±ãè¿ããªã
åçŽãªSSRFã§æ»æè ãæããã®ã¯ããããŠãããµãŒããåãã«è¡ãURLãã ãã§ããã¡ãœãããPUTã«å€ããããããããä»ãè¶³ãããã¯ã§ããªãã®ã§ãæ¹åŒ2ãªãæ å ±ãåãåºãã«ãããªããŸãã
察çã¯æ¬¡ã®ãšããã§ãã
ãµãŒããåãã«è¡ãå ããèš±å¯ããå®å ã ãã«éå®ãããåå解決ããåŸã®IPã¢ãã¬ã¹ãããªãã€ã¬ã¯ãå ã確ããã
å ¬éãµãŒãããå éšã®ãããã¯ãŒã¯ãžéä¿¡ã§ããç¯å²ãããããã¯ãŒã¯åŽã§ãçµã
ãªãŒãã³ãªãã€ã¬ã¯ããšURLã®æ€èšŒã®èœãšã穎
ãªãŒãã³ãªãã€ã¬ã¯ãã¯ãURLã®ãã©ã¡ãŒã¿ã§æå®ãããå ãžå©çšè ã転éããæ©èœãæªçšãããããšã§ãã
https://www.example.com/login?redirect_url=https://evil.example/æ¬ç©ã®ãµã€ãããå§ãŸãURLãªã®ã§å©çšè ã¯å®å¿ããŠã¯ãªãã¯ããŸãããæ»æè ã®åœãµã€ããžè»¢éããããã£ãã·ã³ã°ã«æªçšãããŸãã察çã¯ã転éå ããç»é²ããŠãããèš±å¯ãªã¹ãã®äžã«éå®ããããšã§ãã
URLãæ€èšŒãããšãããæ¬ç©ã®ãµã€ãã®URLïŒäŸïŒhttps://www.example.comïŒã§å§ãŸã£ãŠããã°ããããšå é ã ãã確ããããšã次ã®ãããªURLãéã£ãŠããŸããŸãïŒå³5ã®äžæ®µïŒã
https://www.example.com.evil.example/
https://www.example.com@evil.example/1ã€ç®ïŒãã¹ãåã¯å³åŽã»ã©äžäœã®ãã¡ã€ã³ãªã®ã§ããã㯠evil.example ãšãããã¡ã€ã³ã®äžã®ãã¹ããæ¥ç¶å ã¯æ»æè ã®ãµãŒã
2ã€ç®ïŒã¢ããããŒã¯ïŒ@ïŒããåã¯å©çšè åãšããŠæ±ãããæ¥ç¶å 㯠evil.example
ãã¹ãåã¯æåã®ã¹ã©ãã·ã¥ïŒ/ïŒã§çµãããŸãããã®ããããã¡ã€ã³åã®åŸãã®ã¹ã©ãã·ã¥ãŸã§å«ããŠå é ãäžèŽãããã確ãããã°ããã¹ãåãæ¬ç©ãšå®å šã«äžèŽãããã®ããéããŸããã
ãããã€ã³ãžã§ã¯ã·ã§ã³ïŒæ¹è¡ã§ãããããä»ãè¶³ã
ã¡ãŒã«ãHTTPã®ãããã¯ã1è¡ã«1é ç®ãæžããæ¹è¡ã§åºåããŸãããã®ãããå ¥åå€ã«æ¹è¡ã³ãŒãïŒCRã»LFïŒãå«ãŸãããšãããããå ãæ°ããããããšããŠæ±ãããŸããæ¹è¡ã³ãŒãã¯ãURLãšã³ã³ãŒããããšæ¬¡ã®åœ¢ã«ãªããŸãã
%0d%0aã¡ãŒã«ãããã€ã³ãžã§ã¯ã·ã§ã³ïŒå ¥åå€ãããšã«ã¡ãŒã«ãéãæ©èœã§ãæ¹è¡ã³ãŒãã䜿ã£ãŠBccãªã©ã®ããããä»ãè¶³ããæå³ããªãå®å ã«ã¡ãŒã«ãéãããã察çã¯ãã¡ãŒã«ã®ããããåºå®å€ã«ããŠå ¥åå€ãåºåããªãããšããããã«äœ¿ãå ¥åå€ã«æ¹è¡ã³ãŒããå«ãŸããŠããããšã©ãŒã«ããããšãéä¿¡å ã®ã¢ãã¬ã¹ãhiddenãã£ãŒã«ããªã©å©çšè ãæžãæããããå Žæã«çœ®ããªãããš
HTTPãããã€ã³ãžã§ã¯ã·ã§ã³ïŒå ¥åå€ãããšã« Set-Cookie ã Location ãªã©ã®ã¬ã¹ãã³ã¹ããããäœãæ©èœã§ãæ¹è¡ã³ãŒãã䜿ã£ãŠä»»æã®ããããæ¬æãä»ãè¶³ããããåæãªCookieãçºè¡ãããããåœã®å 容ã衚瀺ããããããã察çã¯ãããããåºåããå°çšã®æ©èœã䜿ããå ¥åå€ã®æ¹è¡ã³ãŒãã確ãããããšãHTMLã®æ¹è¡ã¿ã°ïŒbrã¿ã°ïŒãšã¯å¥ç©ãªã®ã§æ··åããªã
ååŸã§ã®åããæ¹
什å6å¹ŽåºŠæ¥æ ååŸå3ïŒã¯ã©ãŠãäžã®Webãµã€ãã®SSRFã顿ã§ããããã©ã¡ãŒã¿ã®å€ãã¡ã¿ããŒã¿ãµãŒãã¹ã®ã¯ã¬ãã³ã·ã£ã«æ å ±ãè¿ãURLã«å€ããæå£ãšãããŒã¯ã³ãçºè¡ããURLã«PUTã¡ãœããã§ã¢ã¯ã»ã¹ãããã®ããŒã¯ã³ããªã¯ãšã¹ãã«å«ããæ¹åŒã®éããåãããŸããã
什å7å¹ŽåºŠæ¥æ ååŸå3ïŒã¹ããŒããã©ã³ã®ã¢ããªããã«ã¹ã¿ã URLã¹ããŒã ã§åãåã£ãURLã®ããŒãžãéãæ©èœã顿ã§ããããã®ããŒãžããèªèšŒããŒã¯ã³ãååŸãã颿°ãåŒã¹ããã©ããããåŒåºãå ã®URLã®å é ãæ¬ç©ã®ãã¡ã€ã³ã®URLãã©ããã ãã§å€æããŠããç¹ãåãããŸãããè§£çäŸã«ã¯ãæ¬ç©ã®ãã¡ã€ã³ã®åŸãã«æ»æè ã®ãã¡ã€ã³ãç¶ãã圢ããã¢ããããŒã¯ã§æ»æè ã®ãã¡ã€ã³ãã€ãªãã 圢ã®URLãããã®ç¢ºèªãéã£ãŠããŸãäŸãšããŠç€ºãããŠããŸãïŒäžã§ç€ºãã2ã€ã®åœ¢ãšåãïŒã
æ¡ç¹è¬è©ã§ææãããã€ãŸãã
什å6å¹ŽåºŠæ¥æ ååŸå3ã§ã¯ãã¯ã¬ãã³ã·ã£ã«æ å ±ãååŸããæ¹åŒãåãèšåã§ãäºã€ã®æ¹åŒã®éãã«å³ããŠçããããŠããªãåéšè ãå€ãã£ããšãããŠããŸããæ¹åŒ2ã§ã¯ãPUTã¡ãœããã§ããŒã¯ã³ãåŸãŠãããããããã«å«ããå¿ èŠãããç¹ãéµã§ãã
什å4å¹ŽåºŠæ¥æ ååŸIå1ã§ã¯ãHTTPããããä»ãè¶³ãæ»æã«äœ¿ãæåãåãèšåã§ãHTMLã®æ¹è¡ã¿ã°ãéžã¶è§£çãå€ãã£ããšææãããŠããŸããHTTPã®ããããåºåãã®ã¯æ¹è¡ã³ãŒãïŒCRã»LFïŒã§ãHTMLã®ã¿ã°ã§ã¯ãããŸããã
èšè¿°ã®å
SSRFã®å¯ŸçïŒããµãŒããæ¥ç¶ããå ããèš±å¯ããURLã ãã«éå®ããã
SSRFã§çããããã®ïŒãã¯ã©ãŠãã®ã¡ã¿ããŒã¿ãµãŒãã¹ãããèªèšŒæ å ±ãååŸãããã
ãªãŒãã³ãªãã€ã¬ã¯ãã®å¯ŸçïŒããªãã€ã¬ã¯ãå ããèš±å¯ãªã¹ãã«ç»é²ããURLã ãã«éå®ããã
URLã®æ€èšŒã®æ³šæç¹ïŒããã¡ã€ã³åã®åŸãã®ã¹ã©ãã·ã¥ãŸã§å«ããŠãå é ãäžèŽããããæ€èšŒããã
ã¡ãŒã«ãããã€ã³ãžã§ã¯ã·ã§ã³ã®å¯ŸçïŒãã¡ãŒã«ããããåºå®å€ã«ããå ¥åå€ããããã«åºåããªãã
8. èªå¯ã®äžåïŒIDãæžãæãããšä»äººã®ããŒã¿ãèŠãã
èªèšŒãšèªå¯ã¯å¥ã®ç¢ºèª
èªèšŒïŒãã®äººãæ¬åœã«æ¬äººãã確ããã
èªå¯ïŒãã®äººã«ããã®å¯Ÿè±¡ãžã®ããã®æäœãèš±ããŠããããæ±ºãã
èªèšŒã«æåããããšã¯ãäœã§ãæäœããŠããããšãæå³ããŸããããã°ã€ã³ããå©çšè Aããå©çšè Bã®æ³šæå±¥æŽãèŠãŠã¯ãããŸããããµãŒãã¯ããªã¯ãšã¹ãã®ãã³ã«ããã®å©çšè ã¯ããã®å¯Ÿè±¡ã«ããã®æäœãããŠããããã確ãããŸãã
å žåäŸïŒIDOR
ãã£ãšãå žåçãªã®ãããªã¯ãšã¹ãã®äžã®IDãæžãæããã ãã§ãä»äººã®ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŠããŸãäžåã§ãïŒIDORïŒInsecure Direct Object Reference ãšåŒã°ããŸãïŒã次ã®ããã«æ³šæçªå·ã§èªåã®æ³šæãèŠãããAPIã§ãçªå·ãæžãæãããšãããã®IDã®æã¡äž»ããã°ã€ã³ããŠããæ¬äººãã確ãããŠããªããã°ãä»äººã®æ³šæãèŠããŸãã
GET /api/orders?order_id=1001 ïŒèªåã®æ³šæïŒ
GET /api/orders?order_id=1002 ïŒçªå·ãæžãæãããšãä»äººã®æ³šæãèŠããïŒé²èЧã ãã§ãªããæŽæ°ãåé€ã§ãåãã§ãã
æ°Žå¹³æš©éææ ŒïŒåãæš©éã®ãã»ãã®å©çšè ã®ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŠããŸãïŒäžã®äŸïŒ
åçŽæš©éææ ŒïŒäžè¬ã®å©çšè ãã管çè åãã®æ©èœã䜿ããŠããŸã
察çã®èãæ¹ã¯äžã€ã§ããããªã¯ãšã¹ãã§æå®ããã察象ããšãèªèšŒã§åãã£ãæ¬äººããããµãŒãåŽã§çªãåãããããªã¯ãšã¹ãã®å€ã¯å©çšè ããããã§ãæžãæããããã®ã§ãç»é¢ã«è¡šç€ºããªãããã©ãŠã¶åŽã®JavaScriptã§ç¢ºãããããšãã£ãæ¹æ³ã¯åœãŠã«ãªããŸããã
IDãæšæž¬ãã«ããå€ã«ããã®ã¯ãè£å©çãªå¯Ÿçã§ããIDãæŒããã°ãèªå¯ã®ç¢ºèªããªãéãã¢ã¯ã»ã¹ã§ããŠããŸããŸã
APIããšã«ç¢ºèªãæžããšæžãå¿ããèµ·ããã®ã§ãèªå¯ã®ç¢ºèªãå ±éã®éšåïŒã¢ãžã¥ãŒã«ïŒã§è¡ãèšèšã«ããŸã
ååŸã§ã®åããæ¹
什å6å¹ŽåºŠæ¥æ ååŸå1ïŒã¹ããŒããã©ã³ã®ã¢ããªãšé£æºããAPIã顿ã§ãããAPIã¯ãJWTã§å©çšè ãèªèšŒããããã§ããã©ã¡ãŒã¿ã§æå®ãããå©çšè IDã®ããŒã¿ãè¿ããŠããŸãããè§£çäŸã®å¯Ÿçã¯ããJWTã«å«ãŸããå©çšè IDãããã©ã¡ãŒã¿ã§æå®ãããå€ãšäžèŽãããã©ãããæ€èšŒãããåŠçããå ±éã¢ãžã¥ãŒã«ã§è¡ãããšã§ããJWTãã®ãã®ã®æ€èšŒïŒalgãNONEã§ãªãããšã®ç¢ºèªãªã©ïŒã¯æ¯æŽå£«è§£èª¬2ã®4ã§æ±ããŸãã
什å6å¹ŽåºŠæ¥æ ååŸå3ïŒECãµã€ãã®æ³šææ å ±ã顿ã§ãããæ³šæãèå¥ããã³ãŒãïŒorder-codeïŒã®äž6æ¡ãç·åœããã§è©Šããšãä»äººã®æ³šæãèŠããŠããŸãäžåãåãããŸãããè§£çäŸã®å¯Ÿçã¯ããcookieã®å€ã§å©çšè ã¢ã«ãŠã³ããç¹å®ããorder-codeã®å€ããç¹å®ãããã®ãšéã£ãŠããã°ããšã©ãŒã«ããããšãããã®ã§ããIDãæšæž¬ãã«ããããã ãã§ã¯ãç·åœãããæŒããã«èããããªãããšãããåããäŸã§ãã
èšè¿°ã®å
èªå¯ã®äžåãžã®å¯ŸçïŒããªã¯ãšã¹ãã§æå®ãããIDããèªèšŒããå©çšè æ¬äººã®ãã®ããããµãŒãåŽã§æ€èšŒããã
æ€èšŒæŒããé²ãèšèšïŒãèªå¯ã®æ€èšŒããå ±éã®ã¢ãžã¥ãŒã«ã§è¡ãã
9. XMLãšãã·ãªã¢ã©ã€ãºïŒããŒã¿ã®åœ¢åŒã«ãå¢çããã
XXEïŒXML External EntityïŒ
XMLã«ã¯ãææžã®äžã§ãå®äœããå®çŸ©ããå¥ã®å Žæã®å 容ãåç §ããæ©èœããããŸããå€éšã®å®äœãåç §ã§ããèšå®ã®ãŸãŸãå©çšè ããåãåã£ãXMLãèªã¿èŸŒããšã次ã®ãããªåé¡ãèµ·ããŸãã
XMLã®äžã«ããµãŒãäžã®ãã¡ã€ã«ïŒããšãã°Linuxã®ãã¹ã¯ãŒããã¡ã€ã«ïŒãåç §ããå®äœãæžããããã®å 容ãå¿çã«å«ããŠè¿ããŠããŸã
å éšã®ãµãŒãã®URLãåç §ããå®äœãæžããããµãŒããå éšãžéä¿¡ããŠããŸãïŒ7ç¯ã®SSRFãšåãæ§å³ïŒ
察çã¯ã䜿ããªãæ©èœãXMLããŒãµã®èšå®ã§ç¡å¹ã«ããããšã§ããå€éšå®äœã®åç §ããDTDïŒææžåå®çŸ©ïŒã®åŠçãæ¢ããŸããXMLã䜿ããã«æžã飿ºãªããJSONã®ãããªåçŽãªåœ¢åŒãéžã¶ã®ãæå¹ã§ãã
å®å šã§ãªããã·ãªã¢ã©ã€ãº
ãã·ãªã¢ã©ã€ãºã¯ãä¿åãéä¿¡ã®ããã«äžç¶ãã®ããŒã¿ã«å€æãããªããžã§ã¯ãããå ã®ãªããžã§ã¯ãã«æ»ãåŠçã§ããå€éšããåããããŒã¿ããã®ãŸãŸåŸ©å ãããšãèšèªã圢åŒã«ãã£ãŠã¯ã埩å ã®éäžã§æå³ããªãã¡ãœãããåŒã°ããä»»æã®ã³ãŒããå®è¡ãããããšããããŸãã
å€éšãšã®ããåãã«ã¯ããªããžã§ã¯ãããã®ãŸãŸåŸ©å ãã圢åŒã§ã¯ãªããJSONã®ãããªåçŽãªããŒã¿åœ¢åŒã䜿ã
åãåãåãšé ç®ããããããæ±ºãããã以å€ã¯åãä»ããªã
ãããåŸã埩å ããå Žåã¯ãæ¹ãããããŠããªãããšã眲åãªã©ã§ç¢ºãããããã ã眲åã¯æ¹ããã®æ€ç¥ã§ãã£ãŠãéãäž»ãæªæãæããªãããšã®ä¿èšŒã§ã¯ãªã
ã©ã¡ãããããŒã¿ã®ã€ããã§åãåã£ããã®ããåŠçç³»ã®äžã§åœä»€ãåç §ãšããŠåãããšããç¹ã§ãSQLã€ã³ãžã§ã¯ã·ã§ã³ãšåãæ§å³ã§ãã
10. ã¡ã¢ãªã®å®å šæ§ïŒC/C++ã§ã¯ãé åã®å€§ãããšå¯¿åœãå®ã

ãå³6ãã¡ã¢ãªã®å®å šæ§ãšå€å±€ã®ä¿è·
Cèšèªã®æååã¯ãæåã®åŸãã«çµç«¯æåïŒãã«æåïŒã眮ããŸãã16ãã€ãã®é åã«1ãã€ãæåã®æååãå ¥ãããªããçµç«¯æåã®åãé€ããŠæå€§15ãã€ãã§ãïŒå³6ïŒãæ¥æ¬èªãªã©è€æ°ãã€ãã§è¡šãæåã§ã¯ãèŠãç®ã®æåæ°ãšãã€ãæ°ã¯äžèŽããŸããã
ãããã¡ãªãŒããŒãããŒã¯ã確ä¿ããé åã®å€ãèªã¿æžãããŠããŸãåé¡ã§ããã¹ã¿ãã¯äžã®é åããããµããå€ãã颿°ã®æ»ãå ã¢ãã¬ã¹ïŒé¢æ°ã®åŠçãçµãã£ãåŸã«æ»ãå Žæã颿°ã®æ»ãå€ãšã¯å¥ç©ïŒãæžãæãããšãæ»æè ãçšæããåŠçãžå®è¡ãç§»ããããããããããŸãã
ã³ããŒããåã«ãã³ããŒå ã®å€§ãããšçµç«¯æåã®åã確ããããstrncpy ã®ãããªé·ããæå®ãã颿°ã§ããã³ããŒããé·ãã«ãã£ãŠã¯çµç«¯æåãæžããªãå Žåãããã®ã§ã仿§ã確ããããé·ãå ¥åãåãè©°ãããšãã®åäœã確ããã
å¿ èŠãªå€§ããã®èšç®ãã®ãã®ããæŽæ°ã®ããµãïŒæŽæ°ãªãŒããŒãããŒïŒãèµ·ãããªãããã«ãã
è§£æŸããã¡ã¢ãªãåŸããåç §ããuse-after-freeã¯ã倧ããã§ã¯ãªãã¡ã¢ãªã®å¯¿åœã®åé¡ã誰ããã€è§£æŸããããæç¢ºã«ãã
OSãã³ã³ãã€ã©ã«ããæ»æã®æç«ãé£ããããä»çµã¿ããããŸãã
DEP/NXïŒããŒã¿çšã®é åã«çœ®ããã³ãŒããå®è¡ãããªã
ASLRïŒã¡ã¢ãªã®é 眮ãã©ã³ãã ã«ããã¢ãã¬ã¹ãäºæž¬ãã«ãããã
ã¹ã¿ãã¯ã«ããªã¢ïŒã¹ã¿ãã¯ä¿è·ïŒïŒæ»ãå ã¢ãã¬ã¹ã®æåã«çœ®ããå€ã®å€åãããäžæžããæ€ç¥ãã
ãã ãããããã¯åå ãçŽã代ããã«ã¯ãªããŸãããã³ãŒãã®æ¬ é¥ãçŽããããã§ãéããŠäœ¿ããŸãã
11. ç«¶åç¶æ ïŒç¢ºèªãšæŽæ°ã®éã«ãå¥ã®åŠçãå ¥ã

ãå³7ã確èªãšæŽæ°ã®éã«ãå¥ã®åŠçãå ¥ã
ç«¶åç¶æ ïŒã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ïŒã¯ãè€æ°ã®ããã»ã¹ãã¹ã¬ãããåãè³æºã«ã»ãŒåæã«ã¢ã¯ã»ã¹ããããšã§ãäºå®å€ã®çµæãçããåé¡ã§ãã
äºçŽã®å仿 ãæ®ã1ä»¶ã®ãšããäºã€ã®èŠæ±ãåæã«ã空ããããã確ãããããããäºçŽãæç«ããããšãæ ãè¶ ããŠåãä»ããŠããŸããŸãïŒå³7ïŒã確ãããæç¹ãšäœ¿ãæç¹ã®éã«ç¶æ ãå€ããåé¡ã¯ãTOCTOUïŒTime of Check to Time of UseïŒãšãåŒã°ããŸãã察çã¯ã確èªãšæŽæ°ãäžã€ã®åäœãšããŠæ±ãããšã§ããããšãã°ãæ®æ°ã1以äžãªã1æžããããšããæ¡ä»¶ä»ãã®æŽæ°ãããŒã¿ããŒã¹ã®äžã§äžåºŠã«è¡ãæ¹æ³ããããŸããè€æ°ã®è¡šã«ãŸãããåŠçã§ã¯ãé©åãªããã¯ãšãã©ã³ã¶ã¯ã·ã§ã³ã®åé¢ã¬ãã«ãããŒã¿ããŒã¹ã®å¶çŽã倱æãããšãã®ããŒã«ããã¯ãçµã¿åãããŸããè€æ°ã®ãµãŒããåãããŒã¿ããŒã¹ãäœ¿ãæ§æã§ã¯ã1å°ã®ãµãŒãã®ã¡ã¢ãªäžã®ããã¯ã ãã§ã¯å®ããŸããã
Webã¢ããªã§ã¯ãè€æ°ã®å©çšè ã®ãªã¯ãšã¹ããåæã«åŠçãããŸããJavaã§ static ãä»ããŠå®£èšãã倿°ïŒã¯ã©ã¹å€æ°ïŒãããµãŒãã¬ããã®ã€ã³ã¹ã¿ã³ã¹å€æ°ã¯ãåæã«åŠçãããŠããè€æ°ã®ãªã¯ãšã¹ãã§å ±æãããããšããããŸããããã«å©çšè ããšã®æ å ±ãå ¥ãããšãåŠçã®éäžã§å¥ã®å©çšè ã®å€ã«äžæžããããä»äººã®æ å ±ã衚瀺ãããããšããããŸãã察çã¯ãå©çšè ããšã®æ å ±ãã¡ãœããã®äžã®ããŒã«ã«å€æ°ã«çœ®ãããšã§ãã
ååŸã§ã®åããæ¹
什å5å¹ŽåºŠæ¥æ ååŸIå1ïŒJavaã®ãœãŒã¹ã³ãŒãã顿ã§ãå ±æããã倿°ïŒstatic ã§å®£èšãã倿°ïŒãåå ã§èµ·ããäžå ·åã®åç§°ãšããŠããã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ããåãããŸãããåã倧åã§ã¯ã2ç¯ã®ãã¬ãŒã¹ãã«ããåãããŠããŸããæ¡ç¹è¬è©ã§ã¯ããã®åç§°ãåãèšåã®æ£ççãäœãã£ããšãããèšèšã»å®è£ ã»ãã¹ãã®å段éã§ã®å¯Ÿçã確èªããããæ±ããŠããŸãã
12. ååŸã®ã³ãŒãèªè§£ã®é²ãæ¹
ååŸã®Webã¢ããªã®åé¡ã§ã¯ããœãŒã¹ã³ãŒããHTTPã®ããåãã®äžéšã瀺ããããã©ã®è¡ã«åé¡ãããããã空æ¬ã«äœãå ¥ããããã©ãçŽããããåãããŸããæ¬¡ã®é ã§èªããšãèŠèœãšããæžããŸãã
å€ããæ¥ãå€ãæ¢ãïŒãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ãCookieãããããã¢ããããŒãããããã¡ã€ã«ãå€éšAPIã®å¿çãåãåã£ãŠããè¡ã«å°ãä»ãã
å€ã远ããããïŒãã®å€ãä»£å ¥ãã倿°ããã©ã®åŠçã«æž¡ããããã©ããéäžã§æ€èšŒããšã¹ã±ãŒããããŠããã
å©çšå ã®çš®é¡ã確ãããïŒSQLæã®çµç«ãŠãHTMLã®åºåãinnerHTMLãOSã³ãã³ãã®å®è¡ããã¡ã€ã«ã®ãã¹ãéä¿¡å ã®URLãã¬ã¹ãã³ã¹ãããã®ã©ãããçš®é¡ã«ãã£ãŠå¿ èŠãªå¯Ÿçãæ±ºãŸãã®ã§ãåç¯ã®ãèšè¿°ã®åããåœãŠã¯ãã
æ¬äººã®ç¢ºèªãæ¢ãïŒIDãªã©ã§å¯Ÿè±¡ãæå®ããŠããåŠçã§ã¯ããã®å¯Ÿè±¡ãèªèšŒããæ¬äººã®ãã®ãã確ãããŠããè¡ãããã
å ±æããããã®ãæ¢ãïŒstatic ã®å€æ°ãã€ã³ã¹ã¿ã³ã¹å€æ°ãåæã«æŽæ°ãããè³æºã¯ãªãã
空æ¬è£å ã§ã¯ãå顿ã«ç€ºãããã»ãã®ç®æã®ã³ãŒãïŒåãã¯ã©ã¹ã®å¥ã®ã¡ãœãããªã©ïŒã«ãæ£ããæžãæ¹ã®æããããããããšãå€ãã§ããããšãã°ãã»ãã®ç®æã§ãã¬ãŒã¹ãã«ãã䜿ã£ãŠããã°ã空æ¬ã«ãåã圢ãå ¥ãå¯èœæ§ãé«ããªããŸãã
èªã¿æ¹ã®å®äŸ
次ã¯ã説æã®ããã«äœã£ãçãJavaã®ã³ãŒãã§ãïŒå®éã®éå»åã§ã¯ãããŸããïŒã泚æçªå·ãåãåããæ³šæã®åèãç»é¢ã«è¡šç€ºããŸãã
String id = request.getParameter("order_id"); // 1
String sql = "SELECT * FROM orders WHERE order_id = '" + id + "'"; // 2
ResultSet rs = stmt.executeQuery(sql); // 3
out.println("<p>" + rs.getString("note") + "</p>"); // 4äžã®æé ãåœãŠã¯ãããšã次ã®äžã€ã®æ¬ é¥ãèŠã€ãããŸãã
1è¡ç®ãã2è¡ç®ïŒå€ããæ¥ã id ããæååé£çµã§SQLæã«å ¥ã£ãŠãããSQLã€ã³ãžã§ã¯ã·ã§ã³ã2è¡ç®ãš3è¡ç®ãããã¬ãŒã¹ãã«ããš PreparedStatement ã«çœ®ãæãã
2è¡ç®ïŒæå®ãããæ³šæãããã°ã€ã³äžã®å©çšè ã®ãã®ãã確ãããŠããªããIDãæžãæããã°ä»äººã®æ³šæãèŠããèªå¯ã®äžåãæ¡ä»¶ã«å©çšè IDãå ããããååŸããæ³šæã®æã¡äž»ã確ããã
4è¡ç®ïŒããŒã¿ããŒã¹ããåãåºããåèãããšã¹ã±ãŒãããã«HTMLãšããŠåºåããŠãããåèãå©çšè ã®å ¥åãªãæ ŒçŽåXSSãåºåæã«ãšã¹ã±ãŒããã
äžã€ã®ã³ãŒãã«ãå©çšå ã®éãæ¬ é¥ã䞊ãã§ããããšããããããŸãã1è¡ãã€ããã®å€ã¯ã©ãããæ¥ãŠãäœãšããŠäœ¿ããããããåãã°ãèŠèœãšããæžããŸãã
è匱æ§ãšå¯Ÿçã®å¯Ÿå¿äžèЧ
SQLã€ã³ãžã§ã¯ã·ã§ã³ïŒå©çšå ã¯SQLæãæ ¹æ¬å¯Ÿçã¯ãã¬ãŒã¹ãã«ããä¿éºã¯WAFãDBæš©éã®æå°åããšã©ãŒã衚瀺ããªãããš
OSã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ïŒå©çšå ã¯ã·ã§ã«ãæ ¹æ¬å¯Ÿçã¯ã·ã§ã«ãèµ·åãã颿°ã䜿ããªãããš
ãã¹ãã©ããŒãµã«ïŒå©çšå ã¯ãã¡ã€ã«ã®ãã¹ãæ ¹æ¬å¯Ÿçã¯å€éšã®å€ã§ãã¡ã€ã«åãæå®ããªãããšããã¡ã€ã«åã ããåãåºãããš
XSSïŒåå°åã»æ ŒçŽåïŒïŒå©çšå ã¯HTMLãæ ¹æ¬å¯Ÿçã¯åºåæã®ãšã¹ã±ãŒããä¿éºã¯CSPãHttpOnly
XSSïŒDOM-basedïŒïŒå©çšå ã¯ãã©ãŠã¶ã®DOMãæ ¹æ¬å¯Ÿç㯠textContent ãªã©æåãšããŠæ±ãAPI
CSRFïŒå©çšå ã¯ç¶æ ãå€ããèŠæ±ãæ ¹æ¬å¯Ÿçã¯ã»ãã·ã§ã³ãšçµã³ä»ããCSRFããŒã¯ã³ãè£å©ã¯SameSite屿§ãåèªèšŒ
SSRFã»ãªãŒãã³ãªãã€ã¬ã¯ãïŒå©çšå ã¯éä¿¡å ã»è»¢éå ãæ ¹æ¬å¯Ÿçã¯èš±å¯ãªã¹ãã«ããéå®
ãããã€ã³ãžã§ã¯ã·ã§ã³ïŒå©çšå ã¯ã¡ãŒã«ãHTTPã®ããããæ ¹æ¬å¯Ÿçã¯ããããåºå®å€ã«ããããšãæ¹è¡ã³ãŒããæåŠããããš
èªå¯ã®äžåïŒå©çšå ã¯å¯Ÿè±¡ãæå®ããåŠçãæ ¹æ¬å¯Ÿçã¯ãµãŒãåŽã§ã®æ¬äººã®ç¢ºèª
ç«¶åç¶æ ïŒå©çšå ã¯å ±æãããç¶æ ãæ ¹æ¬å¯Ÿçã¯ç¢ºèªãšæŽæ°ãäžã€ã®åäœã«ããããš
13. ã³ãŒãã£ã³ã°æšæºãšã¬ãã¥ãŒ
ã·ã©ãã¹ã®å°é ç®2-5ã«ã¯ãã»ãã¥ã¢ããã°ã©ãã³ã°ã®ååã»å®è·µèŠç¯ãšãããã«æ²¿ã£ãå®è£ ã®ã¬ãã¥ãŒãå«ãŸããŸããå®åã§ã¯ã次ã®ããšã決ããŠãããšãã¬ãã¥ãŒã§ç¢ºããããããªããŸãã
ã³ãŒãã£ã³ã°æšæºïŒèšèªããã¬ãŒã ã¯ãŒã¯ããšã«ãäœãããªããããã©ãæžããããå ·äœçã«æžããäŸïŒSQLã¯å€ããã€ã³ããããç»é¢ãžã®åºåã¯èªåãšã¹ã±ãŒãã®ãããã³ãã¬ãŒãã textContent ã䜿ããã·ã§ã«ã®åŒåºãã¯ååãšããŠé¿ãããã¢ããããŒãããããã¡ã€ã«åãä¿åãã¹ã«äœ¿ããªã
çµ±åéçºç°å¢ïŒIDEïŒïŒèŠåãåã®æ€æ»ãéçè§£æã®çµæããæžããŠããå Žæã§ç€ºããŠãããããã ãèŠåããŒãã§ããèªå¯ã®èª€ããç«¶åç¶æ ããªãããšã®èšŒæã«ã¯ãªããªã
ã¬ãã¥ãŒïŒãå ¥å â 倿 â å©çšå ãããã©ããæšæºã©ããããäŸå€åŠçãåæå®è¡ã§æ¡ä»¶ã厩ããªããã人ã確ãããã䜿ã£ãŠããã©ã€ãã©ãªãšããã®æŽæ°ã®æ¹éã察象ã«å ¥ãã
ããŒã«ã«ããæ€æ»ïŒéçè§£æãåçãªèšºæãäŸåéšåã®æ€æ»ïŒã®äœ¿ãåãã¯ãæ¯æŽå£«è§£èª¬2ã®6ã§æ±ããŸãã
ç解床ãã§ãã¯
æ¬æã®çè§£ã確ãããããã®ãªãªãžãã«åé¡ã§ããå®éã®éå»åã§ã¯ãããŸããã
å1ã䞊ã³é ã®æå®
ç»é¢ã§äžèЧã®äžŠã³é ãå©çšè ã«éžã°ãããSQLæã®çµç«ãŠãšããŠãæãé©åãªãã®ã¯ã©ããã
ã¢ïŒå©çšè ãéžãã æååããORDER BY ã®åŸãã«ãã®ãŸãŸé£çµãã
ã€ïŒäžŠã³é ã®æå®ããã¬ãŒã¹ãã«ãã§æž¡ãã°å®å šã§ãã
ãŠïŒå©çšè ã®éžæããããã°ã©ã åŽã§æ±ºããåãšé åºã®åè£ã«çœ®ãæããŠäœ¿ã
ãšïŒå©çšè ã®éžæããèšå·ãåãé€ããŠããé£çµãã
æ£è§£ïŒãŠãååã䞊ã³é ã¯SQLã®æ§é ãªã®ã§ãå€ã®ãã€ã³ãã§ã¯æ±ããŸããïŒã€ïŒãããã°ã©ã åŽã§æ±ºããåè£ããéžã°ããŸããã¢ãšãšã¯ãæ§é ã«å ¥åå€ãå ¥ã蟌ãäœå°ãæ®ããŸãã
å2ãDOM-based XSS
次ã®åŠçããããæãé©åãªå¯Ÿçã¯ã©ããã
element.innerHTML = location.hash.slice(1);ã¢ïŒãµãŒãåŽã§ãã¬ã¹ãã³ã¹ã®HTMLããšã¹ã±ãŒããã
ã€ïŒinnerHTML ã§ã¯ãªã textContent ã§æžã蟌ã
ãŠïŒCookieã« HttpOnly 屿§ãä»ãã
ãšïŒURLã®ã#ã以éããµãŒãã®ãã°ã§ç£èŠãã
æ£è§£ïŒã€ãã#ã以éã¯ãµãŒãã«éãããªãã®ã§ããµãŒãåŽã®åŠçïŒã¢ïŒããã°ã®ç£èŠïŒãšïŒã§ã¯å¯ŸåŠã§ããŸããããŠã¯Cookieã®èªåããé²ãã ãã§ãã¹ã¯ãªããã®å®è¡ã¯æ¢ããããŸããã
å3ãCSRFããŒã¯ã³
CSRFããŒã¯ã³ãæ€èšŒããŠããããå¥ã®å©çšè ã®ã¢ã«ãŠã³ãã§ååŸããããŒã¯ã³ã§ãåŠçãæåããããã®ç¶æ ã§èµ·ãåŸãããšãšããŠãæãé©åãªãã®ã¯ã©ããã
ã¢ïŒæ»æè ãèªåã§ååŸããããŒã¯ã³ãçœ ã®ãã©ãŒã ã«å ¥ãããã°ã€ã³äžã®å©çšè ã«éä¿¡ããã
ã€ïŒæ»æè ãå©çšè ã®Cookieãèªã¿åããå€éšãžéä¿¡ãã
ãŠïŒæ»æè ãSQLæã®æ§é ãå€ããããŒãã«åãç¹å®ãã
ãšïŒæ»æè ããµãŒãã«å éšãããã¯ãŒã¯ãžã®éä¿¡ãããã
æ£è§£ïŒã¢ãããŒã¯ã³ãå©çšè ã®ã»ãã·ã§ã³ãšçµã³ä»ããŠããªããããæ»æè ã®ããŒã¯ã³ã§ãéããŸããã€ã¯XSSããŠã¯SQLã€ã³ãžã§ã¯ã·ã§ã³ããšã¯SSRFã®èª¬æã§ãã
å4ããªãã€ã¬ã¯ãå ã®æ€èšŒ
ãªãã€ã¬ã¯ãå ã®URLããhttps://www.example.comãã§å§ãŸããã ãã確ãããŠããããã®æ€èšŒãééããŠãæ»æè ã®ãµãŒããžè»¢éãããURLã¯ã©ããã
ã¢ïŒhttps://www.example.com/news/
ã€ïŒhttps://www.example.com.evil.example/
ãŠïŒhttps://www.example.com/login?next=/top
ãšïŒhttps://www.example.com:443/æ£è§£ïŒã€ããã¹ãå㯠www.example.com.evil.example ã§ãevil.example ãã¡ã€ã³ã®ãã¹ãã§ãããã¡ã€ã³åã®åŸãã®ã¹ã©ãã·ã¥ãŸã§å«ããŠç¢ºãããã°é²ããŸãã
å5ãæ³šææ å ±ã®API
次ã®ãªã¯ãšã¹ãã§ããã°ã€ã³äžã®å©çšè ã®æ³šæãè¿ãAPIããããorder_idã®å€ãæžãæãããšãä»äººã®æ³šæãèŠãããæ ¹æ¬çãªå¯ŸçãšããŠãæãé©åãªãã®ã¯ã©ããã
GET /api/orders?order_id=1001ã¢ïŒorder_id ãæšæž¬ãã«ããã©ã³ãã ãªå€ã«ãã
ã€ïŒç»é¢ã« order_id ã衚瀺ããªãããã«ãã
ãŠïŒæå®ãããæ³šæãããã°ã€ã³äžã®å©çšè ã®ãã®ãããµãŒãåŽã§ç¢ºããã
ãšïŒéä¿¡ãHTTPSã«ãã
æ£è§£ïŒãŠãæå®ããã察象ãšèªèšŒããæ¬äººãããµãŒãåŽã§çªãåãããŸããã¢ã¯è£å©çãªå¯Ÿçã§ãIDãæŒããã°é²ããŸãããã€ãšãšã¯ãå€ã®æžãæããé²ããŸããã
å®åãšåœã»èªæ²»äœã§ã¯
å®åã§ã¯ãè匱æ§ã®ååãç¥ã£ãŠããããšããã仿§ãšåå ¥ãã®ç¢ºèªã«èœãšã蟌ããããåãããŸãã調éã®ä»æ§æžã«è匱æ§åã䞊ã¹ãã ãã§ã¯ãå®è£ ãšåå ¥ããã€ãªãããŸãããããšãã°ã次ã®ããã«å¯Ÿå¿ãããŸãã
仿§ïŒæ€çŽ¢æ¡ä»¶ã¯å€ãšããŠãã€ã³ããã䞊ã³é ã¯èš±å¯ããåè£ããéžã¶ãåå ¥ãïŒåŒçšç¬Šãå«ãæ£åœãªå°åãæ°åã§ããæ¡ä»¶ãå€ãããã«æ€çŽ¢ã§ããããšã確ããã
仿§ïŒç³è«æ¬æã¯è·å¡ã®ç»é¢ã§ããã¹ããšããŠè¡šç€ºãããåå ¥ãïŒä¿åããå ¥åããå¥ã®å©çšè ã®ç»é¢ã§åœä»€ãšããŠåããªãããšã確ããã
仿§ïŒæ¿èªã倿Žã®æäœã«ã¯ãCSRF察çãšå¯Ÿè±¡ããšã®èªå¯ãèšãããåå ¥ãïŒããŒã¯ã³ãæ¬ ããèŠæ±ããæš©éã®ãªãè·å¡ã®æäœãæåŠããããšã確ããã
æ¿åºæ©é¢çã®çµ±äžåºæºããç·åçã®èªæ²»äœåãã¬ã€ãã©ã€ã³ã«ããæ¢ç¥ã®çš®é¡ã®Webã¢ããªã±ãŒã·ã§ã³ã®è匱æ§ãéçºæã«æé€ãã察çã瀺ãããŠããŸãããããã®äœçœ®ä»ããšèªã¿æ¹ã¯æ¯æŽå£«è§£èª¬1ã®1ã§æ±ããŸãã
ãŸãšã
ã©ã®è匱æ§ããå€ã®äœ¿ãéãã§èªããã å€ãSQLã®åœä»€ãHTMLã®ã¿ã°ãéä¿¡ã®è¡ãå ãä»äººã®ããŒã¿ã®æå®ã«ãªãå Žæããå¢çã®åŽ©ããå Žæã
察çã¯å©çšå ããšã«æ±ºãŸãã SQLã¯ãã¬ãŒã¹ãã«ããHTMLã¯åºåæã®ãšã¹ã±ãŒããDOM㯠textContentãè¡ãå ã¯èš±å¯ãªã¹ããå¯Ÿè±¡ã®æå®ã¯ãµãŒãåŽã§ã®æ¬äººç¢ºèªã
CSPã»HttpOnlyã»WAFã»æš©éã®æå°åã¯ä¿éºã 被害ãå°ããããããæ¬ é¥ãã®ãã®ã¯çŽããªãã
CSRFããŒã¯ã³ã¯ã»ãã·ã§ã³ãšçµã³ä»ããŠæ€èšŒããã POSTã«ããã ãã確èªç»é¢ã眮ããã ãã§ã¯é²ããªãã
é¢é£èšäº
åæïŒãã°ã€ã³ã§ããã°ãå®å šãªã®ãïœæ¯æŽå£«è§£èª¬2ã®4ïŒã»ãã·ã§ã³ç®¡çã»Cookie屿§ã»JWTïŒ
次ã«èªãïŒèåŒ±æ§æ€åºãŒããªããå®å šãšèšããã®ãïœæ¯æŽå£«è§£èª¬2ã®6ïŒè匱æ§ã®èŠã€ãæ¹ïŒ
ããããŠèªãïŒãã°ã€ã³ã§ããã°ããã®å ãŸã§èŠãŠãããïŒïœæ¯æŽå£«è§£èª¬3ã®8ïŒèªå¯ãšæš©é管çïŒ
2026幎10ææ¹èšïŒååŸã®åºé¡äŸãšèšè¿°ã®åãå ããæ§æãèŠçŽããŸããã