File Upload Vulnerability [4]

DATE : 2023/9/18

File Upload Vulnerability - Labs

이번엔 볼 LAB에서는 파일 업로드 취약점 뿐만 아니라 path traversal vulnerability도 존재하며

파일 업로드 공격을 예방하기 위해서 사용자가 제출한 파일은 실행 되지 못하도록 설정되어 있다고 한다.

Path Traversal Vulnerability

path traversal 취약점은 다른 말로 directory traversal 라고도 한다.

이름에서 유추할 수 있듯이 서버 관리자 의도한 경로가 아닌 다른 경로(directory)로

이동할 수 있는 취약점을 의미한다.

서버에서는 사용자가 업로드한 파일을 설정된 경로로 올리게 되는 데

이때 경로에 따라 실행할 수 있는 유형의 파일이 있더라도 실행하지 못하게 설정할 수가 있다.

그렇게 되면 사용자가 악의적인 목적을 가지고 web shell과 같은 파일을 올려도

서버에서는 이 파일이 올라간 directory 내의 파일은 실행시키지 않기 때문에

원하는 결과를 얻을 수 없게 된다.

이런 상황에서 또 다른 취약점, Path traversal 공격을 이용해 원하는 파일을 실행시키는 거 까지!

어떻게 성공할 수 있을 지 LAB을 통해 확인해보자. 😄


[ LAB#3 ]

LAB으로 들어가면 여느 때와 마찬가지로 My account 버튼을 통해 login 페이지를 가져올 수 있다.

wiener:peter 계정으로 로그인을 해주고

이전 LAB에서도 사용한 webshell.php file을 업로드해준다.

성공적으로 업로드 되었다는 문구를 확인한 후

해당 경로를 URL 바에 입력해주면..!

엥? PHP code가 실행된 결과가 아닌 PHP code 그 자체의 내용을 보여주고 있다.

packet을 확인해보면 /files/avatars/webshell.php를 실행하는 request를 보냈고

이에 webshell.php 내용이 그대-로 적힌 response를 받았다는 걸 알 수 있다.

위에서도 말했듯이 서버에서는 지금 파일 업로드 공격을 막기 위해

사용자가 업로드한 파일이 들어있는 경로에서는 (/files/avatars)

PHP와 같이 실행 가능한 파일이라도 실행시키지 않고 있다.

따라서 우리는 파일을 작성해서 업로드 할 수는 있지만

지금 상태로는 request를 보내도 파일 실행까지는 무리라는 것..! 😧

이런 상황에서 사용할 수 있는 다른 공격 방법이 바로, path traversal attack!

현재 사용자가 파일을 업로드하면 서버에 있는 /files/avatars directory로 파일이 올라가고 있다.

우리는 path traversal sequence를 사용해 다른 directory로 파일이 업로드 되도록 할 것이다!! 💡

업로드 할 경로를 바꿔주기 위해 packet을 잡아보자 ~_~

Intercept ON!!

파일을 업로드 하는 순간의 packet을 잡아보면

업로드 할 파일에 대해 filename="webshell.php"인 상태를 볼 수 있을 것이다.

파일 이름 앞에 path traversal sequence인 ../ 를 붙여 packet을 보내보자.

결과를 보면

흠.. sequence를 제거하는 기능이 있는 지 아까랑 동일한 경로로 파일이 업로드 되었다고 한다.

그렇다면 Encode를 하면 어떨까??

Burp suite - Decode Tab으로 가서 ../을 입력한 뒤 URL encode를 하면

쉽게 encode한 값을 얻을 수 있다.

다시 돌아와 이번에는 encode한 sequence 값을 파일 이름 앞에 붙여 보내봤다.

결과 문구를 보면 이번엔 성공적으로 sequence가 사용된 듯하다!

지금 path traversal sequence로 사용하고 있는 값은

현재 directory에서 상위인 directory로 한 번 빠져나가라는 의미이다.

따라서 원래 업로드 경로인 /files/avatars directory에서 한 번 빠져 나온

/files directory에 파일이 업로드 되고 해당 경로를 URL 바에 입력하면

이번엔 PHP code 내용이 아닌 PHP code가 실행된 결과 값을 얻을 수 있게 된다!! 👏

(이 flag도 submit해주면 LAB 해결 완료!)

Last updated