SQL Injection공격으로 인한 홈페이지 내 악성코드 삽입피해 주의요망
□ 개요 o 최근 Windows 기반 웹사이트를 대상으로 SQL Injection 취약점을 공격하는 해킹도구를 통해 데이터베이스내에 악성코드를 대량으로 삽입하는 사례가 빈번히 발생하고 있어 홈페이지 관리자들의 각별한 주의가 요구됨 ※ 해당 해킹도구는 일부 웹 보안 장비의 보안기능을 우회할 수도 있으므로 주의가 필요
□ 피해 현상 o 홈페이지 초기화면에 정적(Static)으로 악성코드가 은닉되는 것이 아니라, 데이터베이스 내 악성코드 링크를 삽입함으로써 해당 데이터베이스와 연동된 게시판, 상품정보 등 웹 페이지에 악성코드가 동적(Dynamic)으로 삽입됨
□ 원인 o 게시판이나 회원 인증 등 웹서비스와 데이터베이스가 연동되는 부분에서 전달 되는 인자값에 대한 검증절차 부재로 인해 악의적인 SQL 명령어 주입이 가능 하게 됨 (SQL Injection 취약점) o 특히, 최근에는 웹 사이트를 통해 유포되는 악성코드는 쿠키 등 HTTP 헤더정보 를 통해서도 삽입되고 있고, 일부 웹 보안장비의 보안기능을 우회할 수도 있으 므로 각별한 주의가 필요
□ (피해 발생시) 복구방법 o 데이터베이스 백업본 사용 - 데이터베이스 백업본이 있을 경우 복구에 활용 o 악성코드가 삽입된 테이블을 모두 찾아 SQL명령문으로 복구 - 반드시 데이터베이스 관리자/개발자와 충분히 검토한 후에 적용 요망 - 자료형 변환이 필요 없는 경우 replace함수만으로 복구 가능
Update [테이블명] set [컬럼명]=replace([컬럼명],'[삭제하고자하는 악성코드 문자열]','')
예> Update freebbs set title=replace(title,'<SCRIPT src=hxxp://www.malcode.tld/b.js></SCRIPT>','') |
- 자료형 변환이 필요한 경우는 cast함수를 이용하여 복구
Update [테이블명] Set [컬럼명] = replace(cast([컬럼명] as varchar(8000)), '[삭제하고자하는 악성코드 문자열]', '')
예> Update freebbs Set contents = replace(cast(contents as varchar(8000)), '<SCRIPT src=hxxp://www.malcode.tld/b.js></SCRIPT>', '') |
※ 컬럼의 자료형(data type)이 ntext, image 등인 경우 cast함수를
사용하여 자료형 변환 후 replace가능하지만, replace를 위한 변수
공간(varchar(8000)) 보다 큰 자료의 경우 자료 손실이 발생 할 수
있으므로 주의 요망. MS SQL 2005 이상에서는 varchar(max)사용 가능
- MS SQL 서버에서 사용하는 큰값 자료형 참조 자료 [1] 큰 값 자료형 설명: http://msdn.microsoft.com/ko-kr/library/ms178158.aspx [2] UPDATETEXT 설명: http://msdn.microsoft.com/ko-kr/library/ms189466.aspx
□ 예방대책 o 근본적인 해결을 위해 모든 변수값에 유효값 검증 절차 적용 o 웹사이트에서 사용하는 DB권한의 최소화 및 SA계정 사용 제한 등의 SQL서버 최적화 o 웹 보안 솔루션 도입 및 정책 최적화 - MS URLscan 관련 자료 [1] URLscan 사용방법: http://support.microsoft.com/kb/326444/ko [2] URLscan 다운로드: http://www.microsoft.com/downloads/details.aspx?FamilyId=EE41818F-3363-4E24-9940-321603531989&displaylang=en ※ URLscan은 웹방화벽과 유사하며 서버로 전달되는 값들의 필터링 기능이 지원됨 - 공개웹방화벽 관련 자료 [1] 사용자 커뮤니티: www.securenet.or.kr > 열린지식 > 공개웹방화벽커뮤니티 ※ WebKnight에서는 헤더설정의 Injection공격 차단이 설정되어 있어야 차단 가능하며, 오탐발생이 예상되므로, 적용 후 일정기간 모니터링 필요
o 웹사이트 보안 강화 가이드 - 웹보안 4종 가이드: www.KrCERT.or.kr접속 > 웹보안 4종 가이드 o 웹사이트 취약점 점검 - KISA 무료 웹취약점점검 서비스 http://webcheck.krcert.or.kr ※ 비영리단체 또는 중소기업등의 정보보호취약계층만 서비스 대상임 - MS 소스코드 검사 도구: http://support.microsoft.com/default.aspx/kb/954476 - HP 점검 도구: http://www.communities.hp.com/securitysoftware/blogs/spilabs/archive/2008/06/23/finding-sql-injection-with-scrawlr.aspx o MS SQL서버에서 sysobjects 또는 syscolumns 권한을 제거하여 악성코드 삽입 스크립트 실행을 차단할 수 있으나, 운영 환경에 따라 적용 효과에 차이가 있으므로 추후에 배포될 기술문서에서 안내예정
□ 쿠키 인젝션 개발코딩
' InputFilter 함수는 입력값 검증을 위한 필터링 함수 ' CheckLogin 함수는 아이디/비밀번호로 로그인 체크
1. 로그인 인증 성공후 쿠키 생성 <% Dim UserID : UserID = InputFilter(Request.Form("UserID")) ' SQL Injection방어를 위해 InputFilter사용 Dim UserPW : UserPW = InputFilter(Request.Form("UserPW")) Dim Result : Result = CheckLogin(UserID, UserPW) If Result = True Then Response.Cookies("www")("userid") = UserID Else Response.Write "인증실패" End If %>
2. 게시판 글쓰기하였을때 로그인한 사용자 아이디를 Writer 필드에 저장 <% Dim Title : Title = InputFilter(Request.Form("Title")) ' SQL Injection방어를 위해 InputFilter사용 Dim Content : Content = InputFilter(Request.Form("Content")) ' SQL Injection방어를 위해 InputFilter사용 Dim Writer : Writer = Request.Cookies("www")("userid") ' 쿠키는 그대로 가져와서 사용 <-- 이부분이 필터링을 해주지 않아 문제가 됨
SQL = "Insert Into Board (" SQL = SQL & "Title, Content, Writer " SQL = SQL & ") Values ( " SQL = SQL & " '" & Title & "', '" & Content & "', '" & Writer & "') " Db.Execute SQL ' SQL Injection에 취약함!! %>
개발자 자신들이 만든 쿠키는 안전하다는 생각으로, 생성된 쿠키를 이용하는 필드에서는 sql injection 문을 필터링하지 않는게 문제가 된다고 합니다. 통신 중간에 쿠키를 가로채서 변조하는 것이 가능한 만큼 이 문제가 발생하게 되는 것입니다. 대안으로는 로깅설정에서 쿠키를 설정하거나 웹나이트 같은 웹방화벽에서 쿠키로깅을 설정합니다. 이 설정은 대부분 디폴트가 언체크이기 때문에 관리자가 관심을 가져야 겠습니다. 그래서 처음부터 아래와 같이 문제발생 요지를 없애는 것입니다.
Dim Writer : Writer = InputFileter(Request.Cookies("www")("userid"))
□ 참고사이트 [1] http://isc.sans.org/diary.html?storyid=3823 [2] http://isc.sans.org/diary.html?storyid=5092 [3] http://www.modsecurity.org/blog/archives/2008/01/sql_injection_a.html [4] http://www.computerworld.com/action/article.do?command=viewArticleBasic&taxonomyId=16&articleId=9055858&intsrc=hm_topic [5] http://www.trustedsource.org/blog/142/New-SQL-Injection-Attack-Infecting-Machines [6] http://www.f-secure.com/weblog/archives/00001432.html |