SQL Injection 2
작성자 관리자 작성시간 2005-04-26 01:08:29
 

SQL Injection에 대해서 조금만 설명해드릴께요.

웹 서버와 DB서버가 연결되어있고, 로그인 정보가 DB서버에 저장되어있는 상황입니다.

우리는 로그인시 아이디와 비밀번호를 넣죠?

ID = loveyou

PASSWORD = 12341234



웹 어플리케이션은 DB서버에 SQL쿼리를 날려 실제 로그인 정보가 있는지 확인합니다.

이때 보내는 SQL쿼리는 보통 다음과 같습니다.



SELECT * from USER_DB  WHERE ID = 'loveyou' and PASSWORD = '12341234' 



하지만 다음과 같이 로그인시 아이디에 특수문자인 ' (작은따옴표)를 넣게 되면 SQL 쿼리는 다음과 같이 변합니다.

ID = love'

PASSWORD = 12341234



SELECT * from USER_DB  WHERE ID = 'love'' and PASSWORD = '12341234'



빨간색으로 된 부분을 자세히 보세요. ID = 'love' ' and 

작은 따옴표가 제대로 안닫혔죠? 결국 SQL 쿼리가 제대로 만들어지지 못하고 DB서버에 요청을 하게 됩니다. DB서버는 당연히 잘못된 SQL쿼리를 받고 에러 메시지를 보내주는데 그 에러 메시지가 호준님께서 올리신 그 에러 메시지 입니다.



>-------------------------------------------------------------

>Microsoft OLE DB Provider for SQL Server error '80040e14'

>'nrcetc'' 문자열 앞에 닫히지 않은 인용 부호가 있습니다.

>/nrcbd/pds/detail.asp, line 119

>--------------------------------------------------------------

>



그런데 이렇게 에러메시지만 나온다고 해서 뭔가 할 수 있는게 아닙니다. 특수문자를 넣어 SQL 쿼리를 조작할 수 있는 방법이 있습니다. 우선 아이디 패스워드를 아래처럼 입력합니다.

ID = admin' --

PASSWORD = 12341234



SELECT * from USER_DB  WHERE ID = 'admin' --' and PASSWORD = '12341234'



자 위의 SQL 쿼리를 잘 살펴보면 -- 라는 표시가 보이죠? SQL 쿼리에서 -- 표시는 주석 처리를 의미합니다. c언어에 보시면 /* 어쩌구저쩌구 */  이런 형식으로 주석 처리하는 걸 많이 봤죠?

자!! 이제 주석처리(--) 뒤쪽을 모두 없애버리면 다음과 같은 SQL 쿼리문이 됩니다.

SELECT * from USER_DB  WHERE ID = 'admin'

위의 SQL 쿼리를 보시면 알겠지만 USER_DB라는 테이블에서 ID가 admin 인 것을 보내달라고 하는 내용입니다. 결국 우리는 admin 이라는 아이디의 패스워드를 몰라도 admin 로그인 정보를 받아 올 수 있게 되는 것이고, 로그인이 성공되는 것입니다.


^^; 이해가 되셨는지 모르겠어요.

SQL Injection도 꽤 재미있는 부분입니다.


목록 | 입력 | 수정 | 답변 | 삭제