네트워크/모의해킹

PHP기준 파일 업로드 필터링 우회

강똥이 2019. 8. 14. 10:17

파일 업로드 취약점을 이용해 웹쉘을 업로드 할 수 있을 경우 그에대한 파급력은 상당합니다.

이를 막기위해 다양한 방법을 이용해 필터링을 적용할 것입니다.

이에대해 우회할 수 있는 방법이 존재합니다.

(모의)해킹을 시도하는 사람에게는 행복한 경우일 것이고, 보안하는 입장이라면 상당히 골치 아플것입니다.

 

효과적으로 파일 업로드를 이용할 수 있는 경우를 살펴보고자 합니다.

 

리눅스(유닉스)기반 운영체제에서 apm환경을 예시로 들고 있습니다.

 

1. 블랙리스트 기반

 - 대소문자 구분 확인 : Php, pHp, PhP ...

 - .htaccess 업로드

   파일 내용 : addType application/x-httpd-php .cmd

   위와같이 파일내용을 작성하여 업로드가 가능해진다면, cmd확장자 파일이 php파일로 해석될 것입니다.

   단, /etc/httpd/conf/httpd.conf 파일설정에 Allowoverride 의 설정이 All로 되어있어야 가능합니다.

 - 윈도우의 경우 빈 확장자 업로드가 가능합니다.

 - multiple extensions을 이용합니다.

   리눅스의 경우 윈도우처럼 마지막에 있는 확장자가 최종 확장자로 되는것이 아닌 mime.types에 있는 확장자를 우선     확인합니다.

 

2. 화이트리스트 기반

 - 핸들러, mime가 동시에 설정되어 업로드 한 경우 핸들러에 우선 적용하는 설정오류로 인한 취약점을 이용할 수 있습     니다.

 

3. 이외의 파일 업로드 우회 사례

  3.1. 컨텐츠 필터링 우회
php 인터프리터는 <? ?> 가 만나면 php 명령을 해석 시작
즉 이미지 파일에 php코드를 삽입하면 실행 가능
jpg 파일의 경우 프로그램을 이용해 삽입하여 업로드 후 실행
png의 경우 헤더가 간단하여 파일끝에 php코드 삽입 후 업로드 실행

 3.2. 디폴트 관리자 페이지
아파치는 war웹 아카이브를 배포하는 기능이 존재
즉 배포할때 웹쉘 파일이 업로드를 할 수 있다.

 3.3. 네트워크 서비스
관리자페이지 노출

 3.4. 인크루전 파일 취약점 이용
/etc/php.ini 에서 원격으로 php를 실행할 수 있는 기능이 활성화 되어있어 웹쉘(배포 url)실행 가능
원격으로 실행할 경우 url인코딩으로 전달되기 때문에 첫번째 문제 발생
url 이 변경이 되지 않는 경우는 실행 가능

 

 

파일 업로드 필터링 우회 대응 방안입니다.

 - /etc/httpd/conf.d/php.conf

<FilesMach \.php$> setHandler application/x-httpd-php </FilesMatch>

   위와같이 설정하게된다면 핸들러 우선 적용하는 취약점을 어느정도 예방할 수 있습니다. 위의 내용은 php를 우선 적     용한다는 내용입니다.

 - 웹 루트 외부에 파일을 저장하도록 설정합니다.

 - /etc/httpd/conf/httpd.conf설정에 AllowOverride 설정을 None으로 합니다.

 -  .htaccess 파일을 아래와 같이 입력 후 저장하면 저장한 디렉터리안에 php|php.kr 파일의 접근을 차단(우회 가능)

<Files ~ "\.(php|php.kr)$">
        Order allow,deny
        Deny from all
	</Files>


 -  .htaccess 파일을 아래와 같이 입력 후 저장하면 저장한 디렉터리안에 모든 파일을 html파일로 해석

<Files *>
		SetHandler default-handler
	</Fiels>


 -  /etc/httpd/conf/httpd.conf 파일을 아래와 같이 입력 후 저장하면 지정한 경로 밑에 있는 모든 php해석을 안함(html 파일로 해석)

	<Directory /var/www/html/uploads/> // 파일 업로드 경로
		php_admin_value engine off
	</Directory>
	
	<Directory "/var/www/html">

 - 악의적인 함수 차단합니다.

   /etc/php.ini 파일의 내용을 아래와같이 추가합니다.

disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source