[DB] SQL Injection

안녕하·2023년 11월 15일
0

데이터베이스

목록 보기
5/21

SQL Injection

  • SELECT 문의 WHERE 절에서 대부분 발생

  • 코드 인젝션 중 하나

  • 사용자의 입력 값을 조작하여 DB를 공격하는 방식




SQL Injection 예시

상황

사용자에게 이름을 입력 받아 해당 이름으로 데이터를 조회하려고 한다.
쿼리가 다음과 같이 작성되었다.

select * from instructor where name = '" + \[사용자 입력\] + "'


1. 작은 따옴표 ' 이용

사용자 입력이 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 테이블의 모든 데이터를 조회할 수 있다.


  1. -- 이용

사용자 입력이 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만큼 증가시켜 저장한다.




SQL Injection 예방

  • prepared statement 이용

DBMS 캐시에 준비된 쿼리를 사용한다

prepared statement를 사용하면 사용자 입력을 문자열로 인식한다.
공격 쿼리가 들어가더라도 단순 문자열로 받기 때문에 SQL injection을 예방할 수 있다.


위에서 작성한 쿼리가 다음과 같이 작성된다.
select * from instructor where name = 'X\' or ''Y\' = \'Y'




출처: 데이터베이스 개론, Database System Concepts

profile
세요

0개의 댓글