ååã®æ¥è¨ããã ãã¶æ¥ã«ã¡ã空ãã¦ãã¾ãã¾ããã
ä»æ¥ã¯ãèªä½æ¤æ»ãã¼ã«ã®SQLã¤ã³ã¸ã§ã¯ã·ã§ã³ç¨ã·ã°ããã£ã«ã¤ãã¦æ¸ãã¾ãã
SQLã¤ã³ã¸ã§ã¯ã·ã§ã³ã®æ¤æ»ã·ã°ããã£ã¨ãã¦ã¯ã以ä¸ã®5種é¡ãç¨æãã¦ãã¾ãã
- A. SQLã¨ã©ã¼æ¤åº+ç°¡æãªBlind
- B. Blind æ°å¤åã»ã«ã©ã åç
- C. Blind æååå
- D. æ´æ°ç³»ã¯ã¨ãª
- E. æåã³ã¼ãç³»
SQLã¤ã³ã¸ã§ã¯ã·ã§ã³ã¯ãããªãã®é »åº¦ã§èå¼±æ§ãçºè¦ããããã¨ãã¾ãä¸è¬çã«å±éºåº¦ã®é«ãèå¼±æ§ã§ãããã¨ãããã·ã°ããã£ã®ç¨®é¡ãå¤ããã¦ãã¾ãã
ããããã®ã·ã°ããã£ã«ã¤ãã¦ã以ä¸ã§é çªã«è¦ã¦ããã¾ãã
A. SQLã¨ã©ã¼æ¤åº+ç°¡æãªBlind
æåã«è©¦ãã®ã¯ãã¼ã·ãã¯ãªãã¿ã¼ã³ã§ãã
ã¤:ãå ã®å¤ã'"\'"\ ⦠SQLã¨ã©ã¼ã«ãªã ã:ãå ã®å¤ã''""\\ ⦠SQLã¨ã©ã¼ã«ãªããªã ã:ãå ã®å¤ã'"\'"\ ⦠SQLã¨ã©ã¼ã«ãªãï¼ã¤ã¨åãï¼
ããããã§ãå®è¡ãããSQLæã¯ä»¥ä¸ã®ãããªãã®ã«ãªãã¾ãã
ãã¤ããã§å®è¡ãããSQLæã ⦠SQLã¨ã©ã¼ã«ãªã SELECT * FROM test1 WHERE col2='xxx'"\'"\' ããã§å®è¡ãããSQLæã ⦠SQLã¨ã©ã¼ã«ãªããªã SELECT * FROM test1 WHERE col2='xxx''""\\'
å¤å®ã¯ã以ä¸ã®ããããã®æ¡ä»¶ãæºããå ´åã«ãè¦æ³¨æãã¨ãã¾ãã
- ã¤ã®å¿çã«SQLã¨ã©ã¼ã¡ãã»ã¼ã¸ï¼ããããã®ï¼ãå«ã¾ãã
- æ¤æ»æååãéã£ãéã®å¿çãåæããã¤â ããã¤ã¤âããæºãã
ãã®æ®µéã§ãè¦æ³¨æãã«çãã¦ç½®ãã®ã¯ãããã¤ãã®çç±ã§èª¤æ¤åºï¼SQLã¨ã©ã¼ãåºåãããããå®éã«ã¯ææãªæ»æã«å©ç¨ã§ããªãçï¼ãçããã®ãé²ãããã§ãã
ãªãããã®ã·ã°ããã£ã§ã¯èå¼±æ§ãæ¤åºã§ããªãã±ã¼ã¹ãããã¾ããä¾ãã°ãæååå以å¤ã®Blind SQLã¤ã³ã¸ã§ã¯ã·ã§ã³ã§ã¯ãã¤ã¨ãã®ä¸¡æ¹ã¨ãSQLã¨ã©ã¼ã«ãªãã両è ã®å¿çã«ææãªå·®ãåºãªããããæ¤åºã§ãã¾ããã
ã¾ããæåååã§ãã£ã¦ããå é¨çã«çºçããSQLã¨ã©ã¼ãæ¡ãã¤ã¶ãããç¶æ³ã§ã¯æ¤åºã§ãã¾ãããã¨ã©ã¼ãæ¡ãã¤ã¶ãããã¨ããã®ã¯ãä½ããã®ãã¼ã¿ã®æ¤ç´¢æ©è½ã§ãã¤ã¨ãã¨ãã«ãããããããã¼ã¿ã¯ããã¾ãããã®ãããªåçã®å¿çãè¿ãå ´åãªã©ã該å½ãã¾ãã
æååå以å¤ããããã¯SQLã¨ã©ã¼ãæ¡ãã¤ã¶ãããã±ã¼ã¹ã«ã¤ãã¦ã¯ããã以éã®ããã¤ãã®ã·ã°ããã£ã§æ¤åºã試ã¿ã¾ãã
B. Blind æ°å¤åã»ã«ã©ã åç
æ°å¤åã»ã«ã©ã åãªã©ã®ã'ãã§æ¬ããã¦ããªãé¨åã«å¤ãåºåãããã¿ã¤ãã®èå¼±æ§ã®æ¤æ»ã§ããå ·ä½çã«ã¯ã以ä¸ã®ãããªSQLæãå®è¡ãããã±ã¼ã¹ã§ãã
1: SELECT * FROM test1 WHERE col1=$p; 2: UPDATE test1 SET col1=$p1 WHERE col3>$p2; 3: SELECT * FROM test1 ORDER BY $p1 $p2;
ãããããæ°å¤ãªãã©ã«é¨åï¼1,2ï¼ãã«ã©ã åãASC/DESCçã®SQLãã¼ã¯ã¼ãï¼3ï¼ãå¶å¾¡å¯è½ã«ãªã£ã¦ãã¾ããå ¨ã¦ãSQLæã®ã'ãã§æ¬ããã¦ããªãé¨åãå¶å¾¡å¯è½ã§ããã¨ããç¹ã§å ±éãã¦ãããããã²ã¨ã¾ã¨ãã«åãææ³ã§æ¤æ»ãã¾ãã
ã¤:ãå ã®å¤ã ⦠æ£å¸¸ ã:ãå ã®å¤ã'"\'"\ ⦠SQLã¨ã©ã¼ã«ãªã ã:ãå ã®å¤ã/*q*/ ⦠æ£å¸¸ï¼ã¨çä¾¡ï¼ äº:ãå ã®å¤ã/q**/ ⦠SQLã¨ã©ã¼ã«ãªã ã:ãå ã®å¤ã*/q*/ ⦠SQLã¨ã©ã¼ã«ãªã
ã¤ã¨ãã¯ãAã®ã·ã°ããã£ã§æ¢ã«éã£ã¦ããã®ã§ããã®Bã®ã·ã°ããã£ã§ã¯ããããéãã¾ãã
ãããã§ããããå®è¡ãããSQLã¯ã以ä¸ã®ããã«ãªãã¾ãã
ãï¼SELECT * FROM test1 WHERE col1=8/*q*/ ãï¼SELECT * FROM test1 WHERE col1=8/q**/ ãï¼SELECT * FROM test1 WHERE col1=8*/q*/
å¤ãã®ãã¼ã¿ãã¼ã¹ã§ã¯ãã/* ... */
ãã®ãããªãããã¯ã³ã¡ã³ãã使ç¨ã§ãã¾ãããã®ãããä¸ã®ãã¯SQLã¨ã©ã¼ã«ãªããã«å
ã®å¤ï¼ä¸ã®ä¾ã§ã¯ã8ãï¼ãå
¥ããå ´åã¨åçã®å¦çãå®è¡ããããã¨ãæå¾
ã§ãã¾ããä¸æ¹ããã¨ãã¯SQLã¨ã©ã¼ã«ãªããã¨ãæå¾
ã§ãã¾ãã
å¤å®ã¯ãããããã®æ¤æ»æååãéã£ãéã®å¿çãåæããã¤â ãããâ ãããâ äºããâãã®å ´åã«ãèå¼±æ§æããã¨ãã¾ãã
å¤å®æ¹æ³ã¨ãã¦ã¯ãã·ã³ãã«ãªã¢ããªã§ã¯ãã¤âãã¨ã¤â ãã確èªããã®ãæã£åãæ©ãã§ããããããã¤ã¨ãã®å¿çãè¿ããã®ã«ãªããã¨ã常ã«æå¾ ã§ãããã¨ããã¨ãããã»ã©åç´ã§ã¯ãªãï¼ãã¨ãããï¼ã®ã§ããâãã確èªããããã«ãã¦ãã¾ãããªãããâãã®æ¡ä»¶ããªãã¨ãä¸é¨ã®ã¢ããªã§èª¤æ¤åºãå¤ãçºçãã¦ãã¾ãã¾ãã
ã¾ããã«ã©ã åããã¼ãã«åã®ã¤ã³ã¸ã§ã¯ã·ã§ã³ãå¯è½ãªã±ã¼ã¹ã§ã¯ããã®ã·ã°ããã£ã§æ¤åºã§ãããã¨ãå¤ãã¨æãã¾ããã以ä¸ã®ããã«è§æ¬å¼§ãããã¯ã¯ã©ã¼ãã§ãã¼ãã«åãã«ã©ã åãæ¬ãæ§æã使ç¨ããã¦ããã±ã¼ã¹ã§ã¯æ¤åºã§ãã¾ããã
ãSQL Serverã SELECT [col1] FROM [test1] ORDER BY [col1] ãMySQLã SELECT `col1` FROM `test1` ORDER BY `col1`
ãã®è¾ºãã«ãªãã¨ãå°ãªãã¨ãBlindææ³ã§æ¤åºããã®ã¯ãªããªãé£ããã®ã§ãç¾ç¶ã§ã¯å¯¾å¿ããã·ã°ããã£ã¯ç¨æãã¦ãã¾ããã
ããä¸ã¤ãæ°å¤åã«ç¹åããã·ã°ããã£ãä¸å¿ç¨æãã¦ãã¾ãã
ã¤:ãå ã®å¤ã ⦠æ£å¸¸ ã:ãå ã®å¤ã'"\'"\ ⦠SQLã¨ã©ã¼ã«ãªã ã:ãå ã®å¤ã*(1) ⦠æ£å¸¸ï¼ã¨çä¾¡ï¼ äº:ãå ã®å¤ã*()1 ⦠SQLã¨ã©ã¼ã«ãªã ã:ãå ã®å¤ã*)(1 ⦠SQLã¨ã©ã¼ã«ãªã
ãããã§ããããå®è¡ãããSQLã¯ã以ä¸ã®ããã«ãªãã¾ãã
ãï¼SELECT * FROM test1 WHERE col1=8*(1) ãï¼SELECT * FROM test1 WHERE col1=8*()1 ãï¼SELECT * FROM test1 WHERE col1=8*)(1
å ã»ã©ã®ã·ã°ããã£ã¨åãããã¤â ãããâ ãããâ äºããâãã®å ´åã«ãèå¼±æ§æããã¨ãã¾ãã
æ°å¤æ¼ç®ã使ãæ¹æ³ã¯ãå²ã¨åºãç¥ããã¦ããæ¹æ³ã§ãã以ä¸ã®ãã¼ã¸ã§ãã+ãæ¼ç®åã使ãæ¹æ³ãç´¹ä»ããã¦ãã¾ãã
åèï¼Research
使ç¨ããæ¼ç®åã¯ãã+ãã-ãã*ãã/ãã®4ã¤ã®ãããããªãã°ãå ¨ã¦ã®DBMSã§ä½¿ããã¯ããªã®ã§ã©ãã§ãããã§ãããã ããè¤éãªå¼ã«ã¤ã³ã¸ã§ã¯ã·ã§ã³ãããã±ã¼ã¹ãããããã®ãããªã±ã¼ã¹ã§ã¯æ¼ç®åã®åªå é ä½ãããã¦ãã¾ããä¾ãã°ã以ä¸ã®ãããªã±ã¼ã¹ã§ã¯ãã+ãã-ãã¯æå¾ éãã«åãã¾ããã
ãå ã®ã¯ã¨ãªã SELECT * FROM test1 WHERE col1=8*12 ãæä½ããã¯ã¨ãªã SELECT * FROM test1 WHERE col1=8+0*12
ãªããå®éã®ã¨ããã¯ãå ã»ã©ã®ã³ã¡ã³ãæ§æã使ãã·ã°ããã£ã§ã«ãã¼ã§ããå ´åãå¤ããããå¿ è¦æ§ã¯ããç¨é«ããªãã·ã°ããã£ã§ãããããããããã¯ã³ã¡ã³ãã使ããªãç°å¢ãããããã«ããã®æ°å¤æ¼ç®ãç¨ããã·ã°ããã£ãä½æãã¾ããããã ãããã®ã·ã°ããã£ã§ã¯ããORDER BYããªã©ã¸ã®ã¤ã³ã¸ã§ã¯ã·ã§ã³ãæ¤åºã§ãã¾ããã
C. Blind æååå
ã'ãã§æ¬ãããæååãªãã©ã«é¨åã«ãã¨ã¹ã±ã¼ããªã©ããããã«åºåãããã¿ã¤ãã®èå¼±æ§ã®æ¤æ»ã§ãã
MySQLçã®ä¸é¨ã®DBMSã§ã¯ãã"ãï¼ããã«ã¯ã©ã¼ãï¼ãæ¬ãæåã¨ãã¦ä½¿ç¨ããããã¨ãããã¾ãããã ããã®ãããªã±ã¼ã¹ã¯ã¾ããªã®ã§ãAã®ã·ã°ããã£ã§ã«ãã¼ããã¨å²ãåã£ã¦ããã®Cã®ã·ã°ããã£ã§ã¯ã'ãã§æ¬ãããæååã®ã¿ãèæ ®ãã¾ãã
æååãªãã©ã«é¨åã«å¯¾ããBlindæ¤æ»ãè¡ãªãå ´åã代表çãªã®ã¯ããå
ã®å¤ã' AND '1'='1
ããªã©ã使ãææ³ã§ã¯ç¡ããã¨æãã¾ãããã®æ¹æ³ã¯ã大æµã¯ãã¾ãæ©è½ããããã§ããã以ä¸ã«æããããã«ãã¾ããããªãã±ã¼ã¹ãããã¾ãã
1: SELECT * FROM test1 WHERE col2 LIKE '%$p%'; 2: SELECT * FROM test1 WHERE col2 IN ('$p1', '$p2'); 3: SELECT * FROM test1 WHERE col2=somefunction('$p'); 4: UPDATE test1 SET col2='$p' WHERE col4='xxx'; 5: INSERT INTO test1 VALUES ('$p1', '$p2');
ä¾ãã°ä¸ã®1ã§ããå
ã®å¤ã' AND '1'='1
ããå
¥ããã¨ã以ä¸ã®ãããªSQLæãå®è¡ããã¾ãã
ãå ã®ã¯ã¨ãªã SELECT * FROM test1 WHERE col2 LIKE '%ãã¹ã%'; ãæä½ããã¯ã¨ãªã SELECT * FROM test1 WHERE col2 LIKE '%ãã¹ã' AND '1'='1%';
ä¸ã®ã¯ã¨ãªã¯SQLã¨ã©ã¼ã«ã¯ãªãã¾ããããå ã®ã¯ã¨ãªã¨ç価ãªãã®ã§ã¯ãªããªã£ã¦ãã¾ãã
ãã®ãããªã±ã¼ã¹ãå«ãã¦ãã¾ãæ©è½ãããæ¹æ³ã¨ãã¦ãæååé£çµæ¼ç®åã使ç¨ããæ¹æ³ãããã¾ãã
åèï¼Research
ãã ãæååé£çµæ¼ç®åã使ãæ¹æ³ã¯ãDBMSæ¯ã®æ§æã®éãã«ããæ¤æ»ã®ææ°ãå¢ãããã¡ãªãããããã¾ããThe Web Application Hacker's Handbook: Discovering and Exploiting Security Flaws ã«ã¯ã以ä¸ã®3種é¡ã®æååé£çµæ¼ç®åãè¼ã£ã¦ãã¾ãã
|| ⦠Oracle, DB2, Postgresç + ⦠SQL Server, Sybaseç ã¹ãã¼ã¹ ⦠MySQLï¼ããã©ã«ãè¨å®æï¼
MySQLã®å ´åãå³å¯ã«ã¯ãã¹ãã¼ã¹ã ãã§ã¯ãªãU+0009ãU+000Dã®ç©ºç½æåé¡ã¯æååé£çµã®å½¹å²ãæããã¾ãã((ã¾ãã以ä¸ã®ããã«ã空ç½æåé¡ã使ããªãæååé£çµæ¹æ³ãããã¾ããSELECT 'A'"B"'C';
âãABCããè¿ã))
ä½æãããã¼ã«ã§ã¯ããã®3種é¡ã®æ¼ç®åã«å¯¾å¿ããã·ã°ããã£ãããããä½ãã¾ãããä¾ãã°ããã¹ãã¼ã¹ãã®ã·ã°ããã£ã§ã¯ä»¥ä¸ã®æ¤æ»æååãéãã¾ãã
ã¤:ãå ã®å¤ã ⦠æ£å¸¸ ã:ãå ã®å¤ã'"\'"\ ⦠SQLã¨ã©ã¼ã«ãªã ã:ãå ã®å¤ã' ' ⦠æ£å¸¸ï¼ã¨çä¾¡ï¼ äº:ãå ã®å¤ã' '' ⦠SQLã¨ã©ã¼ã«ãªã ã:ãå ã®å¤ã'' ' ⦠SQLã¨ã©ã¼ã«ãªã
ãããã§ããããå®è¡ãããSQLã¯ã以ä¸ã®ããã«ãªãã¾ãã
ãï¼SELECT * FROM test1 WHERE col2='xxx' '' ãï¼SELECT * FROM test1 WHERE col2='xxx' ''' ãï¼SELECT * FROM test1 WHERE col2='xxx'' ''
ä»ã®ä¾ã¨åãããã¤â ãããâ ãããâ äºããâãã®å ´åã«ãèå¼±æ§æããã¨ãã¾ãã
ã¡ãªã¿ã«ãæååé£çµã¯é©ç¨ç¯å²ãåºãæ¹æ³ã§ããã常ã«ãã¾ãããã¨ã¯éãã¾ããã
ãå ã®ã¯ã¨ãªã ... WHERE foo='8'*60 ããã§æä½ããã¯ã¨ãªã ... WHERE foo='8'||''*60
æååé£çµæ¼ç®åã®åªå é ä½ãä½ãããã«ãä¸ã®æä½ããã¯ã¨ãªã¯SQLã¨ã©ã¼ã«ãªã£ãããå ã®ã¯ã¨ãªã¨ã¯ç価ã§ã¯ãªããã®ã«ãªã£ãããã¾ããä¾å¤çãªã±ã¼ã¹ã§ãããæååé£çµã·ã°ããã£ã®é©ç¨ãé£ããã±ã¼ã¹ãããã¨ãããã¨ã§ãã
D. æ´æ°ç³»ã¯ã¨ãª
ååæ å ±ã®å¤æ´æ©è½çã®ããã«ãæ´æ°ç³»ã®ã¯ã¨ãªï¼UPDATEãINSERTãDELETEæï¼ãçºè¡ãããæ©è½ãæ¤æ»ããããã®ã·ã°ããã£ã§ãã
æ´æ°ç³»ã®æ©è½ã®æ¤æ»ã¯ãåç §ç³»ã®æ©è½ã«æ¯ã¹ã¦é£ããã¨ãããããã¾ãããããæ´æ°ç³»ã®æ©è½ã§ãã£ã¦ããSQLã¨ã©ã¼ãçºçããã¨ãã«ç¹ç°ãªå¿çââSQLã¨ã©ã¼ã¡ãã»ã¼ã¸ãå¿çã«å«ã¾ãã¦ããããããã§ãªãã¦ãããã·ã¹ãã ã¨ã©ã¼ã§ããçã®ã¡ãã»ã¼ã¸ãã¹ãã¼ã¿ã¹500ãéä¸ã§åããHTMLãªã©ââãè¿ãå ´åã«ã¯ãã·ã°ããã£A,B,Cã§æ¤åºã§ãããã¨ãå¤ãã§ãã
åé¡ã¯ãã¢ããªãSQLã¨ã©ã¼ãå®å ¨ã«æ¡ãã¤ã¶ãã¦ãã¾ããSQLã¨ã©ã¼ãçºçããã«ããããããããã¼ã¿ãæ´æ°ãã¾ãããã®ãããªé常ã¨å ¨ãåãå¿çãè¿ãå ´åã§ãããã®ãããªå ´åã¯ã¨ã©ã¼ã®çºçãç¥ããã¨ãã§ããªããããã·ã°ããã£A,B,Cã§æ¤åºã§ãã¾ããã
ãã®ãããªé¢åãªã±ã¼ã¹ã«ã¤ãã¦ã¯æåã§æ¤æ»ããã¦ãããã®ã§ãããä¸å¿ããç¨ã®ã·ã°ããã£ãä½ã£ã¦ããã¾ããã
NNNNNN-1000/*q''XXXXXX\tq*/ â» NNNNNNã¯ã©ã³ãã ãªæ°å â» XXXXXXã¯ã©ã³ãã ãªè±æ°æåå
ããã¯ãåºæ¬çã«ãUPDATEæã®SETå¥ãINSERTæã®VALUESå¥ã«å¤ãæ¿å ¥ããããã¨ãæ³å®ããæ¤æ»æååã§ããæ°å¤ã¨æååã®ä¸¡æ¹ããã¾ã¨ãã¦ã²ã¨ã¤ã«ãã¦ãã¾ãã
ã¢ããªãèå¼±ã§ããã¨ãã¦ãæ°å¤é¨åã«ä¸è¨ã®æä½ããå¤ãæ¿å ¥ãããå ´åã¯ãDBã«NNNNNN-1000ã®æ¼ç®çµæãå«ãå¤ãæ ¼ç´ãããã¯ãã§ããã'ããã¨ã¹ã±ã¼ããããã«æååã«æ¿å ¥ãããå ´åã¯ãã''ããã'ãã«ãªãããã«ããq'XXXXXXããå«ãå¤ãDBã«æ ¼ç´ãããã¯ãã§ããMySQLãPostgresã§ã\ãã®ã¨ã¹ã±ã¼ãããããªãå ´åã¯ãã\tãã解éãããçµæãDBã«ãXXXXXX[TAB]qããå«ãæååãæ ¼ç´ãããã¯ãã§ãã
ãã¨ã¯æ ¼ç´ãããå¤ãå¼ãåºããã¨ãã§ããã°ãèå¼±æ§ã®æç¡ã確èªã§ãã¾ãã
ä¾ãã°ååæ å ±ã®å¤æ´æ©è½ã§ã¯ããã©ã¡ã¼ã¿ãæä½ããä¸ã§ååæ å ±å¤æ´ã®ããã®ãªã¯ã¨ã¹ããéããDBã«å¤ãæ ¼ç´ããã¾ãããã®å¾ã«ãã¼ã«ã¯ããã®ååæ å ±ãåç §ãããã¼ã¸ã«å¯¾ãã追å çãªãªã¯ã¨ã¹ããéãããã®å¿çã対象ã«ãã¦æ°å¤æ¼ç®ã®çµæããq'XXXXXXããªã©ãå«ã¾ãããã調ã¹ã¾ãããªããå¿çã調ã¹ãéã«ã¯ãã'ããä½ããã®ã¨ã³ã³ã¼ãããããããæ°å¤ãã«ã³ãåºåãã«ãªã£ã¦ããå¯è½æ§ãèæ ®ãã¾ãã
ãã ãããã®ã·ã°ããã£ã§æ´æ°ç³»æ©è½ã®SQLã¤ã³ã¸ã§ã¯ã·ã§ã³å ¨ã¦ãçºè¦ã§ããããã§ã¯ããã¾ããã以ä¸ã®ãããªå ´åã¯ããã®ã·ã°ããã£ã§ã¯æ¤æ»ã§ãã¾ããã
- ãã«ãã¦ã³ãã©ã¸ãªãã¿ã³ã§é¸æãããããªãã©ã¡ã¼ã¿
- UPDATEãDELETEæã®WHEREå¥ã«ã¤ã³ã¸ã§ã¯ã·ã§ã³å¯è½ãªã±ã¼ã¹
- ã«ã©ã ã®ãµã¤ãºããã¾ã大ãããªãå ´å
ãã®ãããªå¶éãããããã«ãå®éã®ã¨ãããæ´æ°ç³»ã®SQLã¤ã³ã¸ã§ã¯ã·ã§ã³æ¤æ»ã¯æåã«é ¼ãé¨åã大ããã§ãã
E.æåã³ã¼ãç³»
ä¾ãã°ãã¢ããªãUTF-8ã使ã£ã¦ããå ´åã«ã¯ã以ä¸ã®æ¤æ»æååãéãã¾ãã
ãå ã®å¤ã0[0xC2][0xA5]'0[0xC2]'0[0x00]'
ã¢ããªã使ç¨ããæåã³ã¼ãã«ãã£ã¦ãå¤å°ãã¿ã¼ã³ã¯å¤ããã¾ãã
æ¤æ»æååã«ã¯ã①U+00A5ï¼[0xC2][0xA5]ï¼ï¼ã'ãã②å端ãªãã¤ãï¼ã'ãã③NULLæåï¼ã'ããã®3ã¤ã®ãã¿ã¼ã³ãå ¥ãã¦ãã¾ãã
①ã¯ã主ã«MySQLã対象ã«ãSQLã¨ã©ã¼ãèµ·ãããã¨ãçã£ã¦ãã¾ãã
[0xC2][0xA5]' â ã¢ããªãã'ããã\'ãã«ã¨ã¹ã±ã¼ã [0xC2][0xA5]\' â U+00A5ãã\ãã«å¤æããã \\' â æ«å°¾ã®ã'ããä½ã SQLã¨ã©ã¼
②ã¯ãæåã³ã¼ããã¢ããªã®ã¨ã¹ã±ã¼ãæ¹å¼ãDBMSã®ãã¼ã¸ã§ã³ã«ãããã¾ãããæ®ã©å ¨ã¦ã®DBMSï¼PostgresãMySQLãSQL ServerãOracleãDB2ï¼ã対象ã«ãã¦ãã¾ãã③ã®NULLæåã¯ãä¸é¨ã®DBMS/Driverããããã¯PHPã®ãã¤ããªã»ã¼ãã§ãªãé¢æ°ãçã£ã¦ãã¾ãã
ãã®æã®èå¼±æ§ã«ã¤ãã¦ã¯ãä¸é¨ãé¤ãã¦Blindçãªææ³ãé©ç¨ãã¥ãããããåç´ã«ã¬ã¹ãã³ã¹ã«SQLã¨ã©ã¼ã¡ãã»ã¼ã¸ããããã®ãå«ã¾ãã¦ããå ´åã«ãèå¼±æ§æããã¨å¤å®ãã¦ãã¾ãã
ãªããå®éã«ã¯ãæåã³ã¼ãç³»ã®SQLã¤ã³ã¸ã§ã¯ã·ã§ã³ã®èå¼±ãæã¤ã¢ããªã¯çããã§ããã¾ããä»®ã«èå¼±æ§ããããªãã°ãç¹å®ã®ãã©ã¡ã¼ã¿ã§ã¯ãªããWebãµã¤ãã®å¤§åã®æ©è½ã«èå¼±æ§ãããå¯è½æ§ãé«ãã§ãããããã£ã¦ãæ¬æ¥ã¯ãµã³ããªã³ã°ãã¦æåæ¤æ»ããã°ååã§ãããæåãªãã°ã¢ããªã«åããé«ã精度ã®æ¤æ»ãå¯è½ã§ãã®ã§ï¼ä¾ãã°ãBlindææ³ã使ããªã©ï¼ãåºæ¬çã«ã¯æåã§ç¢ºãããã¹ãã§ãããã
ãã®ä»ï¼SQLã¨ã©ã¼ãå¼ãåºã
SQLã¤ã³ã¸ã§ã¯ã·ã§ã³é¢é£ã®ã·ã°ããã£ã¯ããä¸ã¤ããã¾ãããã ããSQLã¤ã³ã¸ã§ã¯ã·ã§ã³ã®æ¤åºãç®çã¨ãããã®ã§ã¯ãªããSQLã¨ã©ã¼ãèµ·ããã¦DBMSã®ç¨®é¡ãªã©ã®æ å ±ãå¼ãåºãããã®ãã®ã§ãã
ãå ã®å¤ã9999999999...ï¼9ã8001åï¼
POSTãã©ã¡ã¼ã¿ã®ãå ã®å¤ãã®å¾ãã«ã9ãã8001åä»ããå¤ãéãã¾ãã
å°ãè£è¶³ããã¨ãDBMSã®ä¸ã«ã¯ãæååãªãã©ã«ã®æ大é·ã®å¶éãåå¨ãããã®ãããã¾ããä¾ãã°ãOracleã®æååãªãã©ã«ã¯4000æåãSQL Serverã¯8000æåã¨ããä¸éãããã¾ãã
æååãªãã©ã«é·ã®å¶éã¯ãåã ã®ã«ã©ã ã«è¨å®ããé·ãå¶ç´ã¨ã¯å¥ã®ãã®ã§ãã
ä¾ãã°ãOracleã§ãVARCHAR2(5)ãã§å®ç¾©ããã«ã©ã ãfooãããã£ãã¨ãã¾ãã
1: SELECT * FROM test1 WHERE foo='123456789A' 2: SELECT * FROM test1 WHERE foo='123...ï¼4001æåï¼'
ä¸ã®10æåã®æååãªãã©ã«ãå«ãã¯ã¨ãªã¯ãã«ã©ã ãfooãã®ãµã¤ãºï¼5Byteï¼ã¯ãªã¼ãã¼ãã¦ãã¾ãããSQLã¨ã©ã¼ã«ã¯ãªãã¾ãããä¸æ¹ãä¸ã®4000æåãè¶ããæååãªãã©ã«ãå«ãã¯ã¨ãªã¯ããORA-01704: æååãªãã©ã«ãé·ããã¾ããããçºçããã¾ãã
ãã®ãããªç¾è±¡ã¯ãã¢ããªãPrepared Statementã使ç¨ãã¦ããã¨ãã¦ãçºçããããã®ã§ãããã¤ã³ãããé·ãå¤ã«å¯¾ãã¦ãVARCHARåã«ã©ã ã¨ã®æ¯è¼ãªã©ãè¡ãªãã¨ãORA-01460: è¦æ±ãããå¤æã¯ã§ãã¾ãããããçºçãã¾ãã
SQL Serverã«ã¤ãã¦ã¯ããã¼ã¸ã§ã³ã«ãã£ã¦æåãéãããã§ããSQL Server 2000ã§ã¯8000æåã®å¶éãããã¾ããSQL Server 2005ã§ã¯ãåç´ã«æååãªãã©ã«ã¨ãã¦8000æåãè¶ ãããã®ãæ£å¸¸ã«æ±ãã¾ãããLIKEæ¼ç®åã®å³é ã®æååã8000æåãè¶ ããå ´åã«ã¯SQLã¨ã©ã¼ã«ãªãã¾ãã
DB2ã§ã¯ãæååãªãã©ã«ã32672æåãè¶ ããã¨SQLã¨ã©ã¼ã«ãªãã¾ãããã ãã32KBè¿ãã®ãã¼ã¿ãéãã®ã«ã¯æéãæããå ´åããããã¨ã¨ãDB2ã®ãµã¤ãã«ä½ãåºä¼ããã¨ããªãã®ã§ããã®ã·ã°ããã£ã§ã¯DB2ãç¡è¦ãã¦8001æåã¨ãã¾ããã
ãªããæååã ãã§ãªããOracleãSQL ServerãDB2ã«ã¯ãæ°å¤ãªãã©ã«ã«ã¤ãã¦ãå¶éããããå¶éãè¶ããé·ãã®æ°å¤ãä¸ããã¨SQLã¨ã©ã¼ãçºçãã¾ãã
ä¸è¬ã«ããã¼ã¿ãã¼ã¹ã«ç»é²ãããã¼ã¿ã«é¢ãã¦ã¯ãã¢ããªã§äºåã«ãã¼ã¿ã®é·ããªã©ã®ãã§ãã¯ãè¡ãªããã¨ãå¤ãã§ããããããåç §ç³»ã®ã¯ã¨ãªã«æ¸¡ããã©ã¡ã¼ã¿ã«é¢ãã¦ã¯ãé·ãã®ãã§ãã¯ãè¡ãªã£ã¦ããªãã¢ããªãå¤ããããé·ãæååãä¸ãããã¨ã§SQLã¨ã©ã¼ãå¼ãèµ·ãããå ´åãããã¾ãã
å¤å®ã¯ãSQLã¨ã©ã¼ã¡ãã»ã¼ã¸ãå¿çã«å«ã¾ããå ´åã¯ãè¦æ³¨æãã¨ãã¾ãããã®å ´åã¯DBMSã®ç¨®é¡ãç¥ããã¨ãã§ãã¾ããããã§ãªãã¦ãé·ãæååãä¸ãã¦ç¹ç°ãªå¿çãè¿ãå ´åã«ã¯ãDBMS種é¡ãæ¨æ¸¬ããææããã«ãªãã¾ãããã¨ã©ã¼çºçæã«ã¢ããªãã©ã®ãããªæåã示ãããç¥ããã¨ãã§ãã¾ãï¼ãã ããçºçããã®ã¯SQLã¨ã©ã¼ã¨ã¯éãã¾ããï¼ã
念ã®ããæ¸ãã¾ããããã®æ¹æ³ã§SQLã¨ã©ã¼ã¡ãã»ã¼ã¸ãè¿ããã¨ã¨ãSQLã¤ã³ã¸ã§ã¯ã·ã§ã³ã®èå¼±æ§ããããã¨ã¯ãå¥ã®è©±ã§ããä¸é¨ã®DBã§ã¯ãPrepared Statementããç¹æ®æåã®ã¨ã¹ã±ã¼ããå ¥åå¤ã®æå種é¡ãã§ãã¯ãªã©ã®å¯¾çãè¡ãªã£ã¦ããã¨ãã¦ãããã®æ¹æ³ã§SQLã¨ã©ã¼ãçºçããããã¾ãã
æ¤æ»ã®å±éºæ§
UPDATEæãDELETEæã¸ã®ã¤ã³ã¸ã§ã¯ã·ã§ã³ãå¯è½ãªå ´åããOR 1=1ãç³»ã®æ¹æ³ãã--ããªã©ã使ã£ã¦éä¸ã§ã¯ã¨ãªãçµäºãããæ¤æ»æ¹æ³ã使ç¨ããã¨ããã¼ã¿ãå£ãå¯è½æ§ãããã¾ãã
UPDATE test1 SET col2='';waitfor delay '0:0:15'--' WHERE ...
ä¸ã®ä¾ã¯ã--ããå«ãå¤ãä¸ãã¦ãã¾ãããã®çµæãWHEREå¥ãã³ã¡ã³ãã¢ã¦ããããtest1ãã¼ãã«ã®å ¨ã¬ã³ã¼ãã®col2ã«ã©ã ã®å¤ãæ´æ°ããã¦ãã¾ãã¾ãã
å®éã®æ¤æ»ã§ã¯ããã®ãããªãOR 1=1ããã--ãã®ææ³ã使ããã¨ãããã¾ããã人éãã¢ããªããã©ã¡ã¼ã¿ãæ éã«é¸ã¶ã®ã使ç¨ã®åæã«ãªãã¾ãããããã£ã¦ããã¼ã«ã«ã¯ãã®ãããªãã¿ã¼ã³ã¯å ¥ãã¾ããã§ããã
ããããããã§ããã®ãã¼ã«ã§ä½¿ã£ã¦ããææ³ã100%å®å ¨ãªã®ãã¨ããã¨ããã§ãããã¾ããããã®ãã¼ã«ã§ããã¤ãå±éºãªå ´åã¨ããã®ã¯èããããã®ã§ããããã®ä¸ã§ãæ¯è¼çå±éºæ§ãé«ãã®ã¯ããC. Blind æåååãã®æååé£çµããMySQLç°å¢ã«å¯¾ãã¦ä½¿ç¨ããå ´åã ã¨æãã¾ãã
åè¿°ã®ããã«ãæååé£çµæ¼ç®åã¯DBã®ç¨®é¡ã«ãã£ã¦ç°ãªã£ã¦ãã¾ããMySQLã§ã¯ã¹ãã¼ã¹ãªã©ãé£çµã«ä½¿ç¨ãããã¨ãã§ãã¾ãããã||ããã+ãã¯æååé£çµã¨ã¯å¥ã®æ¼ç®åã¨ãã¦è§£éããã¦ãã¾ãã¾ãã
以ä¸ã«ããã¤ãä¾ãæãã¾ãã
mysql> SELECT * FROM product WHERE name='tomato'+''; +----+-----------+--------+-------+ | no | category | name | price | +----+-----------+--------+-------+ | 0 | vegetable | tomato | 100 | | 1 | vegetable | carot | 80 | | 2 | fruit | orange | 200 | | 3 | fruit | apple | 300 | +----+-----------+--------+-------+ 4 rows in set, 8 warnings (0.00 sec)
ããã§ä½¿ã£ã¦ããproductãã¼ãã«ã«ã¯ãå ¨é¨ã§4ã¤ã®ã¬ã³ã¼ããç»é²ããã¦ãã¾ããä¸ã®SQLã§ã¯ãproductãã¼ãã«ãããnameããtomatoãã®ãã¼ã¿ãSELECTãã¦ããï¼ã¤ããï¼ã§ããããã以å¤ã®ã¬ã³ã¼ããæ½åºããã¦ãã¾ãã
mysql> SELECT * FROM product WHERE category='fruit'||'' AND name='apple'; +----+----------+--------+-------+ | no | category | name | price | +----+----------+--------+-------+ | 2 | fruit | orange | 200 | | 3 | fruit | apple | 300 | +----+----------+--------+-------+ 2 rows in set, 1 warning (0.00 sec)
ãã¡ãã®ã±ã¼ã¹ã§ã¯ãã||ã以éã®æ¡ä»¶ãå®è³ªçã«ç¡è¦ããã¦ãã¾ãã
ãããã®ã±ã¼ã¹ããUPDATEæãDELETEæã§åæ§ã®ç¾è±¡ãçºçããã¨ãæå³ããªããã¼ã¿ã®å¤æ´ãåé¤ãè¡ãªãããå¯è½æ§ãããã¾ãã
MySQLã«éãããäºåã«DBMSã®ç¨®é¡ãå¤ã£ã¦ããå ´åã¯ããã®ã½ããã«ãã£ãæ¤æ»æååã®ã¿ã使ç¨ããæ¹ãå®å ¨ã§ããããã«ããã®æ¹ãå¹ççã«æ¤æ»ã§ãã¾ãã
ã¾ããæ°ã¯å°ãªãã¨æãã¾ãããSQLã¨ã©ã¼ãçºçããæã«DBã®ã³ãã¯ã·ã§ã³ãéæ¾ããªããããªãã°ãããã¢ããªã«å¯¾ãã¦æ¤æ»ãè¡ãªãã¨ãã'ããå«ããã¿ã¼ã³ãç¹°ãè¿ã試ãã ãã§ã³ãã¯ã·ã§ã³ãæ¯æ¸ãã¦ãµã¼ãã¹ãå©ç¨ã§ããªããªããªã¹ã¯ãããã¾ãã
æå¾ã«
æãã¤ããã¨ããããã¤ãæ¸ãã¾ãã
å®è£ ãããã¨æã£ã¦ãã¦å®è£ ãã¦ããªãã®ããèå¼±æ§æ¤åºå¾ã®exploitå·¥ç¨ãæ¯æ´ããæ©è½ã§ããã¤ã¾ããDBMSã®ç¨®é¡ã®ç¹å®ããDBå ã®ãã¼ã¿æ½åºãªã©ãããæ©è½ã§ããåç¨ãã¼ã«ã«ã¯ããã®è¾ºãã®æ©è½ãä»ãã¦ãããã®ãããã¾ãã
ãã¼ã«ã§DB種é¡ã®ç¹å®ãããã¾ã§è¸ã¿è¾¼ãã§ããã¨ãæ¤åºã®ç²¾åº¦ãå¤å°ä¸ããï¼èª¤æ¤åºãæ¸ãããï¼ãã¨ã«ãã¤ãªããããªãã¨ããææãããã¾ããã¨ããã®ããç¾ç¶ã®ãã¼ã«ã§ã¯ãæ¤åºããããã®ã®ååç¨åº¦ã¯èª¤æ¤åºã§ããç¹ã«ãæåãä¸å®å®ãªã¢ããªã«å¯¾ãã¦Blindç³»ã®ã·ã°ããã£ã§æ¤æ»ãè¡ãªãã¨ã誤æ¤åºãçºçãããããªãã¾ãï¼åæã«æ¤åºæ¼ããå¢ãã¾ãï¼ã
ãããããBlindç³»ã®æ¤åºã®ç²¾åº¦ã¯ããå¿çã«ææãªå·®ããããããå¤å®ãããã¸ãã¯ã«ããªãå·¦å³ããã¾ããããã®ãã¸ãã¯ã¯ãªããªãé£ããã§ãã
å·®ãããããå¤æããéã®æ度ãä¸ãããã¦ãã¾ãã¨ãæ¤åºæ¼ããå¢ãã¾ããæ度ãä¸ãããã¦ãã¾ãã¨ãã©ã³ãã ã«ããã¹ãåºåãå·®ãè¾¼ããããªãã¼ã¸ããæä½ãããã©ã¡ã¼ã¿ãä½ç®æã«ãã¨ã³ã¼ããã¯ããããã¼ã¸ãã¯ã³ã¿ã¤ã ãã¼ã¯ã³ãåãè¾¼ã¾ãããã¼ã¸ãªã©ã§ãæ¤åºæ¼ãã誤æ¤åºãå¢ãã¾ãã
ããã«ãã¸ãã¯ãä½ãã®ãé£ãããã¦ããã®ã¯ãå¿çã®å½¢å¼ããµã¤ãºãæ§ã ã§ãããã¨ã§ããä¾ãã°ãå¿çã¯ãHTMLã§ã¯ãªãCSVãJSONããã¤ããªãã¼ã¿ã§ãããã¨ãããã¾ããå¿çã®ãµã¤ãºããé常ã«é·ãå ´åãçãå ´åãããã¾ããã¾ããæ°ãããã¤ãã®ãã¼ã¿ããã£ã1è¡ã§è¿ã£ã¦ãããããªãã¨ãããã¾ãã
ç¾ç¶ã®ãã¼ã«ã§ã¯ãã¹ãã¼ã¿ã¹ã³ã¼ãã¨ãå¿çå ¨ä½ã®é·ãã»è¡æ°ã¨ãä¸é¨ã®è¨å·ã®åºç¾æ°ããã¨ã«ãææãªå·®ãããããå¤å®ãã¦ãã¾ãããã®ãã¸ãã¯ã§ã¯ãã¾ãå·®ãæ¾ããªããã¨ããããããæ¹åã®ä½å°ãããããªã¨æãã¾ãã
æå¾ã«ãã¡ãã£ã¨è©±ã¯å¤ããã¾ãããæ¤æ»å¯¾è±¡ã¨ãã¦èæ ®ãã¹ãDBMSã®ç¨®é¡ã«ã¤ãã¦ã§ãããããèããä¸ã§ã¯ãDBMSã®ã·ã§ã¢ã«é¢ããæ å ±ãåèã«ãªãã¾ãã
http://www.mysql.com/why-mysql/marketshare/
ä¸ã®MySQLã®ãã¼ã¸ã«è¼ã£ã¦ããæåã®ã°ã©ããè¦ãã¨ãMySQLãAccess/SQL ServerãOracleãDB2ã®é çªã«ãªã£ã¦ãã¾ãããã®ãã¼ã«ã§ã¯ãOracleãSQL ServerãMySQLãPostgresãDB2ã主ãªå¯¾è±¡ã¨ãã¦èæ ®ãã¦ãã¾ãã