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 삽입[편집]

이 문단의 내용출처가 분명하지 않습니다. 지금 바로 이 문단을 편집하여, 참고하신 문헌이나 신뢰할 수 있는 출처를 주석 등으로 표기해 주세요. 검증되지 않은 내용은 삭제될 수도 있습니다. 내용에 대한 의견이 있으시다면 토론 문서에서 나누어 주세요. (2013년 12월 2일에 문단의 출처가 요청되었습니다.)

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