SQL은 구조화질의언어(Structured Query Language)로써 DB 접근에 쓰이는 언어이며 ,
Injection은 주사,주입이라는 뜻이다.
SQL Injection은 추가적으로 쿼리(SQL)를 삽입시켜서
DB값을 조작 , 변조하거나 로그인 인증 우회 등을 하는 웹 해킹 기법이다.
SQL 인젝션의 목적은 추가된 쿼리를 실행시키는것이다.
만약에 다음과 같은 쿼리가 있다고 가정해보자.
이 쿼리는 정상적인 로그인 인증 쿼리다.
아이디가 admin , 비밀번호가 qwer1234인 사용자를 usertbl 테이블에서 조회해서
존재하는 값이면 로그인 시켜주는 방식이다.
실제로는 아이디 자리(admin) , 패스워드 자리(qwer1234)에는 변수(사용자가 입력한 값)가
오게된다.
아이디창에 admin , 패스워드창에 qwer1234 치고 Login버튼을 누르면
저 쿼리가 실행되면서 DB에 해당 사용자가 있는지 조회하고 로그인 성공여부를 판단한다.
만약 해당 사용자가 DB에 있다면 다음과 같이 조회가 될 것이다.
userid | password | |
1 | admin | qwer1234 |
그런데 만약 아이디창에 아이디가아닌 다음과 같은 SQL구문을 삽입하면 어떻게 될까?
그러면 다음과 같이 쿼리가 들어가게 된다.
or 논리연산은 앞에나 뒤에가 하나라도 참이면 참이다.
따라서 '' or 1=1 은 항상 참이되고 , 뒤에 오는 and 절은
SQL의 주석 ( -- 또는 # ) 를 통해서 아예 무시해 버린다.
위 쿼리를 실행시켰을 때
다음과 같이 모든 사용자가 조회가 되며 ,
맨 위에 조회된 사용자로 로그인하게 된다.
SQL Injection을 시연해 볼 수 있는 사이트: http://demo.testfire.net/bank/login.aspx
위 사이트에 들어가서 아이디 창에 ' or 1=1 -- ,
비밀번호 창에는 아무거나 입력(자바스크립트에서 패스워드 길이 검증때문)
별 다른 아이디 입력없이 SQL 구문 삽입으로 관리자 계정에 로그인이 됬다.
SQL Injection을 막으려면
아이디와 패스워드창에 입력되는 값들을 적절히 검사해야한다.
'(따옴표) , "(쌍따옴표) , \(역슬래쉬)와 같이 쿼리에 쓰일 수 있는 문자들은 필터링 해야된다.
PHP라는 언어에서는 addslashes()라는 함수가 있는데 , stripslashes()와 같이 쓰인다.
addslashes는
' , " , \ 와 같은 특수문자가 오면 그 앞에다 역슬래시(\)를 붙인다.
이를 "이스케이프(escape)한다"고 표현한다.
이스케이프>
특수 기능을 하는 문자에서 그냥 단순 문자자체로 바꿔버리는것
stripslashes()는
추가적으로 붙인 역슬래시를 때 버린다.
(DB에서 가져올 때 추가됐던 역슬래시를 제거해야 원래의 문자열이 되니까 쓰임)
그리고 mysql_real_escape_string() 함수도
SQL 명령문에 사용되는 문자열에서 특수 문자를 피하는 함수다.
사용 방법은 간단하다.
mysql_real_escape_string($id)
mysql_real_escape_string($password)
입력값에 대한 검증만 제대로 이루어져도 SQL Injection의 피해를 최소한으로 줄일 수 있다.
'DBMS' 카테고리의 다른 글
[SQL] DML(Data Manipulation Language) (0) | 2017.06.23 |
---|---|
[SQL] - SELECT문 (0) | 2017.06.22 |
위즈몰 (쇼핑몰 오픈소스) (0) | 2017.06.22 |
[SQL] DDL( Data Define Language ) (0) | 2017.06.22 |
[SQL] 서브쿼리 문제 (0) | 2017.06.22 |