[Book - 그림으로 배우는 Http & Network Basic] 11. 웹 공격 기술
웹 공격 기술
HTTP 자체는 보안 상의 문제가 일어날 정도로 복잡한 프로토콜은 아니기 때문에 프로토콜 자신이 공격 대상이 되는 경우는 거의 없다.
공격 대상은 HTTP를 사용하는 서버와 클라이언트 그리고 서버 상에서 동작하는 웹 애플리케이션 등의 리소스이다.
HTTP에는 보안 기능이 없다.
현재의 웹 사이트 대부분은 인증이나 세션 관리, 암호화 등의 보안 기능이 필요하지만 이들은 HTTP에 없기 때문에 웹 애플리케이션에서 인증이나 세션 관리 기능을 개발자가 설계하고 구현할 필요가 있다.
개발자마다 설계가 다르니 때문에 보안 등급이 충분치 못하고 공격자가 악용할 수 있는 취약성과 같은 버그가 있는 상태로 가동되고 있는 웹 애플리케이션이 있다.
Request는 클라이언트에서 변조 가능
웹 애플리케이션에 대한 공격은 HTTP Request 메시지에 공격 코드를 실어서 실행된다.
쿼리나 폼, HTTP 헤더, 쿠키 등을 경유해서 보내져 웹 애플리케이션에 취약성이 있을 경우에는 정보를 도둑맞거나 권한을 빼앗기는 일이 발생한다.
웹 애플리케이션에 대한 공격 패턴
서버를 노리는 능동적 공격
능동적 공격(active attack)은 공격자가 직접 웹 애플리케이션에 액세스해서 공격 코드를 보내는 타입의 공격이다.
서버 상의 리소스에 대해 직접 실행되기 때문에 공격자가 리소스에 액세스할 필요가 있다.
- 대표적인 공격
- SQL 인젝션
- OS 커맨드 인젝션
- 등
- 대표적인 공격
유저를 노리는 수동적 공격
수동적 공격(passive attack)은 함정을 이용해서 유저에게 공격 코드를 실행시키는 공격이다.
공격자가 직접 웹 애플리케이션에 액세스해서 공격을 하지 않는다.
- 순서
- 공격자가 설치한 함정에 유저를 유도한다. 함정에는 공격 코드를 심어둔 HTTP Request를 발생시키기 위한 장치가 준비되어 있다.
- 사용자가 함정에 걸리면 유저의 브라우저나 메일 클라이언트에서 함정을 열게된다.
- 함정에 걸리면 유저의 브라우저가 장착된 공격 코드를 포함한 HTTP Request를 공격 대상인 웹 애플리케이션에 송신하고 공격 코드를 실행한다.
- 공격 코드를 실행하면 취약성이 있는 웹 애플리케이션을 경유한 결과로서 유저가 가지고 있는 쿠키 등의 기밀 정보를 도둑맞거나 로그인 중인 유저의 권한이 악용되는 등의 피해가 발생한다.
- 대표적인 공격
- 크로스 사이트 스크립팅(XSS, Cross-Site Scripting)
- 크로스 사이트 리퀘스트 포저리(CSRF, Cross Site Request Forgery)
- 등
- 순서
유저가 처한 환경을 이용한 인트라넷 등에 대한 공격
수동적 공격을 이용하면 인트라넷 같은 인터넷에서 직접 액세스할 수 없는 네트워크를 공격할 수 있다.
출력 값의 이스케이프 미비로 인한 취약성
- 웹 애플리케이션의 보안 대책을 실시하는 장소
- 클라이언트에서 체크
- 웹 애플리케이션(서버 측)에서 체크
- 입력값 체크
- 출력값 체크
클라이언트 측에서의 체크
대부분 JavaScript를 사용한다. 그러나 변조되었거나 무효화될 가능성이 있기 때문에 근본적인 보안 대책으로는 적합하지 않다.
입력 실수를 바로 지적해주는 정도로 UI 향상을 위해 사용한다.
웹 애플리케이션 측의 입력 값 체크
공격 코드로서 의미를 갖는 것도 있기 때문에 근본적인 보안 대책으로 적합하지 않다.
시스템 요건대로 된 값인지 아닌지에 대한 체크나 문자 코드의 체크 등을 실시한다.
웹 애플리케이션 측의 출력 값 체크
웹 애플리케이션에서 처리한 데이터를 DB나 파일 시스템, HTML, 메일 등에 출력할 때 출력하는 곳에 따라 값을 이스케이프 처리하는 출력 값의 이스케이프가 보안 대책으로 중요하다.
크로스 사이트 스크립팅
크로스 사이트 스크립팅(XSS, Cross-Site Scripting)은 취약성이 있는 웹 사이트를 방문한 사용자의 브라우저에서 부정한 HTML 태그나 JavaScript 등을 동작시키는 공격이다.
동적으로 HTML을 생성하는 부분에서 취약성이 발생할 수 있기 때문에 공격자가 작성한 스크립트가 함정이 되고 유저의 브라우저 상에서 움직이는 수동적 공격이다.
- 영향
- 가짜 입력 폼 등에 의해 유저의 개인 정보를 도둑 맞는다.
- 스크립트에 의해 유저의 쿠키 값이 도둑맞거나 피해자가 의도하지 않는 Request가 송신된다.
- 가짜 문장이나 이미지 등이 표시된다.
SQL 인젝션
부정한 SQL을 실행하는 SQL 인젝션
SQL 인젝션(SQL Injection)이란 웹 애플리케이션을 이용하고 있는 DB에 SQL을 부정하게 실행하는 공격이다.
개인정보나 기밀 정보 누설로 직결되기도 한다.
- 영향
- DB 내의 데이터 부정 열람이나 변조
- 인증 회피
- DB 서버를 경유한 프로그램 실행
- 등
SQL 인젝션은 SQL 문장의 구문을 파괴하는 공격
SQL 인젝션은 공격자에 의해 개발자가 의도하지 않는 형태로 SQL 문장이 변경되어 구조가 파괴되는 공격이다.
실제로 SQL 인젝션이 발생한 경우에는 유저 정보나 결제 정보등의 다른 테이블을 부정하게 열람하거나 변조되는 등의 피해가 발생할 수 있다.
OS 커맨드 인젝션
OS 커맨드 인젝션(OS Command Injection)이란 웹 애플리케이션을 경유하여 OS 명령을 부정하게 실행하는 공격이다.
쉘을 호출하는 함수가 있는 곳에서 발생할 가능성이 있다.
웹 애플리케이션에서는 OS에서 사용되는 커맨드 쉘을 경유해서 실행할 수 있다.
쉘의 호출 방법에 취약한 부분이 있다면 잘못된 OS 커맨드가 삽입되어 실행되는 버리는 경우가 있다.
OS 커맨드 인젝션은 Windows와 Linux 등의 커낸드 라인에서 프로그램을 기동하는 쉘에 대해서 커맨드를 보낼 수 있다. 즉, OS 상에서 동작하는 다양한 프로그램을 실행할 수 있다.
HTTP 헤더 인젝션
HTTP 헤더 인젝션(HTTP Header Injection)이란 공격자가 Response 헤더 필드에 개행 문자 등을 삽입함으로써 임의의 Response 헤더 필드나 바디를 추가하는 수동적 공격이다.
바디를 추가하는 공격을 HTTP Response 분할 공격(HTTP Response Splitting Attack)이라고 부른다.
- 영향
- 임의의 쿠키 세트
- 임의의 URL에 리다이렉트
- 임의의 바디 표시(HTTP Response 분할 공격)
HTTP Response 분할 공격
HTTP 헤더 인젝션을 응용한 공격이다.
HTTP 헤더와 바디를 나누는 빈 행을 만들어 내고 가짜 바디를 표시하는 공격이다.
메일 헤더 인젝션
메일 헤더 인젝션(Mail Header Injection)은 웹 애플리케이션의 메일 송신 기능에 공격자가 임의의 To 및 Subject 등의 메일 헤더를 부정하게 추가하는 공격이다.
취약성이 있는 웹 사이트를 이용해서 스팸 메일이나 바이러스 메일 등을 임의의 주소에 송신할 수 있다.
To나 Subject 등에 임의의 메일 헤더 필드를 다시 쓰거나 본문에 첨부 파일을 추가하는 것도 가능하다.
디렉토리 접근 공격
디렉토리 트래버설(Directory Traversal)이란 비공개 디렉토리의 파일에 대해서 부정하게 디렉토리 패스를 가로질러 액세스하는 공격이다.
웹 애플리케이션 파일을 조작하는 처리에서 파일 이름을 외부에서 지정하는 처리가 취약할 경우 유저는 [../] 등의 상대 경로를 지정하거나 [/etc/passwd] 등의 절대 경로를 지정함으로써 임의의 파일이나 디렉토리에 액세스할 수 있다.
따라서, 웹 서버 상의 파일이 잘못 열람되어 버리거나 변조 또는 삭제될 수 있다.
해결 방법은 임의의 파일 이름을 지정할 수 없도록 해야 한다.
디렉토리 트래버설 공격 사례
쿼리는 공격자가 노리고 있는 파일 /etc/passwd를 읽기 위해서 /www/log에서 상대 경로를 지정하고 있다.
만약 read.php가 디렉토리를 지정 받을 수 있다면 공개를 원치 않는 파일에 액세스 할 수 있다.
리모트 파일 인클루션
리모트 파일 인클루션(Remote File Inclusion)은 스크립트의 일부를 다른 파일에서 읽어올 때 공격자가 지정한 외부 서버의 URL을 파일에서 읽게 함으로써 임의의 스크립트를 동작시키는 공격이다.
주로 PHP에서 발생하는 취약성으로 PHP의 include와 require 설정에 따라서 외부 서버의 URL을 파일명으로 지정할 수 있는 기능이다.
해결 방법은 임의의 파일명을 지정할 수 없도록 해야 한다.
웹 서버의 설정이나 설계 미비로 인한 취약성
웹 서버를 잘못 설정하거나 잘못 설계할 때 생긴 문제 등에 의해 발생하는 취약성이다.
강제 브라우징
강제 브라우징(Forced Browsing)은 웹 서버의 공개 디렉토리에 있는 파일 중에서 공개 의도가 없는 파일이 열람되게 되는 취약성이다.
- 강제 브라우징으로 인해 받는 영향
- 고객 정보 등 중요 정보 누설
- 본래 액세스 권한이 있는 사용자에게만 표시하지 않는 정보 누설
- 어디에서도 링크되지 않은 파일 누설
- 공개하고 싶지 않은 파일의 URL을 숨기는 보안 대책에 의존하고 있는 경우 해당 URL을 알게 되면 파일을 열람 가능
- 예측하기 쉬운 파일이나 디렉토리의 인데스가 표시된 경우, 어떠한 방법으로 URL이 누설되었을 경우에도 발생 가능
부적절한 에러 메시지 처리
부적절한 에러 메시지 처리(Error Handling Vulnerability)는 공격자에게 유익한 정보가 웹 애플리케이션의 에러 메시지에 포함된다는 취약성이다.
- 웹 애플리케이션에 관계된 주요 에러 메시지
- 웹 애플리케이션에 의한 에러 메시지
- 데이터베이스 등의 시스템에 의한 에러 메시지
웹 애플리케이션에서는 유저가 보고 있는 화면에 상셍한 에러 메시지를 표시할 필요가 없다.
상세한 에러 메시지는 공격자가 공격을 하기 위한 힌트가 될 수 있다.
오픈 리다이렉트
오픈 리다이렉트(Open Redirect)는 지정한 임의의 URL로 리다이렉트 하는 기능이다.
리다이렉트되는 곳의 URL에 악의가 있는 웹 사이트가 지정된 경우 유저가 그 웹 사이트로 유도되는 취약성과 연결된다.
세션 관리 미비로 인한 취약성
세션 관리는 유저의 상태를 관리하기 위한 기능이지만 이 세션 관리 기능이 취약한 경우 유저 인증 상태를 빼앗겨 버리는 피해가 발생된다.
세션 하이잭
세션 하이잭(Session Hijack)은 공격자가 어떠한 방법으로 유저의 세션 ID를 입수해서 악용하는 것으로 유저로 위장하는 공격이다.
세션 픽세이션
세션 픽세이션(Session Fixation)은 공격자가 지정한 세션 ID를 유저에게 강제적을 사용하게 하는 공격으로 수동적 공격이다.
세션 어댑션
세션 어댑션(Session Adoption)은 PHP나 ASP.NET 등에 존재하는 미지의 세션 ID를 받아들이는 기능이다.
공격자는 마음대로 세션 ID를 작성해 함정을 준비함으로써 미들웨어에서 그 세션 ID를 미지의 세션 ID로 받아들인다.
크로스 사이트 리퀘스트 포저리
크로스 사이트 리퀘스트 포저리(CSRF, Cross-Site Request Forgeries)는 인증된 유저가 의도하지 않는 개인 정보나 설정 정보 등을 공격자가 설치해 둔 함정에 의해 어떤 상태를 갱신하는 처리를 강제로 실행시키는 공격으로 수동적 공격이다.
기타
패스워드 크래킹
패스워드 크래킹(Password Cracking)은 패스워드를 논리적으로 이끌어내서 인증을 돌파하는 공격이다.
- 패스워드 크래킹 방법
- 네트워크 경유로 패스워드 시행
- 무차별 대입 공격
- 사전 공격
- 암호화된 패스워드를 해독(공격자가 시스템에 침입하는 방법 등을 통해서 암호화나 해시화된 패스워드의 데이터를 취득한 상황)
- 무차별 대입 공격/사전 공격에 의한 유추
- 레인보우 테이블
- 열쇠 입수
- 암호 알고리즘의 취약성
- 네트워크 경유로 패스워드 시행
클릭 재킹
클릭 재킹(Clickjacking)은 투명한 버튼이나 링크를 함정으로 사용할 웹 페이지에 심어 두고, 유저에게 링크를 클릭하게 함으로써 의도하지 않은 콘텐츠에 액세스 시키는 공격이다.
DoS 공격
DoS 공격(Denial of Service attack)은 서비스 제공을 정지 상태로 만드는 공격이다.
- DoS 공격 방법
- 액세스를 집중시킴으로써 부하를 걸어 리소스를 다 소비하게 해 사실상 서비스를 정지 상태로 만든다.
- 취약성을 공격해 서비스를 정지시킨다.
여러 대의 컴퓨터에서 실행하는 DoS 공격은 DDoS 공격(Distributed Denial of Service attack)이라고 불린다.
백도어
백도어(Backdoor)는 제한된 기능을 정규 절차를 밟지 않고 이용하기 위해 설치된 뒷문이다.
백도어를 사용하면 본래 정해진 제한을 초과한 기능을 이용하는 것이 가능하다.
- 백도어 종류
- 개발 단계에 디버그용으로 추가한 백도어
- 개발자가 자기 자신의 이익을 위해서 추가한 백도어
- 공격자가 어떠한 방법을 써서 설치한 백도어