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

ARP Spoofing은 로컬 네트워크에서 다른 컴퓨터의 MAC 주소를 자신의 MAC 주소로 변조시키는 공격이다.
즉, 동일 네트워크에 존재하는 공격 대상 PC의 IP주소를 공격자 자신의 MAC 주소를 맵핑하여 전달되야 하는
정보를 가로채는 공격을 말한다.



<그림1. ARP Spoofing 공격 흐름>

그림1에서 공격자의 MAC 주소가 00-12-aa-2b-af-34라고 가정해보자.
이때 공격자는 클라이언트에게 서버의 MAC 주소가 00-12-aa-2b-af-34라는 허위 정보를 담은 가짜 패킷을 보내고,
서버에게도 클라이언트의 MAC 주소가 00-12-aa-2b-af-34라는 허위 정보는 전달한다.
공격이 성공하면 클라이언트와 서버는 서로 패킷을 전달하는데 이때 서로의 MAC 주소를 00-12-aa-2b-af-34라고
인식하고 있기 때문에 공격자의 PC를 거쳐서 패킷이 송수신된다.
따라서 공격자는 클라이언트와 서버의 패킷 흐름을 고스란히 모니터링 할 수 있게 된다.

덧붙여서 ARP Spoofing을 감지할 수 있는 프로그램인 xarp을 추천한다.
무료와 유료 두가지 버전이 있으며 무료 버전으로도 ARP Spoofing을 감지하는 용도로는 충분하다.
다운로드 사이트 : http://www.xarp.net/

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

SQL Injection  (1) 2011.01.02

+ Recent posts