본문 바로가기

정보보호/정보보호론(박승철)

정보보호론-(5) 소프트웨어 취약점 공격, XSS 공격

정보보호론-(5) 소프트웨어 취약점 공격, XSS 공격

소프트웨어 취약점 공격(Software Vulnerability Attack)
- 스택 버퍼 오버 플로우 공격(Stack Buffer Overflow Attack)
- 힙 버퍼 오버 플로우 공격(Heap Buffer Overflow Attack)
- 명령 주입 공격(Command Injection Attack)
- SQL 주입 공격(SQL Injection Attack)

크로스 사이트 스크립팅 공격(Cross Site Scripting Attack, XSS)

소프트웨어 취약점 공격이란?
- 목표 소프트웨어의 취약한 부분을 이용하여 공격해 공격자가 자신이 원하는 악의적인 코드를 수행시키는 공격기법

스택 버퍼 오버 플로우 공격(Stack Buffer Overflow Attack)
- 스택 버퍼(Stack Buffer) : 프로그램의 함수(function)이 실행될 때 필요한 공간
- 버퍼 오버 플로우(Buffer Overflow) : 실제 할당된 버퍼의 크기를 초과한 데이터가 입력되어 인접한 다른 메모리 정보를 덧쓰는 현상(overwriting)
- gets(), sprintf(), strcat(), strcpy()와 같은 경계값검사, 사이즈검사를 하지 않는 함수가 스택 버퍼 오버 플로우 공격에 취약하다
- 인접한 메모리의 값을 변경시킬 수 있다는 점을 착안하여 악의적인 코드를 메모리에 쓰고 해당 코드를 실행시키도록 유도하여 공격하는 방법임.

<그림 1: Stack Buffer Overflow Attack>

(1) 공격자는 지역변수의 버퍼를 오버플로우시켜 악성코드를 주입함
(2) stack frame구조 중 return address 값을 악성코드의 시작 주소로 변경시켜 악성 코드가 실행되게 함으로써 공격

# 스택 오버 플로우 공격으로 쉘 명령 실행
- 스택 오버 플로우 기법으로 return address의 값을 컴퓨터 시스템 관리자 권한이 필요한 쉘 코드의 시작 주소로 변경시키면 해당 쉘 명령을 실행시킬 수 있음

# NOP sled
- 공격 시스템의 메모리의 넓은 범위를 NOP로 채워 악의적인 코드가 실행될 가능성을 높이는 방법.
- return address의 값을 변경시킬 수 없거나 프로그램의 실행 흐름을 조정하기 어려운 경우 악성코드가 위치한 코드 앞부분(low address)에 NOP값을 채우면 프로그램 실행흐름이 NOP범위로 들어오게 되면 NOP는 무시(pass)하고 악성 코드가 위치한 부분으로 프로그램 실행흐름이 이동하게 됨.

# 스택 오버 플로우 대응책
- 컴파일 타임 : 경계값 검사, 사이즈 검사를 수행하는 라이브러리를 사용, 스택 가드 기법을 사용
- 런 타임 : Executable Address Space Protection(실행코드를 메모리상에서 분리), Address Space Randomization(스택 버퍼가 위치하는 주소를 랜덤화)

힙 버퍼 오버 플로우 공격(Heap Buffer Overflow Attack)
- 힙 메모리 : 프로세스에서 malloc()등의 함수를 통해 메모리가 동적으로 할당되는 영역
- 함수 포인터가 레코드 구조(구조체)로 포함된 경우 힙 버퍼 메모리 공간을 오버 플로우되도록 공격하여 쉘 코드로 주입하는 공격 방식

typedef struct chunk{
	char inp[64];
	void (*process)(char*);
}chunk_t;

chunk_t *next;

next = malloc(sizeof(chunk_t));
gets(next->inp);

- 공격 방식 : 악성코드를 inp[64]에 삽입, 해당 악성코드를 실행시키기 위해 함수 포인터의 시작주소를 해당 악성코드의 시작주소로 변경함.
- next->process(next->inp);

