SQL Injection은 웹 사이트의 취약점을 이용하여 권한 없는 사용자가 정보를 취할 수 있는 공격기법이다.
아주 기초적인 면을 설명할텐데 그 전에 Database와 Query문에 대해서 조금 알 필요가 있다.
Database와 Query문에 대해 간단하게 설명하겠지만 관련 자료를 찾아서 한 번 읽어본다면 훨씬 이해하기
쉬울 것이다. 여기서 쓰이는 Database와 Query문의 수준도 크게 어려운 것이 아니기 때문이다.

Database에는 테이블이란 것이 있고 그것에 각각 필드가 존재한다.
test란 테이블 내에 userid와 userpw란 필드가 있다고 가정하자.
그리고 userid에는 softs, userpw에는 1234란 값이 저장되어 있다고 가정하고 다음의 Query문을 보자.
(※ 좀 더 쉽게 설명하자면 회원가입을 할 때 아이디와 비밀번호를 입력하고 회원가입을 누르면 그 아이디와 비밀번호가
해당 서비스 제공자의 DB(Datebase)에 저장되는데 그때 userid와 userpw라는 필드에 각각 그 값이 저장되어 보관되는
것이다.)

일단 여기서 사용할 Query문의 기본 형식은 아래와 같다.

 select 필드명1,필드명2 from 테이블명;

이제 다음과 같은 Query문을 보내보자.

 select uesrid,userpw from test where userid='softs' and userpw='1234'

이것은 Database의 test 테이블에서 userid의 값이 softs이고 userpw의 값이 1234과 일치한 것을 찾는 것인데
Database에 그 값이 정상적으로 등록되어 있을 때의 결과는 다음과 같다.

 userid='softs'(true) and userpw='1234' (true)

true and true는 true가 되어서 정상적으로 작동이 된다.
(※ 아이디와 비밀번호가 일치하면 로그인이 되는 상황을 생각하면 된다.)

하지만 아래와 같은 Query문을 보내면 어떻게 될까?

 select uesrid,userpw from test where userid='softs' and userpw='4321'

위와 같은 경우에 결과는 다음과 같다.

 userid='softs'(true) and userpw='4321' (false)

true and false는 false가 되므로 작동하지 않는다.
(※ 아이디와 비밀번호가 일치하지 않으면 로그인이 되지 않는 상황을 생각하면 된다.)

그러면 이 정도의 지식을 가지고 다음 데모 사이트에서 SQL Injection을 실습하면서 익혀보자.
http://demo.testfire.net/bank/login.aspx 
(위 사이트의 실습 방법은 웹서핑 중 어떤 블로그에서 배웠고 이 포스팅은 그것을 복습한 내용이다.)


먼저 아무 값이나 입력해보자.
이때 입력한 값을 가지고 Query문을 추측해보면 아래와 같다.

 select uesrid,userpw from login where uesrid='guest' and userpw='1234'
(※ 테이블 이름을 login, Username과 Password 필드의 이름을 uesrid, userpw로 가정했을 때의 Query문이다.)

당연히 등록되지 않은 값이므로 결과는 아래와 같다.

 userid='guest'(false) and userpw='1234'(false)

따라서 로그인이 되지 않는다.

이번엔 Username과 Password에 각각 'a 라고 입력하고 로그인을 해보자.


이때에 Query는 아래와 같이 보내졌을 것이다.

 userid=''a' and userpw=''a'

Query문은 userid='' and userpw='' 처럼 '로 시작하고 '로 끝이 나야하는데 위와 같은 경우에는
''로 끝나고 a'가 선언 되어 오류가 발생하는 것이다.

이 오류를 이용하여 Query문을 수정하여 Injection을 시도해보자.

Username에 admin을 Password에 'or'1'='1을 입력하고 로그인을 해보자.



로그인에 성공하였다.
이유가 뭘까?
일단 Username에 admin을 Password에 'or'1'='1을 입력했을 때의 Query문을 추측해보자.

 select uesrid,userpw from account where username='admin' and password=''or'1'='1'

위와 같이 보내졌을텐데 위의 결과는 아래와 같다. 


 userid='admin'(true) and userpw=''(false)or'1'='1'(true

true and (false or true)인데 (false or true)는 true이므로 결국true and true가 되어서 최종적으로 true가 된다.
다른 방법으로는 주석문을 이용하는 것이다. SQL의 주석은 --를 사용하는데 --뒤에 입력된 부분은 모두 삭제되어
전송된다.
따라서 Username에 admin'--을 Password에 아무 값이나 입력하고 로그인하면 로그인에 성공하게 된다.
이때의 Query문과 처리 결과를 살펴보면 아래와 같다. 


 select uesrid,userpw from login where userid='admin'--' and userpw='aaaa' 

 select uesrid,userpw from login where userid='admin'(true)

이렇게 Username이 true가 되어서 로그인이 된다.
이런 취약점에 대한 간단한 대응으로는 아이디와 비밀번호를 입력할 때 특수문자의 제한을 두는 방법이 있다.
실제로 대형 포털사이트에서 '을 입력하려고 시도해도 입력되지 않는다. 

'네트워크 > 해킹' 카테고리의 다른 글

ARP Spoofing  (0) 2011.01.02

+ Recent posts