ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] Challenge 41 풀이
    Wargame/Webhacking.kr 2019. 5. 25. 18:33

    이번 문제는 파일 업로드 취약점과 관련된 문제이다.

     

    Challenge 41 첫 화면

     

    일단 아무 빈 파일을 업로드해봤더니 Done~이라는 메시지가 출력됐다.

     

     

    index.phps로 들어가서 소스를 확인해보자. 

     

    index.phps

     

    업로드한 파일명을 $fn에 저장하고, 파일명에 /, \, htaccess, .htaccess이 들어가거나 파일명이 10자가 넘어가면 페이지를 종료한다. 또한 파일명에 .(온점), <, >이 들어가면 이를 공백으로 필터링한다.

     

    그 다음 $cp 변수에 웹서버에 저장된 임시 파일명을 저장하고, copy 함수를 사용하여 해당 파일을 $hidden_dir/$fn으로 복사한다. 그리고 $hidden_dir/$fn 파일을 쓰기 모드로 열어 패스워드를 파일에 입력하면 코드가 종료된다.

     

    따라서 패스워드를 알아내기 위해서는 $hidden_dir을 알아야 한다.

     

    copy 함수는 파일을 복사해주는 함수인데, 여러 취약점을 갖고 있다.

    • 파일 이동 시 오류가 발생하기 쉽다.
    • 시스템이 허용 가능한 파일의 크기보다 크기가 큰 파일을 업로드하는 경우 오류가 발생한다.
    • 허용하지 않는 인코딩 방식을 사용하는 경우 오류가 발생한다.
    • 복사할 파일이 없는 경우 오류가 발생한다.

     

    이 중에서 문제를 해결하기 위해 이용할 취약점은 "복사할 파일이 없는 경우"이다.

    파일명에 공백으로 필터링되는 문자(<, >, .)를 삽입하면, 파일이 업로드될 때 파일명이 공백이 되어 copy 함수에서 오류가 발생할 것이다.

     

    일반적으로 파일명에는 특수문자를 포함할 수 없으므로, Burp Suite를 이용해 파일명에 <>를 삽입하여 전송하자.

     

     

    파일명이 <>인 파일을 전송하였더니 아래와 같은 오류 문구와 함께 $hidden_dir의 위치가 나타났다.

     

    $hidden_dir의 위치를 알았으니 이제 정상적으로 파일을 업로드한 후 $hidden_dir/업로드한 파일 경로로 이동하여 패스워드를 확인하면 된다.

     

     

    파일명에 .확장자가 포함되어 있는 경우, .은 필터링이 되기 때문에 파일 경로 입력할 때 .은 빼줘야 한다.

     

    (패스워드는 업로드한 파일에 따라 다르다.)

     

     

Designed by Tistory.