# 힙 버퍼 오버플로우 공격 대응책
- 런 타임 : Executable Address Space Protection(실행코드를 메모리상에서 분리), Address Space Randomization(스택 버퍼가 위치하는 주소를 랜덤화)

입력 포맷 취약점 공격(Input Format Vulnerability Attack)
- 프로그램들이 허용되는 입력 데이터의 형식을 정확하게 확인하지 않는 취약점을 이용하는 공격 방식
- Command Injection Attack, SQL Injection Attack

명령 주입 공격(Command Injection Attack)
- 입력 필드(Input form)에 스크립트 프로그램에 의해 실행될 수 있는 명령을 주입하여 스크립트 프로그램의 실행권한으로 해당 명령이 서버에서 실행되도록 하는 공격(서버를 공격)
- 입력 필드(Input form)의 '이름' 입력란에 '홍길동'과 같은 데이터를 입력하는 것이 아닌 <script>공격코드<script/>와 같이 스크립트 코드를 입력하여 서버에서 공격 코드가 실행되게 하는 공격 기법

SQL 주입 공격(SQL Injection Attack)
- SQL 데이터 입력 필드에 데이터베이스 프로그램에 의해 실행될 수 있는 악성 SQL 문을 주입하여 서버에서 실행되도록 하는 공격 기법

크로스 사이트 스크립팅 공격(XSS, Cross Site Scripting Attack)
- 외부 서버로부터 웹 브라우저에게 악의적인 스크립트 코드가 포함된 웹 문서를 전달함으로써 웹 브라우저 사이트에서 공격 코드가 실행되도록 공격하는 기법(클라이언트를 공격)
- XSS 공격의 주요 피해 : 사용자 쿠키 정보 전송, 관리자 실행 권한 획득, 악성 코드 다운로드
- XSS 공격 유형 : 저장형 XSS 공격, 반사형 XSS 공격

저장형 XSS 공격(Stored XSS Attack)
- 악성 스크립트 코드를 서버 사이트에 웹 페이지에 저장하고 해당 웹 페이지를 다운로드하는 웹 브라우저 사이트에서 악성 스크립트 코드가 자동으로 실행되게 하는 공격(클라이언트를 공격)
- 예를 들어 웹 서버의 게시판에 <script>공격코드<script/>를 입력하면 해당 게시글에 접근하는 클라이언트들이 공격코드가 포함된 웹 문서를 다운받고 공격코드가 실행됨으로써 공격하는 것

<그림 2: Stored XSS Attack>

# 저장형 XSS 공격 대응책
- 웹 서버에서 입력 필드(Input form)에 XSS 공격에 사용될 수 있는 메타 데이터가 입력 될수 없도록 함(< > ; )
- 입력 필드로 입력된 값은 단순한 문자열(string)데이터로 취급하여 코드를 입력해도 실행될 수 없도록 함

반사형 XSS 공격(Reflected XSS Attack)
- 사용자가 악성 스크립트 코드가 매개변수 형태로 포함된 URL을 클릭할 때 악성 스크립트 코드가 서버 사이트에 의해 HTML문서로 반사되어 웹 브라우저에서 실행되는 공격(클라이언트를 공격)
- URL 조작의 예 : http://google.com/search/?q=<script>공격코드<script/>
- 웹 서버는 <script>공격코드<script/>에 해당하는 부분을 해석할 수 없어 <script>공격코드<script/>가 포함된 HTML 에러 문서를 클라이언트에게 회신함.
- 클라이언트가 회신한 웹 문서를 실행하면 공격코드가 실행됨
서버 사이트에 악성 스크립트 코드를 남기지 않아도 되는 장점이 있음

<그림 3: Reflected Cross Scripting Attack>

# 반사형 XSS 공격 대응책
- URL필드에 XSS 공격에 사용될 수 있는 위험한 문자가 입력될 수 없게 함

Reference
1. 

제5강_소프트웨어취약점_XSS공격.pdf
0.51MB

2. https://www.youtube.com/watch?v=Q9Y6Wp4eCfg