SQL 삽입

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

SQL 삽입(영어: SQL Injection, SQL 인젝션, SQL 주입)은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 개발자가 생각지 못한 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법이다.

[편집]

다음과 같이 사용자의 아이디와 비밀번호를 확인하고 일치하면 로그인을 하는 PHP 프로그램이 있다고 하자.

$result = mysql_query("SELECT * FROM member WHERE ID='$id' AND PW='$pw'");
if(mysql_num_rows($result))
{
 // 로그인 성공
}
else
{
 // 사용자의 아이디와 비밀번호가 틀리므로 로그인 실패
}

일반적인 경우에 위 코드가 어떻게 동작할 지 예상할 수 있을 것이다.

하지만 $id에 '' OR '1'='1' --와 같은 값이 들어간다고 하면 SQL 쿼리문은 아래와 같이 된다.

SELECT * FROM member WHERE ID='' OR '1'='1' -- AND PW='$pw'

결과적으로 무조건 로그인이 성공하게 된다.

이를 해결하는 방법은 다음과 같이 $id$pwSQL에 맞게 인코딩 하면 된다.

$id = mysql_real_escape_string($id);
$pw = mysql_real_escape_string($pw);
$result = mysql_query("SELECT * FROM member WHERE ID='$id' AND PW='$pw'");
if(mysql_num_rows($result))
{
 // 로그인 성공.
}
else
{
 // 사용자의 아이디와 비밀번호가 틀리므로 로그인 실패
}

이제 $id$pw에 어떤 값이 들어가도 아무 문제가 발생하지 않게 된다.

Blind SQL 삽입[편집]

Blind SQL 삽입은 평범한 SQL 삽입과 같이 원하는 데이터를 가져올 쿼리를 삽입하는 기술이다. 이것은 웹에서 SQL 삽입에 취약하나 데이터베이스 메시지가 공격자에게 보이지 않을 때 사용한다. 하지만 평범한 SQL 삽입과 다른점은 평범한 SQL 삽입은 쿼리를 삽입하여 원하는 데이터를 한번에 얻어낼 수 있는 데에 비해 Blind SQL 삽입은 참과 거짓, 쿼리가 참일때와 거짓일 때의 서버의 반응 만으로 데이터를 얻어내는 기술이다. 즉, 쿼리를 삽입하였을 때, 쿼리의 참과 거짓에 대한 반응을 구분할 수 있을때에 사용되는 기술이다. Blind SQL 삽입은 위 두 함수를 이용하여 쿼리의 결과를 얻어, 한글자씩 끊어온 값을 아스키코드로 변환시키고 임의의 숫자와 비교하여 참과 거짓을 비교하는 과정을 거쳐가며 계속 질의를 보내어 일치하는 아스키코드를 찾아낸다. 그러한 과정을 반복하여 결과들을 조합하여 원하는 정보를 얻어냄으로써 공격을 이루어지게 한다. 많은 비교과정이 필요하기 때문에 악의적인 목적을 가진 크래커들은 Blind SQL 삽입 공격을 시도할때에 자동화된 툴을 사용하여 공격한다. 취약점이 발견된다면 순식간에 많은 정보들이 변조되거나 크래커의 손에 넘어가게 된다.[1]

같이 보기[편집]

각주[편집]

  1. “Using SQLBrute to brute force data from a blind SQL injection point”. Justin Clarke. 2008년 6월 14일에 원본 문서에서 보존된 문서. 2008년 10월 18일에 확인함. 

바깥 고리[편집]