[취업반 스터디 4달 2주차]

Minseok Jo·2024년 2월 18일
post-thumbnail

[4달 2주차 주제 : Fild Upload]


1. File Upload 란?

1) File Upload 공격이란?

File Upload: 공격자가 원하는 임의의 파일을 업로드 할수 있는 공격

2) 발생 원인

  • 웹 서버에서 업로드 되는 파일을 검증하지 않고 저장하기 때문

3) 발생 위치

  • 파일을 업로드할 수 있는 곳 (ex. 프로필 사진 업로드, 게시판 첨부파일)

4) 공격 시나리오

서버측 실행 파일 업로드

  • PHP 코드가 서버 측 실행 코드 중 하나이다.
  • PHP 파일을 업로드 후 그 파일을 요청하게 되면, 서버가 PHP파일을 실행하게 된다. (웹서버의 역할)
  • 즉, 서버를 통해 원하는 코드를 실행할 수 있고 이는 서버가 공격자의 것임을 의미한다.

피싱(Phising) 유도

  • 로그인 페이지와 똑같은 HTML파일을 만들어 업로드 할 수 있다.
  • 이용자들이 이 피싱 사이트에 아이디/비밀번호를 입력하면 공격자 서버로 전송이 되게 작성이 가능하다.

Deface 공격

  • index 파일을 업로드하여, 기존 파일을 다른 파일로 overwrite할 수 있다.

Stored XSS

DoS (Denial Of Service)

  • 대용량 파일을 업로드 함으로써 서버의 용량을 가득 채울 수 있다.

2. 서버 측 실행파일 : Web Shell

1) Web Shell 이란?

  • 서버에 임의의 명령을 내릴 수 있는 서버 측 실행 파일
<?php
	echo system($_GET['cmd']);
?>

2) 파일 업로드 공격 절차

1. 웹쉘 파일 작성

web_shell.php 작성

2. 해당 웹쉘 파일 업로드

(1) Fild Upload 취약점이 있는 페이지

(2) 작성한 Web Shell 파일 업로드

3. 업로드된 파일 요청

URL을 통해 파일 요청
○ 아직 cmd 파라미터를 전달하지 않아 오류 발생

4. 명령어 전달

Burp - Repeater 를 통해 cmd 파라미터에 명령어 전달


3) Web Shell 공격의 핵심

  • 웹 서버에서 실행할 수 있는 파일을 업로드할 수 있어야 한다.
      php · jsp ·asp · exe · .sh · .bat

  • 업로드 된 파일의 경로를 알아야 한다.
      해당 파일을 요청(실행)하기 위함이다.
      업로드 된 파일이 출력되는 위치 확인 / 이미지의 경우 이미지 주소 복사


3. File Upload 우회 Case

1. MIME 타입을 검사하는 경우

  • 웹(HTTP)을 통해 전달되는 데이터의 타입
  • Content-Type 헤더에 인코딩 종류가 명시되어 있다.
(1) web_shell.php 의 MIME 타입

(2) MIME 타입 검사 결과, image 파일만 업로드 가능

(3) Proxy를 통해 업로드 되는 web_shell.php 파일의 Content-Type 변조

(4) Content-Type 우회로 웹 쉘 업로드 성공



2. 파일이 업로드 되는 경로의 실행권한이 없는 경우

  • 파일 이름에 경로(../)를 추가함으로써, 파일이 저장되는 경로 변경
(1) Burp Suite 의 Intercept 상태에서 웹셀 파일 업로드

(2) file name에 경로(../) 를 추가하여 파일이 저장되는 경로 변조하여 업로드



3. 블랙리스트 기반의 필터링이 적용되어 있는 경우

  • Php , pHp , pHP 등 대소문자 혼용으로 우회
  • 이중 확장자 사용 (web_shell.jpg.php)
  • .phtml .php3 .php5 도 php확장자 대신 사용 가능
다른 확장자 예시



4. 특정 확장자를 사용할 수 없도록 설정한 경우

  • 업로드 파일의 확장자만 보고 파일을 판단하는 경우, 이중확장자를 사용하여 우회

1) test.png.php
파일이름(test) 바로 뒷부분으 png 이므로 파일이 업로드 되는 경우가 존재한다.
그러나, 실제로는 php 파일이므로 실행이 가능하게 된다.


2) test.php%00.png
업로드할때 png로 인식되지만, 시스템에 등록될때는 %00(NULL) 바이트에 의해 뒷부분이 없어져 test.php로 반응되게 된다.


3) test.php.png의 경우?
1) 과 2)의 경우처럼 뒷부분이 php로 끝나야만 php 확장자로 생각되고 실행가능하다.
따라서 이 경우가 가능하려면 htaccess 파일이 먼저 업로드되어야 한다.

htaccess : 웹 서버에 사용되는 구성파일로서, 특정 확장자에 따른 실행 동작을 설정한 뒤, 이를 Directory Traversal 취약점을 이용하여 기존 파일을 덮어씌우면 실행가능하게 된다.




5. 파일 시그니처로 탐색하는 경우

파일 시그니처

- 이미지 파일 뒤에 웹쉘 코드를 작성해주면 된다.
  1. File name에서 확장자를 php로 변경
    그림 파일 안의 웹쉘 코드도 php파일로서 인식이 되어야하기 때문에 확장자를 변경하여 업로드 되는지 확인

  2. 시그니처 맨아래에 웹쉘 코드 작성
    업로드 되어 실행되게 되면, 시그니처 맨 뒤의 웹셀 코드에 의해 실행된 명령어 결과가 같이 출력된다.



4. File Upload 대응방법

1) BLOB / CLOB 방식으로 업로드 파일을 DB에 저장
기존은 업로드 되는 파일이 웹서버에 저장되었기 때문에 실행될 수 있었다.
그러나, DB테이블 안에 Binary 형태로 존재하는 경우 실행할 수 없게 된다.

2) NAS
: 웹서버와 파일이 저장되는 서버를 분리하는 방식
분리되어 있는 서버에 실행엔진이 적용되어있어서는 안된다.

3) 파일 검증 방법

  • 확장자 검증
  • 파일 시그니처 검증
  • MIME Type 검증


5. 모의해킹 시 파일 업로드 취약점 주의점

  • 허락 없이 진짜 웹쉘을 올리면 안된다.
    서버 측에서 실행된다는 것을 증명하기 위한 용도의 코드(POC코드)를 먼저 사용

0개의 댓글