
1) SQL Injection 이란?
SQL Injection: WAS와 데이터베이스 사이의 미리 정의된 SQL 쿼리 구문에, 공격자가 원하는 임의의 SQL 구문을 삽입하는 공격
2. SQL i의 동작원리
그렇다면 SQL i가 어떻게 동작하게 되는지 로그인 페이지를 예를 들어 살펴보자.
로그인 페이지와 정의된 SQL 쿼리 구문은 다음과 같다.
| 로그인 페이지 | 실행되는 SQL 쿼리 |
|---|---|
![]() | select * from users where id='' and password='' |
| 로그인 페이지를 통해 id와 비밀번호를 입력받게 된다. | id와 비밀번호를 입력받는 경우 실행되는 쿼리이다. |
사용자가 아이디 · 비밀번호를 입력하게 되면, 그 값이 미리 정의된 SQL 쿼리 안의 지정된 위치로 들어가게 된다.
| 아이디(spike), 비밀번호(ilovejulia) 입력 | 입력된 값을 정의된 SQl쿼리에 대입 |
|---|---|
![]() | ![]() |
최종적으로 아래와 같은 SQL 구문이 완성되며, 쿼리의 결과값 존재 여부에 따라 로그인이 수행되게 된다.
select * from users where id='spikie' and password='ilovejulia'
여기까지는 정상적인 로그인의 과정이다.
그러나 사용자가 입력한 값이 그대로 SQL 쿼리문에 대입되고 있다.
따라서, 공격자는 데이터에 SQL 구문을 포함시켜 입력하게 된다.
| 아이디 값에 SQL 구문을 포함시켜 입력 | SQL구문이 포함된 값이 파라미터로 전달 |
|---|---|
![]() | ![]() |
이렇게 입력된 값이 미리 정의된 SQL 쿼리 부분에 대입되어 실행되게 된다.
| 전달받은 데이터가 정의된 SQL쿼리에 대입된다. | 실행결과, admin으로 로그인이 되었다. |
|---|---|
![]() | ![]() |
그렇다면, ID에 입력한 값이 어떻게 처리되었길래 어드민 계정으로 로그인이 된걸까?
위에서 완성된 쿼리를 다시한번 적어보면 다음과 같다.
select * from users where id='admin or '1'='1' and password='@@@'
연산자의 우선순위를 고려하여 계산하면 다음과 같은 순서로 연산이 수행된다.
![]() |
|---|
| 1. 연산 우선순위가 높은 and가 먼저 수행되며, 즉 조건2 와 조건3이 먼저 AND 연산처리된다. |
| 2. 조건2('1'='1')는 참, 조건3(비밀번호 아무거나)은 거짓이 되어 AND연산 결과, 거짓이 된다. |
| 3. 그 다음 연산 우선순위인 or 가 수행된다. 따라서, 앞서 AND의 연산결과인 '거짓' 과 조건1을 or 연산하게 된다. |
| 4. 같이 연산되는 값의 참/거짓 유무에 상관없이, id가 admin인 데이터가 DB에 존재하므로 최종적으로 참이되어 admin으로 로그인된다. |
이렇듯 SQL Injection은, 공격자가 실행되기 원하는 SQL 구문을 삽입하여 발생되며 이 목적에 따라 데이터 추출, 인증 우회, 데이터 변조 등이 발생하게 된다.