SELECT 문의 WHERE 절에서 대부분 발생
코드 인젝션 중 하나
사용자의 입력 값을 조작하여 DB를 공격하는 방식
사용자에게 이름을 입력 받아 해당 이름으로 데이터를 조회하려고 한다.
쿼리가 다음과 같이 작성되었다.
select * from instructor where name = '" + \[사용자 입력\] + "'
'
이용사용자 입력이 X' or 'Y' = 'Y
이라면 다음과 같은 문장이 만들어진다.
select * from instructor where name = '" + "X' or 'Y' = 'Y" + "'
즉,
select * from instructor where name = 'X' or 'Y' = 'Y'
이 된다.
X라는 이름을 가진 사람이 없다면 WHERE 절이 참이 되어 instructor 테이블의 모든 데이터를 조회할 수 있다.
--
이용사용자 입력이 X'; update instructor set salary = salary + 10000; --
라면 다음과 같은 문장이 만들어진다.
select * from instructor where name = '" + "X'; update instructor set salary = salary + 10000; -- + "'
즉,
select * from instructor where name = 'X'; update instructor set salary = salary + 10000; --"'
이 되어
instructor의 salary를 10,000만큼 증가시켜 저장한다.
DBMS 캐시에 준비된 쿼리를 사용한다
prepared statement를 사용하면 사용자 입력을 문자열로 인식한다.
공격 쿼리가 들어가더라도 단순 문자열로 받기 때문에 SQL injection을 예방할 수 있다.
위에서 작성한 쿼리가 다음과 같이 작성된다.
select * from instructor where name = 'X\' or ''Y\' = \'Y'