본문 바로가기

WEB HACKING

[SWING] Web Hacking 06

File Vulnerability

 

 

File Download

공격자가 임의의 파일을 다운로드 받을 때,

설정 파일, 패스워드 파일 등 민감한 정보를 탈취하는 취약점

 

시스템 내부 -> 파일 -> 파일 다운로드 -> 시스템 정보 획득

 

File Upload

공격자가 파일 시스템 상 임의의 경로에 원하는 파일 즉, 악성 확장자를 갖는 파일을 업로드할 수 있을 때 발생하는 취약점

 

파일 업로드 -> 악성코드 업로드 -> 시스템 접근 파일 -> 시스템 정보 획득

 

File Download

 

웹에서 파일 다운로드 시 파일의 경로 및 파일명을 파라미터로 받아 처리하는 경우,

이를 적절히 필터링하지 않으면,

임의의 위치에 있는, 시스템 정보를 얻을 수 있는 중요한 파일을 열람하거나 다운받는 것을 가능하게 한다.

 

fileOpen('/upload/' + $_GET['fileName']);


위와 같이 경로와 이름을 통해 특정 파일에 접근해서 다운로드를 하는데,

이 값들을 조작하면 임의의 파일을 다운로드할 수 있게 된다.

공격 대상 서버에 있는 파일을 불러오는 LFI와 비교를 해보면,

LFI는 파일 경로를 조작하여 해당 서버에 있는 파일을 확인하는 공격이었는데,

/etc/passwd 같은 파일이 아닌 php 코드는 include가 파일을 실행해버리기 때문에 소스코드를 확인하는 것이 어려웠다.

 

하지만 파일 다운로드는 LFI처럼 파일을 실행하는 것이 아니라 말 그대로 파일을 다운로드 받는 것이므로 소스코드도 확인할 수 있다.

따라서 해당 소스코드를 확인해서 취약점을 찾을 수도, DB 계정 정보를 탈취할 수도 있다.

일반적으로 파일 다운로드에 대한 POC(Proof of Concept)로 리눅스라면 /etc/passwd 파일을, 윈도우라면 hosts 파일을 확인한다.

 

 

Path Traversal

경로 탐색 취약점

사용자로부터 받은 입력을 조작하여 공격자가 원하는 경로로 접근하고 동작하게 만드는 기법

파일 이름 등을 사용자로부터 받는 경우,

.../ 같은 구문을 통해 상위 디렉토리로 접근하며,

허용된 디렉토리를 벗어나 시스템 파일 등을 읽을 수 있다.

 

  유닉스 윈도우
최상위 디렉토리 / 드라이버:\
디렉토리 구분 / / 또는 \
상위 디렉토리 이동 ../ ../ 또는 ..\

 

가령 Download.jsp 라는 페이지에서 abc.txt 파일을 다운받으려면 아래와 같이 페이지에 요청하면 된다.

 

http://swing.kr/Download.jsp?file=abc.txt 

 

아래와 같이 상위 디렉토리로 요청하면

/etc/passwd 라는 파일에 접근해 시스템에 등록된 사용자들의 정보를 획득할 수도 있다.

 

http://swing.kr/Download.jsp?file=../../../../../../etc/passwd

 

<대응 방안>

 

파일 다운로드 공격에 대응하기 위해서는 DB로 파일을 관리해야한다.

하지만 파일이름을 ../../../etc/passwd와 같이 저장한다면, 파일을 저장할 때는 문제가 없지만,

실행할 때(다운로드할 때) /etc/passwd 파일을 가져올 수도 있다.

이 경우에는 ../를 필터링해주거나 저장할 때 realpath 같은 디렉토리를 정리해주는 함수를 거쳐서 저장하면 directory traversal에 대응할 수 있다.

다운로드 받는 파일의 확장자를 비교하여 제한하거나,

다운로드 받는 디렉터리의 이름을 static하게 설정하는 것도 방법이다.

 

그리고 무엇보다 절대 경로가 노출되지 않는 것이 가장 중요하다.

filepath 와 filename 값의 정보 노출을 최소화할 수록 좋은 것이다.

 

 

 

 

File Upload

 

공격자가 파일 업로드 기능을 이용하는 것으로,

웹 쉘 이라고 하는 악성 파일을 업로드 후 시스템 명령을 실행하며,

이용자가 업로드 될 파일의 이름을 임의로 정할 수 있을 때 발생한다.

 

<취약점이 발생하는 상황>

 

- 파일 업로드 기능에 적절한 보안 대책이 적용되지 않을 때

