CSS/SQL INJECTION

보안/개발 2009. 8. 13. 00:47

참 사람이 정신줄을 놓고 당황하면 이렇게 까지 버벅 될 수 있다는 걸 깨달은 하루 였다.

 

크로스 사이트 스크립트와 SQL 인젝션을 헷 갈리다니!! 잊지 않도록 다시 정리 해둔다.

 

1. XSS (or CSS)

cascading style sheet 가 아니다. -_-;; cross site script 라고 불리우는 해킹 기법으로서

웹 페이지에 특정 스크립트를 작성하여 웹페이지 변조 및 다른 URL 로 이동 혹은 사용자의

세션아이디나 쿠키 정보를 탈취하는 기법이다.

 

간단한 예로서 웹 페이지의 특정 입력폼에(게시판 글쓰기 혹은 정보 입력 페이지)

<script>document.cookie</script> 등의 자바스크립트를 삽입하여 현재 사이트의 쿠키 정보를

빼올 수 있다. 물론 쿠키 정보를 전달해 주는 부분을 따로 작성해 줘야 하지만 문제는 쿠키 정보가

아니라 입력폼에 입력한 문자열들이 웹페이지에서 보여질때는 문자열이 아닌 의미있는 스크립트로

실행 된다는 점이다. 이는 자바스크립트에만 한정된 것이 아니고 VB스크립트, 플래시 심지어 첨부

파일등을 이용한 이미지등 웹페이지에 삽입 가능한 모든 스크립트들이 문제를 발생 할 수 있다.

 

가장 좋은 방지 방법은 모든 테그 <xxx> 를 정규식을 이용하여 치환시키는 것 이고 반드시 사용해야

하는 테그만 제한적으로 허용하는 것이 좋다.

 

2. SQL INJECTION

크로스 사이트 스크립트와 마찬가지로 웹 페이지 상의 특정 입력 폼이나 매개 변수를 조작한다는

공통점을 가지고 있으나 sql injection 은 스크립트를 삽입하는 것이 아니라 sql 문을 조작 하는 것이

차이 점이라고 할 수 있다.

 

가령, userid 와 passwd 라는 인자를 입력 받아 사용자를 인증하는 페이지가 있다고 할때,

userid=test&passwd=1234 라고 인자를 받는다고 치자..

그럼 웹 페이지 내부에서는

 

select * from user_tbl where userid='test' and passwd='1234'

 

정도의 쿼리문이 실행 되게 된다. 이때 인자를 userid=test&passwd=1234' or 1=1 // 로 전달 된다면

(실제로는 GET 방식의 데이터는 이런식으로 전달 되지는 않는다.)

 

쿼리가

 

select * from user_tbl where userid='test' and passwd='1234' or 1=1 //'

 

이런식으로 변형되어 실행 될 것이다.

php 기준 주석은 // 이며, MSSQL 주석은 -- 등 다양한 방법이 가능하다.

 

방지 방법은 프로그램 자체에서 쿼리를 작성하지 않고 저장 프로시저를 사용하면서 매개변수만

전달해 주는 방법이 있을 수 있고, 저장 프로시저를 사용하기 어려운 환경이라면, 서버 스크립트

에서 폼 입력값에 대한 예외 처리 혹은 quoto(따옴표) 처리를 확실하게 해주는 것이 최선이다.

 

이런 기본적인 설명을 못 했다니.. 뉴뉴


Posted by -_-;
,