-
[Webhacking.kr] Challenge 41 풀이Wargame/Webhacking.kr 2019. 5. 25. 18:33
이번 문제는 파일 업로드 취약점과 관련된 문제이다.
일단 아무 빈 파일을 업로드해봤더니 Done~이라는 메시지가 출력됐다.
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/업로드한 파일 경로로 이동하여 패스워드를 확인하면 된다.
파일명에 .확장자가 포함되어 있는 경우, .은 필터링이 되기 때문에 파일 경로 입력할 때 .은 빼줘야 한다.
(패스워드는 업로드한 파일에 따라 다르다.)
'Wargame > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Challenge 48 풀이 (0) 2019.05.25 [Webhacking.kr] Challenge 47 풀이 (0) 2019.05.23 [Webhacking.kr] Challenge 59 풀이 (0) 2019.05.19 [Webhacking.kr] Challenge 54 풀이 (0) 2019.05.19 [Webhacking.kr] Challenge 39 풀이 (0) 2019.05.18