리눅스 시스템 기초 · 입문편 — 본문의 "N편"은 입문 과정 번호다. 번호별 글과 전체 250편 구성은 통합 로드맵에서 확인할 수 있다.
리눅스 시스템 기초 12 / 50 · Part 2. 파일·명령어·권한
실습 환경: Rocky Linux 9 (10.0.0.200) · Apache httpd
이전 글: 11. Linux 파일과 디렉터리 관리
🔗 심화 시리즈 — 「파일 · 권한 · 사용자 관리」
이 주제를 더 깊게 다룬 실무형 보안 시리즈: 04. 절대경로와 상대경로
경로(path)는 파일의 위치를 나타내는 주소다. 절대경로와 상대경로는 Linux를 처음 배울 때 가장 먼저 익히는 개념이지만, 보안에서는 생각보다 자주 문제를 일으킨다.
../로 웹 루트를 벗어나 시스템 파일이 노출 된다(Path Traversal).이번 글은 경로 해석 규칙을 정확히 정리하고, 웹 로그에서 경로 탐색 공격을 찾는 방법까지 연결한다.
| 구분 | 시작 | 기준 | 예 |
|---|---|---|---|
| 절대경로 | / | 루트 디렉터리 | /var/log/secure |
| 상대경로 | / 이외 | 현재 작업 디렉터리 | log/secure, ../etc |
| 기호 | 의미 | 예 (현재 위치 /var/www/html) |
|---|---|---|
. | 현재 디렉터리 | ./index.php → /var/www/html/index.php |
.. | 상위 디렉터리 | ../ → /var/www |
~ | 현재 사용자의 홈 | ~/lab → /home/roror/lab |
~user | 특정 사용자의 홈 | ~apache → /usr/share/httpd |
- (cd에서) | 직전 디렉터리 | cd - |
/의 상위(/..)는 다시 /다. 그래서 ../를 필요 이상으로 많이 붙여도 루트에서 멈춘다. 공격자가 ../../../../../../etc/passwd처럼 넉넉하게 붙이는 이유다.
| 명령 | 결과 |
|---|---|
pwd / pwd -L | 논리 경로 (심볼릭 링크 이름 유지) |
pwd -P | 물리 경로 (링크를 따라간 실제 위치) |
realpath <경로> | ., .., 링크를 모두 해석한 절대경로 |
readlink -f <경로> | realpath와 유사 |

