정보보안공부
Web - 파일업로드(APM 환경) 본문
@@ 블랙리스트 필터링
- 블랙리스트로 지정한 확장자만 필터링하는 경우 여러가지 우회하는 기법들이 존재한다.
** 확장자 대소문자 치환
- 확장자중 한글자를 대문자로 치환하는경우 우회 가능
- 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 스크립트로 처리되도록 설정하면 된다.
'Web' 카테고리의 다른 글
Error Based Sql Injection - Mysql (0) | 2019.10.27 |
---|---|
Error Based Sql Injection - Mssql (0) | 2019.10.27 |
SQL Injection - DB별 표현식 정리 (0) | 2019.10.01 |
SQL Injection - DB별 단일행, 단일열 쿼리 (0) | 2019.09.22 |
SQL Injection - Error-Based Sql Injection (0) | 2019.09.22 |