파일 경로의 울타리 넘기
일반 현장 기사 권한으로 Atlas Field Manual을 블랙박스 점검하세요. 브라우저 개발자 도구나 로컬 프록시에서 정상 매뉴얼 열람 요청을 관찰하고, 의뢰가 지정한 제한 점검 기록 한 건이 같은 뷰어를 통해 반환되는지 확인하세요. 지정 기록 이외의 파일은 탐색하지 마세요.
의뢰 배경
아틀라스 에너지는 현장 기사가 설비 매뉴얼을 열어 보는 Field Manual 포털을 운영합니다. 한 기사가 모바일 즐겨찾기의 오래된 링크를 열었을 때 배정된 설비 매뉴얼이 아닌 제한 등급의 점검 기록 일부가 표시됐다고 보고했습니다. 기록에는 설비 위치와 정비 일정이 포함될 수 있어, 다음 현장 교대 전 공개 문서 뷰어의 파일 접근 경계를 확인해야 합니다.
이번 목표
일반 기사 권한으로 지정된 제한 점검 기록을 열 수 있음을 재현하고 최종 요청·응답 증거를 확보하세요.
- 상대 경로의 점 구간이 파일시스템에서 어떻게 정규화되는지 설명한다.
- 문자열 prefix 검사와 canonical path 검사의 차이를 이해한다.
- 허용 루트와 공개 하위 폴더를 별도로 검증해야 함을 확인한다.
학습 노트 · 파일명을 경로에 그대로 붙이면 사용자가 의도한 공개 폴더 밖의 파일을 선택할 수 있습니다.
점 두 개와 슬래시는 현재 디렉터리의 부모로 이동합니다. 공개 문서 경로에 부모 이동 구간이 포함되면 정규화된 최종 위치가 제한 문서 영역으로 바뀔 수 있습니다.
안전한 구현은 허용된 논리 이름을 실제 파일에 매핑하거나, realpath로 정규화한 최종 경로가 허용 루트 안에 있는지 디렉터리 경계를 포함해 확인합니다. 단순히 ../ 문자열 한 종류만 지우면 중첩 인코딩과 플랫폼 차이를 놓칠 수 있습니다.
승인된 검증에서는 의뢰가 지정한 제한 문서 한 건을 확인한 뒤 멈춰야 합니다. 운영체제 파일이나 다른 서비스 경로까지 탐색하는 행동은 같은 기법을 쓰더라도 승인 범위를 벗어납니다.
| 입력 | 정규화 결과 | 판정 |
|---|---|---|
| guide.txt | /srv/manuals/public/guide.txt | 공개 문서 |
| manual/intro.txt | /srv/manuals/public/manual/intro.txt | 공개 하위 폴더 |
| ../restricted/inspection.txt | /srv/manuals/restricted/inspection.txt | 제한 문서 경계 확인 |
| ../../outside.txt | /srv 밖의 경로 | 승인 범위 밖이므로 시도 금지 |
// 취약한 개념
$path = $manualRoot . '/public/' . $_GET['file'];
$content = file_get_contents($path);
// 안전한 개념
$resolved = realpath($candidate);
assert(path_is_within($resolved, $allowedPublicRoot));더 깊이 읽기
실습 전후에 공식 문서와 보안 아카데미 자료로 개념을 교차 확인하세요.
막혔을 때만 열기
다음 단서가 필요할 때만 한 단계씩 확인하세요.
힌트 1 · 기준 디렉터리 찾기
정상 매뉴얼을 열고 개발자 도구나 프록시에서 문서를 선택하는 요청 값과 공개 문서의 기준 위치를 확인하세요.
힌트 2 · 제한 문서 참조
공개 매뉴얼의 응답과 화면에서 의뢰가 지정한 점검 기록의 상대 위치를 확인하고, 정상 문서의 기준 위치와 비교하세요.
힌트 3 · 최종 경로 확인
문서 선택 값을 수동으로 재전송해 정규화된 위치가 공개 영역을 벗어나는지 확인하세요. 지정 기록 한 건이 열리면 즉시 중단하세요.
선행 의뢰가 잠겨 있습니다
이전 단계를 완료하면 자동으로 의뢰 메일과 실습 환경이 열립니다.