ㄴ ex) 파일 업로드 기능 구현 시, 아무 파일이나 업로드 할 수 있게 허용 시

 

- 공격자는 웹 쉘이라고 하는 악성 파일을 업로드하여 시스템으로 침투 후 웹 쉘 접근 및 실행

 

웹 쉘 (Web Shell)

웹을 통해 시스템 명령어를 실행할 수 있는 웹 페이지로,

터미널을 열고 쉘에서 명령어를 실행할 수 있듯이, 웹을 통해 시스템 명령어를 실행할 수 있게 해준다.

 

원격에서 웹 서버를 제어하기 위한 목적으로 만들어졌으나, 지금은 웹쉘 = 악성코드라고 분류를 하여 안티 바이러스에서 탐지한다.

 

html 페이지 마지막에 아래와 같은 코드가 웹 쉘이다.

 

<?php

echo exec($cmd);

?>

 

개발 언어 공격 가능한 확장자
ASP asp, aspx, htm, html, asa
PHP phtml, php, php3, php4, php5, inc, htm, html
JAVA, JSP jsp, jspx, jsw, jsv, jspf, htm, html

 

위의 표와 같이 각 언어는 공격 가능한 확장자에 해당하는 형식의 파일을 업로드할 수 있다.

 

하지만 만약 파일 업로드에 확장자 제한이 있다면?

 

1. 확장자 검사 우회를 통해 파일 업로드

Content-type 검사 로직을 우회하는 것이다.

Burp suite 라는 웹 프록시 툴로 Content-type을 변조할 수 있다.

 

2. Null Byte 를 이용한 파일 업로드

C/C++에서 널바이트 문자열 (%00, 0x00) 은 문자열의 끝을 의미하기 때문에,

널바이트 (%00, 0x00) 다음의 문자열은 무시하게 된다.

 

예를 들자면,

test.jsp%00.jpeg 파일은 test.jsp 로 올라가고,

test.php%00.jpeg 파일은 test.php 로 올라가는 것이다.

 

 

그렇다면 파일 업로드 취약점 공격의 목적은 무엇일까?

 

1. 웹 서버를 통해 데이터베이스의 정보를 획득

  • 데이터베이스를 직접 공격할 수 없기 때문에, 웹 서버에 침투한 후 소스코드 내 데이터베이스 연결 정보를 통해 개인 정보 쿼리(Query)
  • 웹 서버를 통해 데이터베이스의 2차 공격 진행도 가능함

출처 : 보안프로젝트

sql injection 과 다른점

sql injection file-upload
웹에서 노출되는 정보들을 하나씩 가져온다 웹 쉘을 통해 시스템에 침투하고 난 뒤
원하는 데이터들을 마음껏 가져온다

 

 

2. 웹 서버를 시작으로 근접 네트워크 침투

  • 데이터베이스에 직접 공격을 할 수 없기 때문에, 웹 서버를 침투한 후 내부 시스템의 정보 획득
  • 내부 포탈 서버, 로그 서버 등 내부 시스템을 대상으로 포트포워딩(Port Forwarding), 터널링 기법을 통해 공격자와 직접 연결

출처 : 보안프로젝트

 

 

<대응 방안>

 

1. 시큐어 코딩 - 소스코드 레벨 대응

  • 첨부 파일 확장자 검증은 서버 사이드 스크립트에서 검증해야 함.
  • 첨부파일 확장자 검증은 블랙 리스트의 차단이 아닌, "화이트 리스트의 허용"으로 해야 함

2. 시스템 보안 레벨

 

파일이 올라가는 서버의 경우 분리해 관리하고, 모든 실행 권한을 뻬버리는게 좋다.

그러나 비용적 부담이 크다.

  • Apache 설정 파일인 httpd.conf에 해당 디렉토리에 대한 문서 타입을 컨트롤하기 위해 Directory 섹션의 AllowOverride 지시자에서 FileInfo 또는 All 추가
  • 파일 업로드 디렉토리에 .htaccess 파일을 만들고 다음과 같이 AddType 지시자를 이용, 현재 서버에서 운영되는 Server Side Script 확장자를 text/html로 MIME Type을 재조정하여 업로드 된 Server Side Script가 실행되지 않도록 설정

3. 웹셀 차단 솔루션 - 지속적인 모니터링

'WEB HACKING' 카테고리의 다른 글

[SWING] Web Hacking 05  (0) 2022.11.12
[SWING] Web Hacking 04  (0) 2022.11.06
[SWING] Web Hacking 03  (0) 2022.09.24
[SWING] Web Hacking 02  (0) 2022.09.20
[SWING] Web Hacking 01  (0) 2022.09.11