File Upload Vulnerability [5]
DATE : 2023/9/20
Last updated
DATE : 2023/9/20
Last updated
지금까지 살펴본 파일 업로드와 관련된 개요는
(1) 파일 업로드 취약점이 무엇인지
(2) 파일 업로드와 관련된 그 어떤 조치도 취하지 않은 경우
(3) 파일 유형을 확인해 특정 파일만 승인하는 경우(Content-Type header)
(4) 파일이 업로드 되는 경로의 폴더에서는 파일 실행을 허용하지 않는 경우 (path traversal)
와 같이 정리할 수 있다.
파일 업로드 공격을 막기 위해서는 파일 유형(확장자), 파일 내용, 파일 크기 등
적절한 요소를 검사하는 과정을 거쳐야 한다고 얘기한 바 있다.
이번에 살펴볼 LAB은 어떤 방법으로 파일 업로드 공격을 막고 있을 지.. 확인해보자!
LAB으로 들어가 로그인을 해준 다음
이전과 동일하게 webshell.php를 업로드 해보면
PHP file은 업로드할 수 없다고 한다.
우리는 shell을 업로드한 다음 실행시켜야 함으로 php, asp와 같은 확장자를 사용하기는 해야 한다.
업로드 가능한 확장자를 찾기 위해 이것저것 넣어보았더니 phtml extension 말고는
모두 업로드가 가능한 걸 알아낼 수 있었다.
파일 확장자를 변경한 후 (php -> php5) packet forward!
성공적으로 파일이 업로드 되었다고 하니 이제 실행시켜보자.
URL 바에 /files/avatars/webshell.php5를 입력했더니!
php, phtml을 제외하고 php를 대신하는 확장자 파일은 업로드는 되지만
서버에서 파일 내용을 실행하지는 않는 듯하다.
이전 LAB에서는 path traversal attack으로 다른 directory에 파일 업로드했지만
이번엔 path traversal 공격이 유효하지 않은 상황이다.
이럴 땐 어떻게 해야 하는가..!!
본질적인 문제는 서버에서 php5를 실행할 파일로서 인식하지 않고 있는 것이다.
위에 첨부한 사진에서는 안 보이지만 packet 내용을 확인할 때 response 부분을 보면
Server header가 포함되어 있는 걸 볼 수 있다.
Server header는 현재 동작하고 있는 서버가 무엇인지, 버전이 어떻게 되는 지를 알려준다.
따라서 이 header로 대상 서버가 Apache server라는 정보를 얻을 수 있다.
Apache server는 .htaccess 파일에
어떤 파일 확장자를 어떤 유형(content-type)으로 인식하면 되는 지를 설정할 수 있는 데
이런 식으로 작성하면 이 서버로 올라가는 ltt 라는 확장자 파일은 php로 인식해!라는 뜻이다.
이 개념을 활용해 .htaccess file을 덮어쓰도록 파일 하나를 더 업로드해줄 것이다.
파일 업로드 버튼을 눌렀을 때 만들어지는 packet을 위와 같이 수정해준다.
이 파일이 정상적으로 올라가면 .hh 확장자 파일은 이제부터 php로 인식될 것이다.
파일이 정상적으로 업로드 되었다는 문구를 받고 나서
.hh 확장자로 webshell을 올려준다.
업로드 후 URL에 /files/avatars/webshell.hh를 입력하면
파일 내용이 그대로 출력 되고 있다???
이번엔 PHP code가 실행된 결과로 flag를 얻을 수 있을 것이다.