커널은 경로를 / 기준으로 한 단계씩 해석한다. 상대경로라면 프로세스의 현재 작업 디렉터리(cwd) 에서 시작한다. 프로세스의 cwd는 /proc/<PID>/cwd로 확인할 수 있다.
웹 서버에서 view.php?file=img/logo.png를 처리할 때 애플리케이션이 "/var/www/html/" + file처럼 문자열을 붙여 파일을 연다면, file 값에 ../가 들어오는 순간 커널은 이를 그대로 해석해 웹 루트 밖으로 나간다. 문제는 커널이 아니라 입력값을 검증하지 않은 애플리케이션 에 있다.
방어는 "경로를 정규화한 뒤 허용된 디렉터리 안에 있는지 확인"하는 것이다.
# 정규화 예시 — 결과가 /var/www/html 로 시작하지 않으면 거부
realpath -m /var/www/html/../../../etc/passwd # /etc/passwd
# 1) 경로 이동과 확인
cd /var/www/html
pwd
cd ../../log && pwd # /var/log
cd - && pwd # 직전 위치로
cd ~ && pwd
# 2) 정규화
realpath -m /var/www/html/../../../etc/passwd
realpath -m ./img/../index.php
# 3) 심볼릭 링크와 논리/물리 경로
mkdir -p ~/lab12/real && ln -sfn ~/lab12/real ~/lab12/link
cd ~/lab12/link
pwd -L; pwd -P
# 4) 프로세스의 현재 작업 디렉터리
sudo ls -l /proc/$(pgrep -o httpd)/cwd
sudo ls -l /proc/$$/cwd
# 5) 테스트 요청으로 로그 생성 (본인 실습 서버에서만)
curl -s -o /dev/null -w '%{http_code}\n' 'http://10.0.0.200/index.html?file=../../../etc/passwd'
# 6) 웹 로그에서 경로 탐색 패턴 검색
sudo grep -Ei '\.\./|%2e%2e|\.\.%2f|%252e%252e' /var/log/httpd/access_log | tail
아래 출력은 형식 설명용 예시다.
① access_log의 경로 탐색 시도
10.0.0.128 - - [23/Sep/2026:10:52:11 +0900] "GET /view.php?file=../../../etc/passwd HTTP/1.1" 200 1893 "-" "curl/8.x"
10.0.0.128 - - [23/Sep/2026:10:52:14 +0900] "GET /view.php?file=..%2f..%2f..%2fetc%2fshadow HTTP/1.1" 200 0 "-" "curl/8.x"
| 필드 | 값 | 해석 |
|---|---|---|
| 출발지 IP | 10.0.0.128 | 공격 출발지 (IOC) |
| 요청 | file=../../../etc/passwd | 경로 탐색 시도 |
| 인코딩 | %2f = /, %2e = . | 필터 우회 목적의 URL 인코딩 |
| 상태 코드 | 200 | 요청이 처리됨 (성공 여부는 크기로 판단) |
| 응답 크기 | 1893 / 0 | 정상 페이지와 다른 크기 → 파일 내용 노출 가능성 |
| User-Agent | curl | 브라우저가 아닌 도구 |
상태 코드 200만으로 공격 성공을 단정할 수는 없다. 애플리케이션이 오류 페이지를 200으로 돌려주는 경우도 많다. 같은 페이지의 정상 요청 응답 크기와 비교 하는 것이 실무적인 판단 방법이다.
② pwd -L / pwd -P
/home/roror/lab12/link
/home/roror/lab12/real
| 취약 상황 | 원인 | 대응 |
|---|---|---|
| 웹 경로 탐색 | 사용자 입력 경로를 검증 없이 연결 | 정규화 후 허용 디렉터리 확인, 파일명 화이트리스트 |
| 스크립트의 상대경로 | cd 실패 후 상대경로로 rm -rf 등 실행 | 절대경로 사용, `cd dir |
| cron의 상대 명령 | tar처럼 전체 경로 없이 실행 → PATH 조작 (9편) | 명령어도 절대경로 (/usr/bin/tar) |
/tmp 심볼릭 링크 공격 | root 프로그램이 예측 가능한 /tmp 파일에 쓰기 → 공격자가 미리 링크를 걸어 다른 파일 덮어쓰기 | mktemp, fs.protected_symlinks=1 |
마지막 항목과 관련해 Linux 커널에는 fs.protected_symlinks, fs.protected_hardlinks 보호 기능이 있다. Sticky Bit 디렉터리(/tmp)에서 다른 사용자가 만든 링크를 따라가는 것을 제한한다. 대부분의 배포판에서 기본값 1이다.
sysctl fs.protected_symlinks fs.protected_hardlinks
| 탐지 대상 | 조건 예 |
|---|---|
| 경로 탐색 시도 | URL에 ../ 또는 인코딩 변형 3회 이상 |
| 민감 파일명 | URL에 etc/passwd, etc/shadow, .ssh/, proc/self |
| 성공 가능성 | 위 조건 + 상태 200 + 응답 크기가 해당 URL 평균과 크게 다름 |
sudo grep -Ei '\.\./|%2e%2e' /var/log/httpd/access_log \
| awk '{print $1}' | sort | uniq -c | sort -rn | head
(파이프라인·awk·uniq는 Part 3에서 자세히 다룬다.)
[Alert] 웹 방화벽/SIEM: Path Traversal 패턴 (10.0.0.128)
↓
[IOC] 출발지 IP, 요청 URL, User-Agent, 시각
↓
[분석] 같은 IP의 전체 요청 흐름 (정찰 → 시도 → 성공 여부)
응답 크기 비교, 노출 대상 파일 확인
↓
[Root Cause] view.php 의 file 파라미터 검증 부재
↓
[Response] IP 차단, 취약 코드 수정 요청, 노출된 정보(계정 목록 등) 영향 평가
/부터, 상대경로는 현재 작업 디렉터리 부터 해석된다..은 현재, ..은 상위, ~은 홈이다. /의 상위는 /다.realpath로 ..과 링크를 해석한 실제 경로를 확인할 수 있다.../로 웹 루트를 벗어난다. URL 인코딩 변형 까지 검색해야 한다.다음 글 「13. Linux 파일 종류」 에서는 ls -l 맨 앞 글자가 나타내는 7가지 파일 종류(일반, 디렉터리, 링크, 장치, 소켓, 파이프)를 정리하고, 확장자가 아니라 파일 내용(매직 넘버)으로 파일을 판별 하는 방법을 다룬다.