본문 바로가기
Security

SQL-INJECTION (GOOD!)

by Hide­ 2007. 7. 15.
반응형

-----------------------------------------------------------------------------------------------------

                                                           SQL Injection 이란?

-----------------------------------------------------------------------------------------------------

SQL 문으로 쿼리를 던질 때, 검색 조건은 동적으로 정해지는 경우가 많다. 예를 들어 대학의 학사 정보 시스템의 경우, 모든 정보는 DB에서 학번을 키로하여

검색을 할 것이다. 이 학번은 고정되어 있는 것이 아니라, 사용자마다 다르다.

Web Programming 이 일반화 되면서, 사용자들은 웹에서 검색 조건을 입력하고 그 결과를 ASP나 PHP등의 서버측 스크립트가 출력해주는 방식의 프로그램이

많이 생기게 되었다. 보통 사용자들이 입력하는 것은 이름이나 학번등의, 간단한 문자열이나 숫자이지만, 해커가 악의적인 목적으로 이상한 값을 입력하면,

SQL 문은 원래의 의도가 아닌 다른 목적에 사용될 수 있다.

결국, SQL Injection은 Input Validation 과 관련된 보안 문제라고 할 수 있겠다.


첫번째 예제


그럼, 첫번째 예제를 살펴보자. 사용자의 입력을 받아서, DB에서 그 정보를 검색해 주는 ASP안에 다음과 같은 코드가 있다고 하자.

SQL = “select * from users where username=’” & request.form(“username”) & “’ and password=’” & request.form(“password”) & “’”

만약 사용자가 이름에 강유 라고 입력하고 비밀번호에 1234 라고 입력했다면 다음과 같은 SQL 문이 실행될 것이다.

select * from users where username=’강유’ and password=’1234’

여기까지는 좋다. 이제, 해커가 이름에 ‘ 를, 비밀번호에 아무것도 넣지 않았다고 해 보자. 그러면 다음과 같은 에러 메시지가 나온다.

Syntax error in string in query expression ‘username=’’’ AND password=’’;’

이걸 보고, 데이터베이스 안의 필드중 username과 password라는 것이 있다는 것을 알았다. 이제 다음과 같이 입력해 보자.

사용자 이름 : ‘ or username like ‘%

비밀번호 : ‘ or password like ‘%

자, 이제 SQL 문은 다음과 같이 된다.

Select * from users where username=’’ or username like ‘%’ and password=’’ or password like ‘%’

이 문장은, 데이터베이스의 모든 데이터를 가져오게 된다.
 


두번째 예제


첫번째 예제가 재미있는가? 그럼, 비슷한 두번째 예제를 보자.

SQL = “select * from users where staffnumber=” & request.form(“staffnumber”) & “ and password=’” & request.form(“password”) & “’”

만약 사용자가 staffnumber에 111111 이라고 입력하고 비밀번호에 1234 라고 입력했다면 다음과 같은 SQL 문이 실행될 것이다.

select * from users where staffnumber=111111 and password=’1234’

여기까지는 좋다. 이제, 해커가 이름에 ‘ 를, 비밀번호에 아무것도 넣지 않았다고 해 보자. 그러면 다음과 같은 에러 메시지가 나온다.

Syntax error in string in query expression ‘staffnumber=’ AND password=’’;’

이걸 보고, 데이터베이스 안의 필드중 staffnumber와 password라는 것이 있다는 것을 알았다. 이제 다음과 같이 입력해 보자.

사용자 이름 : 0 or 1=1

비밀번호 : ‘ or password like ‘%

자, 이제 SQL 문은 다음과 같이 된다.

Select * from users where staffnumber=0 or 1=1 and password=’’ or password like ‘%’

이 문장 또한, 데이터베이스의 모든 데이터를 가져오게 된다.


세번째 예제


자, 그럼 세번째 예제를 보자. 예를 들어, 다음과 같은 SQL문이 있다고 하자.

SQL = “SELECT * from MyTable WHERE someText=’” & request.form(“inputdata”) & “’”

여기서 입력을 다음과 같이 해 보자.

입력 : ‘ exec master..xp_cmdshell ‘net user newusername newuserpassword /ADD’--

그러면, SQL문은 다음과 같이 된다.

SELECT * from MyTable WHERE someText=’’ exec master..xp_cmdshell ‘net user newusername newuserpassword /ADD’?‘

맨 뒤에 있는 주석 연산자(--)에 주의하기 바란다. 이것은 뒤에 나오는 ‘ 을 무기력화 한다.

이 경우 SQL Server가 sa권한으로 동작하고 있으면 사용자가 시스템에 추가되게 된다.

SQL Injection 방지법

사용자가 숫자를 입력해야 한다면, ISNUMERIC 함수등을 이용해 입력을 검사한다.

사용자가 문자열을 입력한다면, ‘ 을 ‘ ‘ 로 바꾼다. ( 작은 따옴표 두개로 바꿔준다 )

또한 ‘을 \’ 로 바꾸는 방법도 있다.



-----------------------------------------------------------------------------------------------------

참고자료

Understanding and Preventing SQL Injection Attacks( http://www.silksoft.co.za/data/sqlinjectionattack.htm )

SQL Injection FAQ ( http://www.sqlsecurity.com/faq-inj.asp )

Early adapter VoiceXML(^_^ )

-----------------------------------------------------------------------------------------------------







-개인적으로 도움많이된글
 

'Security' 카테고리의 다른 글

Argos2007 보고서(SlaxCore님이쓰신글)  (0) 2007.07.15
웹프록시 Paros 메뉴얼  (0) 2007.07.15
Command Injection Flaws  (0) 2007.07.15
MySQL SELECT 문 - php와 관련하여  (0) 2007.07.15
네이버카페 모든글보기(등급무시)  (3) 2007.07.14