정보보안공부

Web - 파일업로드(APM 환경) 본문

Web

Web - 파일업로드(APM 환경)

Steady_sp 2019. 10. 21. 00:42

@@ 블랙리스트 필터링

- 블랙리스트로 지정한 확장자만 필터링하는 경우 여러가지 우회하는 기법들이 존재한다.

 

** 확장자 대소문자 치환

- 확장자중 한글자를 대문자로 치환하는경우 우회 가능

- strtolower을 통해 무조건 소문자로 변환하여 검증되도록 코드를 작성해야 함.

 

** PHP 기본설정 확장자

- php.conf 에서는 PHP 인터프리터의 스크립트 확장자를 설정할 수 있다.

 

버전 초기 설정된 확장자
PHP 3.x .php .php3 .phtm3
PHP 4.x .php
PHP 7.x .php .php3 .php4 .php5 .php7 .pht .phtml

1) PHP 인터프리터의 스크립트 확장자 설정

#> vi /etc/httpd/conf.d/php.conf

- 설정파일을 확인해 보면 php 확장자만 등록되어 있지만, 버전별로 초기 설정에 php이외 다른 확장자 php3, phtml 등 여러가지 확장자가 등록되어 있다.

ex) AddType application/x-httpd-php .php

- 운영자가 추가한 확장자 명(htm, html, inc, phtml, bak 등)을 알 수 있다면 해당 확장자를 사용해 업로드가 가능하다.

ex) AddHandler cgi-script .cgi

 

2) CGI 인터프리터 설정

#> vi /etc/httpd/conf/httpd.conf

- 설정파일을 확인해 보면 cgi-script에 다양한 CGI 인터프리터가 등록되어 있을 수 있다. 해당 인터프리터의 설정 여부에 따라서 ".cgi" ".pl" ".pm" ".py" 등의 확장자로 해당 언어에 맞는 웹쉘 업로드가 가능하다.

 

** mod_mime 모듈

- mod_mime 모듈은 파일에 하나 이상의 확장자가 지정되어 있을 경우 국가코드(kr)와 인코딩을 제외, 미디어 타입에 매핑된 확장자가 하나 이상일 경우 최우측에 있는 확장자로 인식한다.

- test.php.kr 로 업로드하면 kr이 국가코드이므로 해당 파일 실행 시 좌측에 있는 php 확장자로 인식한다.

 

** 다중확장자 취약점

#> vi /etc/httpd/conf.d/php.conf

AddType application/x-httpd-php .php
AddHandler php5-script .php

- php.conf에 AddType이 위와같이 설정되어 있는 경우 또는 AddHandler가 위와같이 설정되어 있는 경우 다중확장자 취약점이 존재한다.

- 다중확장자를 사용할 경우 메타 데이터에 타입이 정의된 우측 확장자를 따르지만, "hello.php.xxx" 또는 "hello.php.aaa" 등 "/etc/mime.types", "httpd.conf", "php.conf"등에 정의가 없는 확장자일 경우 해당 확장자(.xxx .aaa)는 제외하고 인식된다.

 

** htaccess 분산 설정 파일

- 아파치 분산 설정 파일인 ".htaccess"를 이용하여 우회 시도가 가능하다.

- httpd.conf 에 "AllowOverride" 설정이 허용("None" → "All")되어 있어야 가능하다.

- ".htaccess"의 기능이 활성화되어 있다면 PHP 인터프리터에 임의의 확장자 지정이 가능하다.

AddType application/x-httpd-php .abc

- 위의 내용으로 임의의 디렉토리 내 .htaccess 파일을 업로드 할 경우 .abc 확장자로 웹쉘을 올리면 PHP 스크립트 파일로 인식되어 웹쉘이 실행된다.

 

<결론>

- 블랙리스트 필터링은 원리상 발생 가능한 모든 확장자를 리스트하여 차단해야만 안전하다고 볼 수 있다.

- 기본적으로 "php.conf"의 PHP 인터프리터에서 지원하는 모든 스크립트 확장자를 차단하고 "http.conf"의 환경설정을 검토하여 문제가 없도록 설정을 변경해야 한다.

 

@@ 화이트리스트 필터링

** 다중확장자 취약점

# 아파치에서의 다중확장자 처리

- 메타정보에 매핑되는 확장명이 2개 이상 있는 경우 ( ex. php, jpg, png 등등) 언어 및 콘텐츠 인코딩을 제외하고 오른쪽에 있는 확장명이 사용된다. 예를들어 .gif는 MIME 유형 image/gif에 매핑되고 .html이 MIME 유형 text/html에 매핑되면 hello.gif.html 파일은 MIME 유형 text/html과 연결된다.

 

- 하지만 hello.php.jpg인 파일의 경우 오른쪽에 있는 .jpg 확장자로 인식해야 정상이지만 PHP 스크립트로 인식되어 다른 문제점이 추가로 존재한다. 이 경우는 "php" 확장자를 매핑할 때 "AddHandler" 지시자를 사용하고 있기 때문에 발생된다.

 

#> vi /etc/httpd/conf.d/php.conf

AddHandler php5-script .php

- 위와 같이 php.conf가 설정되어 있다면 다중 확장자가 MIME 타입 및 핸들러에 모두 매핑되는 경우 핸들러에 의해서 우선적으로 처리되기 때문에 hello.php.jpg의 경우 우측 확장자인 .jpg가 아닌 .php 확장자로 인식된다.

 

<결론>

- 다중확장자가 MIME 타입과 정의되지 않은 확장자인 경우 정의되지 않은 확장자는 제외하고 인식된다.

-> AddType 또는 AddHandler 둘중 하나만 정의되어 있을 경우

- 다중확장자가 MIME 타입과 MIME 타입의 확장자인 경우 우측 확장자 기준으로 인식된다.

-> AddHandler가 정의되어 있지 않을 경우

- 다중확장자가 MIME 타입과 MIME 타입의 확장자 및 핸들러에 매핑되는 경우 핸들러에 정의된 확장자로 인식된다.

-> AddHandler가 정의되어 있을 경우

 

-- 대응방안 --

#> vi /etc/httpd/conf.d/php.conf

<FilesMatch \.php$>

     SetHandler application/x-httpd-php

</FilesMatch>

- 다중확장자 처리 취약점을 대응하기 위해서는 위와같이 <FilesMatch> 블록을 사용하여 정규식으로 우측 확장자가 ".php"인 경우만 PHP 스크립트로 처리되도록 설정하면 된다.

 

 

 

 

 

 

 

 

 

Comments