아래 쿼리와 Watch 창에서 Injection되는 SQL을 보면 쉽게 이해 할 수 있다.
1. UI에서 Strssearch arg을 받아서 Grid에 보여주는 함수
private void Show_Data(String strssearch) { string connectionName = "MYSTRING"; ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings[connectionName]; if (cs == null) throw new ConfigurationErrorsException("Invalid connection name \"" + connectionName + "\""); factory = DbProviderFactories.GetFactory(cs.ProviderName); using (DbConnection conn = factory.CreateConnection()) { if (conn == null) throw new Exception("Could not obtain connection from factory"); conn.ConnectionString = cs.ConnectionString; conn.Open(); String query = ""; query += " select * "; query += " from ARDOCUMENT "; if (!string.IsNullOrEmpty(strssearch)) { query += " where DOCUTYPE = '" + strssearch + "'"; } query += " order by CUSTOMERNAME "; DbCommand cmd = factory.CreateCommand(); cmd.Connection = conn; cmd.CommandText = query; DbDataReader reader = null; try { reader = cmd.ExecuteReader(); GridView1.DataSource = reader; GridView1.DataBind(); } catch (Exception ex) { string ExMsg = ex.Message; } finally { reader.Close(); } } }
2. UI에서 TXT를 입력을 하면 여러 row의 값을 가져와 보여준다.
아래 사진과 같이 SQL문이 만들어 진다.
3. 만약 'TXT' OR '1' = '1를 입력하게 된다면 어떤 일이 일어날까?
OR '1' = '1 의 Sql 문이 injection 이 된 것을 확인 할 수 있다.
결과는 TXT 이 외의 table의 모든 값을 가져오게 된다.
site : Injection Attacks by Example
http://www.unixwiz.net/techtips/sql-injection.html
injetion을 막는 방법을 소개하는 site
http://www.mikesdotnetting.com/Article/113/Preventing-SQL-Injection-in-ASP.NET