문제를 보면 파일 업로드 기능이 있다.
먼저 소스코드부터 살펴보자
코드를 보면 파일 이름을 받아 ., <, >, /을 필터링 하고 있고 ./{$upload_dir}/{$fn}경로로 내가 올린 파일을 복사해 flag값을 넣어주고 있다. 즉, {$upload_dir} 값을 알면 flag값을 알 수 있을 것이다.
error_reporting(E_ALL);
ini_set("display_errors", 1);
소스코드에 위와 같은 코드가 있는데 이는 에러메시지를 출력해 주는 코드이다.
이게 무슨 취약점을 가지냐면 만약 에러가 발생할 경우 해당 디렉토리 경로까지 같이 출력되어 사용자에게 경로가 노출될 수 있다.
고로 배포 단계에서는 이 코드를 변경하여 에러메시지가 출력되지 않게 하는게 안전하지만 이 문제에서는 에러메세지가 출력되고 있다.
이를 통해 {$upload_dir} 값을 알아내보자
처음에는 용량이 큰 파일을 올려 에러메시지를 나오게 할까 했는데 10기가 이상이 여야 되므로 찾기가 쉽지 않았다.
두 번째 방법으로 생각한 게 파일 이름 길이제한이다.
파일 이름은 기본적으로 255자로 제한되어 있으며 이를 넘길 시 에러가 일어날 것이다.
파일 이름을 255자 이상으로 늘려 업로드하면
파일 이름이 너무 길다는 에러메시지가 출력되면서 ./4b0e87fef7b5e8ba83894970c9806042e5d6ec9a/ 디렉토리 경로가 노출된다.
이제 디렉토리 경로를 알았으니
대충 찾기 쉬운 이름으로 파일을 올리고
디렉토리와 파일이름을 적어주면 flag값을 확인할 수 있다.
flag값에서 볼 수 있듯이 에러메시지에 관한 문제였다.
'Web > Webhacking.kr' 카테고리의 다른 글
Webhacking.kr Challenge old-60 문제 풀이 (0) | 2024.02.16 |
---|---|
Webhacking.kr Challenge old-11 문제 풀이 (0) | 2024.02.08 |
Webhacking.kr Challenge old-12 문제 풀이 (0) | 2024.02.05 |
Webhacking.kr Challenge old-49 문제 풀이 (0) | 2024.02.02 |
Webhacking.kr Challenge old-51 문제 풀이 (0) | 2024.01.31 |