SQL Injection

DATE : 2023/11/24

What is SQL?

SQL injection이 무엇인지 알아보기 전, SQL의 개념에 대해서 한 번 더 정리하고 넘어가도록 하자.

Server 측의 구조를 보면 크게

WEB SERVER <-> WEB APPLICATION SERVER <-> DATABASE

정적 페이지를 담당하는 WEB server와 동적 페이지를 담당하는 WAS가 있고

요청을 처리하는 과정에서 필요한 데이터를 넣어두는 DB가 존재한다.

이때 DB에서는 데이터를 조회, 저장, 삭제, 수정하는 등의 기능이 수행되는 데

각각의 기능을 실행하기 위해서는 DB가 알아들을 수 있는 언어로 말을 걸어야 한다.

DB가 알아들을 수 있는 언어, 즉 DB에게 명령을 내릴 때 사용하는 언어SQL이라 부른다.

SQL은 Structured Query Language의 약자로,

흔히 표와 같은 형태의 관계형 DB와 소통할 때 사용하는 언어이다.

SQL도 하나의 언어이기 때문에 지켜야 하는 문법이 존재하고,

어떤 DB를 사용하느냐에 따라 그 내용이 조금씩 달라질 수 있다.

What is SQL Injection?

SQL은 DB에게 말을 걸 때 사용하는 언어라고 정의했다.

이 말은 DB와 소통하는 서버, WAS가 DB에게 어떤 동작을 요구할 때 SQL을 사용한다는 의미이다.

예를 들어 사용자가 로그인 할 때, 자신의 credential을 입력하면

이 요청을 받은 서버는 DB에게 "야, 이 Username이 있는 지 확인해봐!" 라고 명령을 내릴 것이다.

이때 DB에게 명령하는 SQL은 PHP와 같은 코드 내에 이미 작성되어 있는 구문이다.

"이미 작성되어 있는 구문"이라 함은 사용자가 어떤 값을 넣어 요청을 보내든

실행되는 SQL의 내용은 동일하다는 뜻이다.

그렇다면 만약, 서버에서 명령하는 SQL이 어떤 형태인지 예측할 수 있다면 어떤 일이 일어날 수 있을까??


공격자 hanhxx는 "자신의 아이디를 입력하면 해당 회원의 정보를 보여주는 서비스"에 관심을 갖게 되었다.

예를 들어 "hanhxx" 라고 입력하면

username : hanhxx
password : hanhxx1234
birth : 10/19
age: 23
gender: female

다음과 같이 비밀번호까지 포함된 정보가 출력 되는 것이었다..! 🙀

결국 공격자 hanhxx는... 회원 정보를 모두 털기로 마음 먹었다.

"Username을 입력하면 회원과 관련된 모든 정보가 출력된다"는 결과를 보고 hanhxx는

SELECT * from member WHERE username='___'

와 같은 형태의 SQL이 실행될 거라 추측하였다.

그렇다면 어떻게 값을 입력해야 모든 회원의 정보를 얻을 수 있을까?? 🧐

hanhxx' or '1'='1

고민 끝에 hanhxx는 위와 같은 값을 넣어보기로 했다.

떨리는 마음으로 Username 입력 칸에

hanhxx' or '1'='1

을 입력했더니.. 결과는 성공!! 결국 hanhxx는 모든 회원 정보를 얻는 데에 성공했다.


이 예시를 봤을 때, 우리는 hanhxx가 취한 행동이 무엇인지 생각해봐야 한다.

원래 사용자가 입력할 형태의 값이 아닌

User hanhxx >
username : hanhxx

attacker hanhxx > 
username : hanhxx' or '1'='1

실행될 SQL을 예측해 새로운 SQL을 넣은 것이다.

공격자 hanhxx가 입력한 값이 이미 작성되어 있던 SQL로 들어가게 되면

SELECT * from member WHERE username='hanhxx' or '1'='1'

이와 같은 SQL이 만들어지게 된다.

이 SQL은 결과적으로 "DB 안에 있는 모든 회원의 정보를 조회해!" 라는 뜻이기 때문에

본래 의도했던 서비스의 결과가 아닌 더 많은 데이터가 노출된 것이다.

이렇듯 이미 작성되어 있는,

WAS에서 준비해 둔 SQL에 새로운 SQL을 끼워 넣는 공격SQL Injection이라고 부른다.

Last updated