PHP기준 파일 업로드 필터링 우회
파일 업로드 취약점을 이용해 웹쉘을 업로드 할 수 있을 경우 그에대한 파급력은 상당합니다.
이를 막기위해 다양한 방법을 이용해 필터링을 적용할 것입니다.
이에대해 우회할 수 있는 방법이 존재합니다.
(모의)해킹을 시도하는 사람에게는 행복한 경우일 것이고, 보안하는 입장이라면 상당히 골치 아플것입니다.
효과적으로 파일 업로드를 이용할 수 있는 경우를 살펴보고자 합니다.
리눅스(유닉스)기반 운영체제에서 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