본문 바로가기
보안

SQL Injection 이란? - (2)

qbang 2018. 4. 30.

동작원리 이해

SQL : Microsoft SQL Server, Oracle, MySQL, Sybase, and Informix 등의 데이터베이스 서버에 접근하기 위한 표준언어

SQL Injection 취약점은 대부분 웹 개발자가 개발할 때 웹 폼, 쿠키, 입력 파라미터 등 사용자로부터 값을 입력받아 데이터베이스에 전달할 때 입력 값에 대해 검증을 하지 않아 발생

(1) 동적구문생성

동적구문생성은 개발자들이 SQL 구문을 동적으로 프로그램 실행 과정에서 생성하는 프로그래밍 방식이다. 동적 SQL구문은 실행과정에서 구문을 생성하기 때문에 각각의 다른 조건들로 다른 SQL 구문을 생성한다.

반면 개발자들이 파라미터를 사용한 쿼리를 이용한다면 좀 더 보안적인 효과를 이룰 수 있다. 파라미터를 사용한 쿼리는 SQL 구문에 하나 또는 그 이상의 내장된 파라미터(일반사용자에게는 노출하지않고 코드 상에 파라미터를 내장해 사용하는 방식)를 갖는 쿼리. 파라미터들은 실행 과정에서 쿼리로 전달되지만 내장된 파라미터는 사용자의 입력값이 실행 명령으로 변환되지 않기 때문에 코드가 조작될 일은 없을 것이다.

다음의 PHP 코드는 개발자가 어떻게 사용자 입력 값을 SQL 구문으로 생성하는지 보여준다.

  // PHP 환경에서 동적으로 SQL 구문을 생성 

 $query = "SELECT * FROM table WHERE field = '$_GET["input"]'";

  // .NET 환경에서 동적으로 SQL 구문을 생성

 query = "SELECT * FROM table WHERE field = '" + request.getParameter("input") + "'"; 

이렇게 동적으로 SQL 구문을 생성하는 것과 관련한 이슈 중 한가지는 입력 값을 전달하기 전에 코드에 대해 검증 또는 인코딩이 없다면 공격자는 다음처럼 어플리케이션 입력 값에 SQL 구문을 입력 할 수 있고, 그 SQL 구문을 데이터베이스에 전달 및 실행시킬 수도 있음


부적절한 특수 문자 처리

SQL 데이터베이스는 싱글쿼터(')를 코드와 데이터를 구분하는 식별자로 사용하는데 웹페이지나 어플리케이션의 입력 값 또는 URL에 싱글쿼터를 넣어보면 SQL Injection에 취약한지 여부를 알 수 있다.

  // 동적으로 SQL 구문을 생성

 $SQL = "SELECT * FROM table WHERE field = '$_GET["input"]'";

  // SQL 구문 실행

 $result = mysql_query($SQL);

  // 데이터베이스에서 반환되는 레코드 수를 체크

 $rowcount = mysql_num_rows($result);

 // 반환된 레코드 수만큼 반복 실행

 $row = 1;

 while ($db_field = mysql_fetch_assoc($result)){

      if ($row <= $rowcount){

          print $db_field[$row] . "<BR>";

          $row++;

      }

만약 어플리케이션 입력 값에 싱글쿼터를 입력한다면 다음 에러 중 한가지를 보게된다.

 Warning : mysql_fetch_assoc()  : supplied argument is not a valid MYSQL result resource 

 You have an error in your SQL syntax; check the manual that corresponds to your MYSQL server version for the right syntax to use   near ''VALUE''' 

에러가 발생하는 이유는 싱글쿼터가 입력 값의 구분으로 해석되었기 때문이다.





'보안' 카테고리의 다른 글

Chapter 05. 정보 수집  (0) 2019.02.27
Chapter 04. 버프 수트  (0) 2019.02.26
Chapter 02. 웹 보안  (0) 2019.02.26
Chapter 01. 웹과 HTTP 기초  (0) 2019.02.25
SQL Injection 이란? - (1)  (1) 2018.04.27

댓글