1) LOW
웹쉘 파일 다운로드
- https://github.com/SecuAcademy/webhacking/blob/master/webshell.php
http://127.0.0.1/dvwa/hackable/uploads/webshell.php?cmd=ls+-al
아무런 대응 방법이 없어서 웹셀업로드 및 실행이 간단히 실행되는 것을 알 수 있다.
2) medium
버프스위트로 잡아준다음 Content type 의 값을 image/jpeg 로 바꿔서 전달하면 업로드가 된다.
3) high
파일 확장자를 jpg, jpeg, png 인지 확인하며 getimagesize 함수로 실제로 이미지 파일인지 확인하고 있다.
(참고 : http://blog.habonyphp.com/entry/php-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%A0%95%EB%B3%B4-%EC%B6%9C%EB%A0%A5%ED%95%98%EB%8A%94-getimagesize-%ED%95%A8%EC%88%98#.W1GhzOSQw2w)
그러나 아래와 같이 해당 파일을 실행하면 에러가 발생한다.
이런 경우 파일 인클루드 공격을 통해 업로드된 경로를 입력하면 공격이 수행된다.
http://localhost/dvwa/vulnerabilities/fi/?page=file/../../../hackable/uploads/webshell.php.jpg&cmd=ls%20-al 와 같이 입력해야 명령이 수행된다.
즉 이 경우에는 파일업로드 + 파일 인클루션 + 패스트래버설 을 조합하여 웹 사이트 공격을 수행 한 것이다.
4) impossible
high 와 같이 확장자를 검사했지만 아래 소스 부분에서 이미지 파일을 다시 생성하려하고 있다. 그래서 무늬만 jpg 파일의 업로드를 차단 할 수 있다.
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
그 외에 다음과 같은 대응방법이 있을 수 있다.
- 업로드되는 파일의 이름을 랜덤하게 생성하는 방법
- 업로드 되는 서버를 웹 서버와 분리하는 것도 방법이 된다.
- 업로드 폴더의 실행권한을 제거