SQL injection이란? (기본편)

2023. 12. 3. 23:22보안, 해킹/웹

SQL이란?

SQL은 Structured Query Language의 약자로, 데이터베이스(특히 관계형 데이터베이스)에서 데이터를 추출하고 조작하는 데에 사용하는 데이터 관리 언어다. 기본적으로 명령(query)을 전달하면, 데이터베이스가 동작을 수행하는 형태다. SQL을 통해 이루어지는 데이터베이스의 동작은 일반적으로 CRUD라고 칭하는 것들이다. 각각 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 의미한다.

SQL injection이란?

SQL injection이란, 서비스가 데이터베이스를 조작하는 부분에 공격자가 임의의 SQL 쿼리를 삽입하여 악의적인 동작을 수행하는 공격이다.

 

이렇게만 설명하면 부족한 점이 많을 것이니 예를 들자면

 

웹 서비스를 포함한 상당히 많은 어플리케이션은 데이터를 서버의 데이터베이스에 저장한다. 그렇다는건, 이러한 데이터베이스의 데이터를 읽고 조작할 때에도 SQL이 사용된다는 의미다.

가령 새로운 회원정보를 불러온다고 하면, 다음과 같은 쿼리를 사용할 것이다.

SELECT * FROM users_table WHERE username='example';

이 쿼리는 users_table이라는 테이블에서 username이 'example'인 데이터의 모든 column을 불러오겠다는 뜻이다. 이 쿼리가 실행될 경우 해당 데이터가 쿼리의 결과값으로 출력이 된다. 그리고 몇몇 기능에서는 이 과정에서 사용자의 입력값을 받아 처리한다.

 

SQL injection은 이러한 입력값 부분에 SQL 구문을 삽입한다. 위의 예시에서 username의 입력값을 받는 부분에 abc'; DROP TABLE users_table;-- 이라는 입력값을 넣을 수 있다고 가정한다면 전체 쿼리는 이러한 형태가 될 것이다.

SELECT * FROM users_table WHERE username='abc'; DROP TABLE users_table;--';

이 쿼리는 users_table이라는 테이블에서 username이 'abc'인 데이터의 모든 column을 불러오고, 이후 users_table이라는 테이블을 날려버리겠다는 뜻이다. 만약 서비스중인 어플리케이셩에서 이와 같은 쿼리가 실행될 경우 저장되어 있는 모든 회원정보가 날아가는 대참사가 발생한다.

 

SQL injection은 이처럼 공격자가 어떤 쿼리를 삽입하느냐에 따라 데이터의 생성, 읽기, 갱신, 삭제 등의 동작을 모두 수행할 수 있다. SQL injection에 대한 방어가 일체 없다고 가정하면, SQL injection이 가능하다는 것은 시스템에서 쉘(shell)을 습득한 것과 유사한 상황이다. 그만큼 위험한 공격이다.