--- name: exploiting-path-traversal-upload description: >- SQIsoft 웹 애플리케이션에서 경로 조작(CWE-22)과 위험 파일 업로드(CWE-434)의 실제 악용 가능성을 동적으로 확정한다. 경로 조작은 ../·인코딩 변형을 파일 파라미터에 주입하고 응답 본문에 알려진 파일 내용 시그니처(/etc/passwd·web.xml·win.ini)가 나오는지 인밴드로 검증한다(읽기 전용). 파일 업로드는 --allow-destructive일 때만 코드 없는 고유 마커 파일(.jsp 확장자에 nonce 텍스트만)을 올려 위험 확장자 수용·웹루트 회수 여부를 확인하며 코드 실행은 절대 시도하지 않는다. 발사 전 scope_guard를 fail-closed로 강제 통과한다. domain: cybersecurity subdomain: web-application-security tags: - path-traversal - file-upload - directory-traversal - webshell - dast - cwe-22 - cwe-434 - owasp-a01 - owasp-a04 - sqisoft cwe: - CWE-22 - CWE-434 owasp: - A01:2021-Broken-Access-Control - A04:2021-Insecure-Design - A05:2021-Security-Misconfiguration stacks: - spring-modern - jsp-legacy version: "0.3.0" author: sqisoft-security license: Proprietary --- # 동적 경로조작 · 파일 업로드 침투 (파일내용 시그니처 · 옵트인 마커) > ⚠️ **권한 있는 사내 보안 테스트(펜테스트) 전용.** 자사 소유 + 격리된 스테이징/로컬만 대상. > `tools/scope_guard.py`가 운영·공인·IP 위장을 코드로 차단한다. ## When to Use - `detecting-path-traversal` / `detecting-file-upload-vulnerabilities` 정적 진단에서 후보가 나왔고, 실제 악용 가능 여부를 확정하고 싶을 때 - 다운로드/뷰어 파라미터(`filePath`·`fileName`·`file`)로 기준 경로 밖 파일을 실제로 읽을 수 있는지 실증할 때 - 업로드 엔드포인트가 위험 확장자(.jsp 등)를 실제로 수용하는지(확장자 화이트리스트 부재) 실증할 때 ## Prerequisites - 실행 중인 스테이징/로컬 대상 - (선택) 테스트 계정/토큰 — 인증 뒤 엔드포인트일 때(`--token-a` 또는 `--user-a-id/pw`) - **업로드 검사는 서버에 파일을 기록(파괴적)** — `--allow-destructive` 플래그가 있어야만 실행된다 - (선택) 정적 결과 `--scan ` — 표적 후보(파일·라인·파라미터) 분류 가이드용 ## Workflow ### 0단계 — 안전 범위 확인 (강제) ```bash python tools/scope_guard.py ``` ### 1단계 — 실제 발사 ```bash # 경로 조작(비파괴, 읽기 전용) python skills/exploiting-path-traversal-upload/scripts/attack_pathupload.py \ http://localhost:7171 \ --traversal-target "/api/v1/files/download?filePath=" \ --json # 업로드까지(파괴적 — 명시 플래그 필요) python skills/exploiting-path-traversal-upload/scripts/attack_pathupload.py \ http://localhost:7171 \ --upload-target "/api/v1/files" --upload-field file \ --retrieve-base "http://localhost:7171/upload/" \ --allow-destructive --json # 인증 뒤면: --user-a-id --user-a-pw (또는 --token-a ) # 주입 위치 명시: --traversal-target "/download?path={INJ}&x=1" ``` 흐름: scope 확인 → (선택)로그인 → 경로조작 변형 주입·본문 시그니처 판정 → (옵트인)마커 업로드·수용/회수 판정 → JSON ### 2단계 — 판정 | 검사 | 취약 | 방어 | |---|---|---| | 경로 조작 | 응답 본문에 **파일 내용 시그니처**(`root:..:0:0:`·` 경로조작 시그니처 미검출은 "동적 미확정"(차단 추정) — 정적 의심 유지. 업로드 수용(2xx)이나 회수 불가면 Medium(저장위치 불명), 회수까지 되면 웹루트 저장 High. 신뢰도는 확정 시 `dynamic`. ### 3단계 — AI 검증 + 리포트 취약 후보만 실제 코드(`getCanonicalPath`+`startsWith` 검증·확장자 화이트리스트·매직바이트·웹루트 밖 저장)로 재확인 후, 확정 항목을 4요소로 `reports/pentest-pathup-<대상>.md`에 저장한다. ## 비파괴 / 파괴 정책 - **경로 조작은 읽기 전용**(파일 내용 시그니처 확인만, 변조 없음). - **업로드는 파괴적** — `--allow-destructive` 없으면 skip된다. 마커는 **코드 없는 텍스트**(웹쉘 아님)이며 코드 실행을 시도하지 않는다. - 업로드된 마커 파일은 출력에 `leftover`로 표기 — 서버에서 수동 삭제 권장. ## Output Format ```markdown # 동적 경로조작 · 업로드 침투 리포트 - 대상: | 점검일: | 신뢰도: 동적 확정(dynamic) ## 확정 취약점 ### [High] 경로 조작 — 기준 경로 밖 파일 노출 — GET /api/v1/files/download?filePath= - **① 취약한 점**: `../../../../etc/passwd` 주입 → 응답 본문에 `root:x:0:0:`(시스템 파일 노출) - **② 이유**: getCanonicalPath+startsWith 검증 부재로 임의 파일 읽기 — 설정·소스·자격 유출 - **③ Evidence**: `enc_d6` 변형 → 본문에 `root:.*:0:0:` 매칭 - **④ 해결방법**: getCanonicalPath() 후 기준 경로 startsWith 검증, 화이트리스트 ID 매핑 ### [High] 위험 확장자 업로드 수용 — POST /api/v1/files - **① 취약한 점**: `.jsp` 마커 업로드가 2xx 수용 + 웹루트(`/upload/`)에서 회수됨 - **② 이유**: 확장자 화이트리스트 부재 + 웹루트 저장 → 웹쉘 업로드로 RCE 가능 - **③ Evidence**: 마커 `gxmarker_.jsp` 업로드 200 + 회수 본문에 `GXMARKER-` 반영 - **④ 해결방법**: 확장자 화이트리스트 + 매직바이트 교차검증 + 웹루트 밖 저장 + UUID 파일명 ``` ## 안전 (ATTACK_SAFETY.md 계승) - 모든 발사 전 `scope_guard.assert_in_scope()` 강제(fail-closed). 차단 시 exit 1, 로그인 실패 시 exit 2. - 업로드는 `--allow-destructive` 게이트, 마커는 무해(코드 없음), 코드 실행 미시도, 잔존 파일 리포트. - 토큰·자격은 출력 시 마스킹(`dyn_session.mask_token`). - **자격 노출 주의**: 토큰·비밀번호를 CLI 인자로 넘기면 프로세스 목록(작업관리자/`ps`)에 노출될 수 있다. 공유·멀티유저 호스트를 피하고 단일 운영자 환경에서 테스트 계정으로만 실행한다. ## Tools & Systems - 공용 엔진: `tools/dyn_session.py` (로그인·인증 HTTP·multipart·scope 위임) - 안전 게이트: `tools/scope_guard.py` - 정적 연계: `detecting-path-traversal`, `detecting-file-upload-vulnerabilities` - 시나리오: `references/payloads.md`