본문 바로가기

4-3. 2023-2 심화 스터디/웹 취약점 분석

[2023.10.07] 드림핵 웹해킹 서버/클라이언트(스테이지 4개) 1

<서버>

Sever Side Template Injection (SSTI)

  • 웹 어플리케이션에서 동적인 내용을 HTML 로 출력할 때 미리 정의한 Template 에 동적인 값을 넣어 출력하는 Template Engine 을 사용하기도 한다.
  • 예를 들어 내 정보를 출력해주는 페이지가 있다면 아래 코드처럼 Template 을 만들어 놓고 변수를 넣어 동적으로 HTML 을 만들 수 있다.


Language


Template Engine


Python


Jinja2, Mako, Tornad ...


PHP


Smarty, Twig, ....


JavaScript


Pug, Marko, EJS ...
  • 사용자의 입력 데이터가 Template 에 직접 사용될 경우 template Emgine 이 해석하여 실행하는 문법을 사용할 수 있다 -> SSTI 취약점 발생!

STTI 취약점 방어

  • 사용자의 입력 데이터를 Template source 에 삽입되지 않도록 해야한다. 사용자의 입력 데이터를 Template 에서 출력하기 위해서는 Template context 에 값을 넣어 출력해야 한.

File Vulnerability

  • File Vulnerability 에서는 파일 업로드 취약점, 파일 다운로드 취약점과 이 취약점들로부터안전하게 기능을 구현할 수 있는 방법들에 대해 알아본다.

파일 업로드 취약점

  • 서버 파일 시스템에 원하는 파일 경로 또는 파일 명을 업로드할 수 있다면 악의적인 공격자는 웹 어플리케이션 또는 서버의 서비스가 참조하는 파일을 업로드하여 공격에 사용할 수 있다.
  • 공격에 앞서 웹 서버의 CGI 개념을 이해하여야 한다.
  • CGI(Common Gateway Interface): 사용자의 요청을 받은 서버가 동적인 페이지를 구성하기 위해 엔진에 요청을 보내고 엔진이 처리한 결과를 서버에게 반환하는 기능
  • php, jsp, asp 등과 같이 CGI를 통해 서비스를 하는 형태에서는 확장자를 통해 웹 어플리케이션 엔진에 요청 여부를 판단한다.
  • 웹 서비스가 동작하는 경로에 사용자가 원하는 파일 내용과 파일 명을 업로드할 수 있다면 서버가 엔진에 요청하는 확장자를 업로드하여 서버의 웹 어플리케이션에 원하는 코드를 실행할 수 있다. 웹 서버가 파일을 실행하는 시기는 사용자의 요청이 들어오면 파일 시스템에서 해당 파일을 찾아 실행하는 것이기 때문에 웹 서버가 서비스하는 경로에 파일을 업로드할 수 있어야 한다.
  • 웹 어플리케이션이 실행하는 코드를 악의적인 공격자가 조작할 수 있다면 웹 어플리케이션 언어에 내장된 OS 명령어 등을 사용할 수 있으며, 해당 서버의 쉘을 웹을 통해 사용한다고하여 WebShell(웹쉘)이라는 악성코드가 등장하게 되었다.

파일 다운로드 취약점

  • 사용자가 입력한 파일이름을 검증하지 않은 채 그대로 다운로드했을 때 취약점이 발생한다.

(예제코드)

  • 개발자는 사용자가 uploads 디렉토리 안에 존재하는 파일만 다운로드할 수 있을 것이라고 생각할 수 있지만, Injection 주제에서 배운 Path Traversal을 이용하면 uploads 경로보다 더 상위 경로에 존재하는 시스템 파일, 설정 파일과 같은 중요 정보들을 다운로드할 수 있다.
  • ) http://example.com/download?filename=docs.pdf 형태가 정상적인 파일 다운로드 요청이라면 공격자는 http://example.com/download?filename=../../../../etc/passwd 처럼 다른 경로에 접근하여 시스템의 계정 파일을 다운로드 받을 수 있다.
  • 파일 다운로드 취약점은 웹 어플리케이션의 소스코드, 관리자의 패스워드, 서비스 키, 정 파일 등을 유출할 수 있기 때문에 주로 이차적인 공격을 위한 발판으로 삼을 수 있다.

File Download 취약점 방어

  • 파일 다운로드 취약점을 막기 위해서는 기본적으로 인자에 다운로드 받으려는 파일의 경로나 이름을 넘기지 않는 것이 좋다. 반드시 이름을 넘기는 방식으로 구현해야 한다면 상대경로로 올라가는데 사용될 수 있는 .. 과 /와 \\를 적절하게 필터링 해야 한다.
  • 그 다음으로 권장되는 방법은 데이터베이스에 다운로드 될 파일의 경로와 그에 해당하는 랜덤 키를 생성해 1 대 1 로 매칭해서 저장해두고 해당 랜덤 값이 인자로 넘어왔을 때 데이터베이스에 존재하는 파일인지를 먼저 식별하고 다운로드하는 것이 안전하다.

<클라이언트>

XSS Filtering Bypass

  • HTML 표준과 브라우저의 기능은 나날이 변화하고 발전하고 있는 가운에 안전하지 않은 코드를 실행할 수 있는 방법의 개수는 계속 증가하고 있다. XSS 취약점을 근본적으로 제거하기 위해서는 태그 삽입이 되지 않도록 처음부터 원인을 제거해야 한다. 따라서, 보안을 위해 XSS 필터링은 안전하다고 알려진 마크업만 허용하는 보수적인 방식을 취해야 한다.
  • XSS 키워드를 필터링할 때 의심되는 구문을 제거하는 대신에 단순히 치환 혹은 제거하는 방식의 필터링 관습이 존재한다. 단순히 의심되는 구문을 제거할 경우 필터링 되는 키워드 사이에 새로운 필터링 키워드를 삽입하는 방식으로 우회할 수 있다. 그러나 이 방식은 필터링 자체가 무력화되면 웹 응용 방화벽에서 공격 페이로드를 탐지하지 못하는 등의 부작용이 발생한다.
  • 태그와 속성 기반 필터링에는 대문자 혹은 소문자만을 인식하는 필터 우회, 잘못된 정규표현식을 사용한 필터 우회, 특정 태그 및 속성에 대한 필터링을 다른 태그 및 속성을 이용하여 필터를 우회하는 것이 있다.
  • 자바스크립트 함수 및 키워드 필터링을 활용하는 방법도 있는데 필터링된 문자열을 unicode escape sequence로 변환해 우회할 수 있다.

 

Content Security Policy

  • CSP: XSS나 데이터를 삽입하는 류의 공격이 발생하였을 때 피해를 줄이고 웹 관리자가 공격 시도를 보고 받을 수 있도록 새롭게 추가된 보안 계층
  • 웹 페이지에 사용될 수 있는 자원의 위치, 출처 등에 제약 가능하다

CSP 기본 정책

-Inline Code: 인라인 코드(태그내에 코드 직접 입력)를 유해하다고 간주 -> 사용 불가

-Eval: 기본적으로 문자열 텍스트를 실행 가능한 자바스크립트 코드 현태로 변환하는 메커니즘을 유해하다고 간주 -> 문자열 형태로 입력 받는 함수의 실행은 모두 차단

  • CSP 우회에는 신뢰하는 도메인에 업로드, Nonce 예측 가능, Base-uri 미지정이 있다.