본문 바로가기

DBMS

SQL 인젝션

반응형

 

SQL은 구조화질의언어(Structured Query Language)로써 DB 접근에 쓰이는 언어이며 ,

Injection은 주사,주입이라는 뜻이다. 

 

SQL Injection은 추가적으로 쿼리(SQL)를 삽입시켜서 

DB값을 조작 , 변조하거나 로그인 인증 우회 등을 하는 웹 해킹 기법이다. 

 

SQL 인젝션의 목적은 추가된 쿼리를 실행시키는것이다.

 

 

만약에 다음과 같은 쿼리가 있다고 가정해보자.

 

SELECT userid,password 
FROM usertbl 
WHERE userid = 'admin' and password = 'qwer1234';

 

이 쿼리는 정상적인 로그인 인증 쿼리다.

 

아이디가 admin , 비밀번호가 qwer1234인 사용자를 usertbl 테이블에서 조회해서 

존재하는 값이면 로그인 시켜주는 방식이다. 

 

실제로는 아이디 자리(admin) , 패스워드 자리(qwer1234)에는 변수(사용자가 입력한 값)가 

오게된다. 

 


 

아이디창에 admin , 패스워드창에 qwer1234 치고 Login버튼을 누르면 

저 쿼리가 실행되면서 DB에 해당 사용자가 있는지 조회하고 로그인 성공여부를 판단한다.

 

만약 해당 사용자가 DB에 있다면 다음과 같이 조회가 될 것이다.

 

   userid  password 
admin  qwer1234 

 


 

 

런데 만약 아이디창에 아이디가아닌 다음과 같은 SQL구문을 삽입하면 어떻게 될까?

 

그러면 다음과 같이 쿼리가 들어가게 된다.

 

select userid,password
from usertbl

 

 

 

where userid = ''or 1=--' and password = '하이';

 

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