Lab: Web shell upload via path traversal 문제풀이

해당 페이지에 들어가 로그인을 하게 되면 파일 업로드가 가능하다. 이번 문제에서는 이것을 이용하여 웹 쉘을 만들어야 한다.

아래는 파일을 업로드하였을때 발생하는 요청을 확인한 것이다. 내용을 보게되면 이미지 데이터를 읽어와 서버로 보내는 것을 확인할 수 있다.

그리고 내가 업로드한 이미지를 우클릭하여 경로 복사하면 아래 처럼 경로가 files/avatars/cat1.jpg로 나오는 것을 알 수 있다.

https://bb7c0d2448900c3005c.web-security-academy.net/files/avatars/cat1.jpg

이를 이용해 아래와 같이 filenmae과 내용을 system이라는 쉘을 만들어 업로드해 실행시켜보았다.

하지만 화면상으로 보여지기만 하지 실행되지 않았기 때문에 이 경우 첫번째로 생각할 수 있는 경우는 확장자를 지정하여 특성 확장자만 실행되도록 코드가 짜져있기 때문에 이를 위회하기 위해서 모든 종류의 확장자를 대입해 보아야 한다. php의 경우  아래 처럼 여러 확장자가 존재한다.

위 확장자로 다 대입을 하였는데 안되었다. 이 경우 php라는 단어를 자체를 필터링하여 올리는 경우가 존재하기 때문에

phphpp 같은 형식의 확장자로 올려도 보았지만 작동안하는 것은 매한가지 였다.

그래서 생각해 낸게 해당 폴더에서는 읽기만 가능하도록 권한 설정한 것으로 파악하여 다른 경로에 파일을 저장하도록 하였다. 서버가 작동하기 위해서는 php 파일을 무조건 읽어야하기 때문이다.

그래서 파일 이름을 ../name.php 라는 형식으로 적어 해당폴더 전 경로에 name.php를 저장하게 하였다.

그랬더니 아래와 같이 ../써도 name.php라고 적혀있을 것을 볼 수 있다. 다른 위치에 /를 넣으면 자동으로 해당 위치 위로 파일이름을 잘라내는 것 같았다. 이는 인코딩 후 잘라낸다음에 디코딩하는 것으로 예상이 되어 미리 인코딩한 것을 넣고 디코딩시 해당 / 문자를 인식하지 못하도록 하여 잘라내지 못한 상태로 디코딩하여 입력과 똑같이 나오도록하였다.

url에서 / 인코딩은 %2f 이고 아래에 정리를 해놓았다.

%26 &
%2F /
%3A :
%3F ?
%3D =

..%2fname.php 로 하였더니 정상적으로 avatars/../name.php의 경로에 저장되었다. (../)라는 문자는 전 폴더에 저장하라는 위치이니 avatars가 있는 경로에 저장된 것을 확인할 수 있다.

아래와 가이 files라는 경로에서 flag를 찾아내었다.

+ Recent posts