본문 바로가기
Web/Webhacking.kr

Webhacking.kr Challenge old-41 문제 풀이

by jh117jh 2024. 2. 6.
728x90

 

문제를 보면 파일 업로드 기능이 있다.

 

먼저 소스코드부터 살펴보자 

 

코드를 보면 파일 이름을 받아 ., <, >, /을 필터링 하고 있고 ./{$upload_dir}/{$fn}경로로 내가 올린 파일을 복사해 flag값을 넣어주고 있다. 즉, {$upload_dir} 값을 알면 flag값을 알 수 있을 것이다.

 

error_reporting(E_ALL);
ini_set("display_errors"1);

소스코드에 위와 같은 코드가 있는데 이는 에러메시지를 출력해 주는 코드이다.

이게 무슨 취약점을 가지냐면 만약 에러가 발생할 경우 해당 디렉토리 경로까지 같이 출력되어 사용자에게 경로가 노출될 수 있다.

고로 배포 단계에서는 이 코드를 변경하여 에러메시지가 출력되지 않게 하는게 안전하지만 이 문제에서는 에러메세지가 출력되고 있다.

 

파일을 선택하지 않은채 업로드를 하면 에러메세지가 출력되며 디렉토리경로가 노출되는걸 볼 수 있다.

 

이를 통해 {$upload_dir} 값을 알아내보자

 

처음에는 용량이 큰 파일을 올려 에러메시지를 나오게 할까 했는데 10기가 이상이 여야 되므로 찾기가 쉽지 않았다.

두 번째 방법으로 생각한 게 파일 이름 길이제한이다.

 

파일 이름은 기본적으로 255자로 제한되어 있으며 이를 넘길 시 에러가 일어날 것이다.

 

 

파일 이름을 255자 이상으로 늘려 업로드하면 

 

 

파일 이름이 너무 길다는 에러메시지가 출력되면서 ./4b0e87fef7b5e8ba83894970c9806042e5d6ec9a/ 디렉토리 경로가 노출된다.

이제 디렉토리 경로를 알았으니 

 

대충 찾기 쉬운 이름으로 파일을 올리고 

 

 

디렉토리와 파일이름을 적어주면 flag값을 확인할 수 있다.

 

flag값에서 볼 수 있듯이 에러메시지에 관한 문제였다.

728x90