File Upload Basic

오감자·2023년 3월 29일
0

파일 업로드 취약점이란?

웹 서비스를 이용하면서, 파일을 업로드한 경험이 많을 것이다.

네이버 카페나 블로그에서 자료 배포를 위해 업로드하거나,
학교 홈페이지에서 과제 제출을 위해 파일을 업로드 하는 등.

이렇게 업로드 된 파일은 서버 시스템에 저장된다.

그럼, 악성 파일을 업로드한다면?

악성 파일이 서버에 저장되는 것이다.

이러한 원리를 이용한 공격이 바로 파일 업로드 취약점이다.

시나리오

1. 목표 시스템

본 시나리오에서는 ip주소가 10.10.10.10인 임의의 쇼핑몰이미지 파일을 목표로 한다.

2. 취약점 탐색

해당 홈페이지에서 이것저것 클릭하다보니 커뮤니티탭에 글을 쓰고 파일을 올릴 수 있는 부분을 찾을 수 있었다.

글쓰기를 누르면 ,
이렇게 잘 나오고
작성도 잘 된다.

3. 공격 시도

파일 업로드가 잘 되니, 웹 쉘을 업로드하여 해당 시스템을 장악해 보자.

웹 쉘 코드에 관한 정보는 구글에 많으니 잘 찾아보자

Attack1) shell.php 업로드



?!
php는 금지된 확장자라며, 파일 업로드가 거부되었다.

해당 서버는 파일의 확장자를 검사하는 솔루션을 보유하고 있는 것으로 보인다.
아까보니 이미지 파일은 되는것 같고..
txt 파일 등 여타 다른 파일 확장자를 시도해보도록 하자.

방금 양식에서 test.txt파일로 바꾸었다.
txt 파일은 허용된 파일 형식으로 보인다.
이번엔 나도 모르는 파일 확장자를 가진 파일을 업로드해 보았다.
잘 된다.. 화이트리스트 방식은 아닌 것 같다.
html은 금지된 확장자라고 한다.

앞선 과정을 통해 다음과 같이 정리할 수 있다.

1. 해당 사이트는 블랙리스트 방식으로 파일 확장자를 검증한다.
2. php, html 파일은 블랙리스트에 해당하는 파일 확장자이다.

Attack2) 파일 확장자 우회

앞에서 .php 파일은 exploit이 불가능함을 깨달았다.
따라서 .php를 우회하여 웹쉘을 업로드 해야한다.
우회 방법에는 무엇이 있을까?

1. 확장자의 대소문자 변경
2. .php.kr(.php + .kr)
3. htaccess

Attack2-1) 확장자의 대소문자 변경


일단 업로드는 된다.

업로드가 되었으니, 해당 쉘을 실행시켜보자.

해당 쉘을 실행시키기 위해서 파일이 저장되어있는 곳으로 이동해야한다.
주소를 알기 위해 업로드된 자료를 새 탭에서 열어주도록 하자.
해당 url을 통해 이미지 파일이 저 경로에 저장되어 있음을 알 수 있다.

다음으로 업로드한 쉘 파일을 url에 넣어보자
된다 !!
이게되네

Attack2-2) .php.kr(.php + .kr)

이번에는 .php.kr 을 등록해본다.



잘 된다.

Attack2-3) .htaccess

아파치엔 Apache웹 서버의 디렉토리를 설정하는 htaccess 파일이라는 것이 존재한다.
이 파일은 지정한 확장자를 php로 실행시키는 기능이 있다.

우선 .htaccess 파일을 작성한다.

AddType application/x-httpd-php .txt

해당 구문은 .txt 파일을 php로 실행시키겠다는 뜻이다.

이 파일을 업로드한다.

이후 shell.txt 파일을 업로드한다.

아까 주소로 가서 shell.txt 파일을 열어본다.

.txt 임에도 웹 쉘이 잘 실행되는걸 확인할 수 있다.

발생원리

웹 쉘

웹 쉘이란, 웹사이트를 통해 해당 서버에 shell을 여는 행위이다.

Shell : 사용자와 운영체제의 커널을 이어주는 것

이건 위험한 코드인 것 같은데 왜 제공할까?

