요즘 보안쪽 뉴스가 상당히 많이 나오내요.
옥션도 해킹 당하고 이리저리 분위가 참 어수선합니다.
그래서 요즘 가장 흔히 사용되는 해킹 관련 내용을 몇자 적어봅니다.
얼마전 모회사 사이트를 하나 만든적이 있습니다.
사이트를 만들어서 전달을 하니 그쪽에서 모의 해킹을 시도해 보더군요.
별로 그런 부분을 시경을 쓰지 못하고 작업을 한거라 몇군데 해킹에 취약한 부분이 있더군요
그중에 가장 많이 나왔던 부분이 sql injection 이 었습니다.
권한할당으로 테이블을 거드릴수는 없도록 처리 하였지만 어째든 소스 상에서 막아줄 부분은 다막아
달라는 권고가 오더군요.
그럼 간단하게 sql injection에 대하여 설명하고 막는 어떤식으로 막는지 알려드리겠습니다.
SQL Injection은 데이터베이스로 전달되는 SQL Query를 변경시키기 위해 Web Application에서 입력 받는 파라메터를 변조, 삽입하여 비정상적인 데이터베이스 접근을 시도하는 기술입니다. 일반적으로 Web Application에서 데이터베이스를 조작하는 권한이 해당 테이블을 삽입하고 삭제시킬 수 있기 때문에 SQL Injection이 가능할 때 일어나는 파급 효과는 굉장히 클 수 있습니다. 또한 데이터베이스의 접근 권한이 필요이상으로 크다면, 데이터베이스 서비스를 중지시키거나 원하는 명령어를 실행시킬 수 있는 취약점이 있습니다. 이러한 공격방법은 거의 모든 관계형 데이터베이스 관리시스템(Oracle, MSSQL, MySQL, Informix, ETC)에 적용될 수 있습니다. 이러한 공격 시도는 보통 단일 따옴표(Single Quote), 따옴표 (Double Quota), OR로 시작하여 기존의 SQL Query에 이어 공격자가 원하는 Query를 삽입합니다.
간단하게 정리를 하면 위의 내용과 같습니다.
이것에 대한 처리 방법은 의외로 간단한편입니다.
1.파라메터가 숫자인 경우 ,숫자형인지 꼭 체크를 한다.
2.파람메터가 문자인 경우, 정규표현식을 통해 단일 따옴표를 치환합니다.
3.쿼리 빌드시, 문자열이 아닌 매개변수 쿼리를 사용하는 저장 프로시저로 구현합니다.
( '의 경우 \' 이나 "과 같이 단일 다옴표를 무력화 시킵니다. 그외에도 "나 or 그리고 sql문의 종료를 가리키는 ; 의 경우도 sql injection 을 일으킬 가능성이 있으므로 치환해야 합니다.)
4.Web Application과 연동되는 데이터베이스의 접근 권한을 최소화 합니다.
5.Internal Error(500) Page 에 대한 오류정보를 노출시키지 않아야 합니다.
6.그밖에 데이터베이스 쿼리에 사용되는 키워드를 검사합니다.
간단한예)
Simple Replace)
‘ASP Script
string id = Id.Text;
id = id.Replace(“’”,”\’”); ‘ single-quota를 ‘’ 으로 변환시킵니다.
‘VB Script
function escape( user_input )
user_input = replace( user_input, “’”, “\’”)
good_string = user_input
end function
Simple Replace)
String user_input = request.getParameter(“id”);
user_input = user_input.replaceAll(“’”, “\’”);
Stored Procedure)
string id = Id.Text;
SqlConnection con = new SqlConnection("server=(local);
database=Test; uid=TestUser; pwd=guessWhat”);
SqlCommand cmd = new SqlCommand("proc_GetName", con);
‘ sql command type을 stored procedure로 지정합니다
cmd.CommandType = CommandType.StoredProcedure;
‘ 파라메터 지정부분입니다.
cmd.Parameters.Add("@id", SqlDbType.VarChar, 10);
cmd.Parameters["@id"].Value = id;
‘ proc_GetName 저장 프로시저를 사용하도록 아래와 같이 설정합니다
‘ GRANT EXECUTE ON proc_GetName TO TestUser
SqlDataReader dataReader = cmd.ExecuteReader();
이정도 처리만 하면 기본적인 처리는 된거라고 보시면 됩니다.
이외적으로 XSS나 기타 여러가지 취약점을 공격하는 기법이 있지만 sql injection 부분은
위 내용을 참조하시면 어느정도 막아지리라 봅니다.
그럼 수고하세요.

PREV