웹 페이지 또한 프로그램을 통해 운영되는 것이다.
웹 서버에서 실행되는 프로그램을 서버 사이드 스크립트(asp, jsp, php)라고 한다.
이러한 서버 사이드 스크립트는 관리의 용이성 과 디버깅, 다양한 기능 제공을 위해 쉘 코드를 제공한다.

대소문자 우회

php에서 대소문자는 같은 키워드로 취급된다.

따라서, .php와 .Php는 같은 키워드로 취급되므로 php파일이 실행된다.

.php.kr(다중 파일 확장자)

일반적으로 확장자는 filename에서 마지막 마침표 뒤에 나오는 부분이다. 그러나 아파치는 여러 확장자를 인식할 수 있기 때문에, filename에 마침표가 여러 개 포함된 경우 마침표로 구분된 모든 부분을 확장자(extension)로 처리한다. 예를 들어, 파일명 file.html.en은 .html과 .en이라는 두 가지 확장자를 가진다. 아파치 지시어에서 extension에 지정한 값 앞에 마침표가 있어도 되고 없어도 된다. 또, extension은 대소문자를 가리지 않는다.

https://httpd.apache.org/docs/2.4/ko/mod/directive-dict.html

일반적으로 file.txt.php.shtml.en.html 인 파일은 html 로 인식해야 한다. 하지만 아파치는 여러 확장자를 지원하므로 위 설명대로라면 마침표를 분리해 보면 .txt, .php, .shtml, .en, .html 확장자가 나오고 실행 가능한 마임 타입(mime-type)만 4개가 나온다.

확장자가 어디에 위치하든 .php 확장자를 포함하고 있으면 php 핸들러가 php로 해석하고 스크립트를 실행한다는 설명이다.

.htaccess

앞에서 아파치엔 .htaccess라는 파일이 있다고 언급하였다.
그렇다면 이렇게 위험한 파일의 원래 용도는 무엇일까?

htaccess는 hypertext access의 약자로 디렉토리에 대한 설정 옵션을 제공한다.

.htaccess 파일은 컨텐츠 제공자가 디렉토리별로 서버 설정을 다르게하고 싶지만 서버 시스템에 root 권한이 없는 경우에 사용한다. 서버 관리자가 설정을 자주 변경하고 싶지 않은 경우 일반 사용자가 직접 .htaccess 파일을 수정하도록 허용하는 것이 바람직하다. 예를 들어, 한 컴퓨터에 여러 사용자 사이트를 서비스하는 ISP에서 사용자가 자신의 설정을 변경하고 싶은 경우가 그러하다.

https://httpd.apache.org/docs/2.4/ko/howto/htaccess.html

정리하자면, root 권한이 없는 사용자가 디렉토리별 서버 설정을 다르게 하기 위해서 사용되는 파일인 것이다.

하지만, apache에서는 다음의 이유로 htaccess 파일의 사용을 지양한다.

  1. 성능저하
  2. 보안상의 이슈

대신에 주 설정파일인 httpd.conf 파일의 <directory> 태그를 이용할 것을 권장한다.

/www/htdocs/example에 있는 .htaccess 파일 내용

AddType text/example .exm

httpd.conf 파일에 있는 섹션

<Directory /www/htdocs/example>
	AddType text/example .exm
</Directory>

참고로 httpd.conf 파일에 AllowOverride 지시어가 none이면 htaccess를 사용할 수 없다.

AllowOverride None

공격조건

따라서 목표 시스템에 해당 공격을 취하기 위해선 다음과 같은 조건이 선행되어야 한다.

  1. 파일 업로드가 가능한지
  2. php파일을 사용하는지(php 확장자, php 웹쉘, htaccess 사용)

방어방법

앞서 다음과 같은 기법에 의해 해당 시나리오가 발생하였다.

  1. 대소문자 우회
  2. 파일 확장자 우회
  3. htaccess

따라서 다음과 같은 조치를 취해야 한다.

  1. 대소문자를 검증하여 php파일이 업로드 되지 않도록 조치
  2. 파일 확장자 검증

    예를들어, 마지막에 나온 파일 확장자 이외의 점(.)은 언더바(_)로 표시
    filename.a.b.c -> filename_a_b.c

  3. htaccess 비활성화

0개의 댓글

관련 채용 정보