Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
vuln-chain-lab — PoC Docker lab: 파일 업로드 우회 + 저장형 XSS를 연쇄하여 관리자 계정 생성. 침투 테스터를 위한 교육 자료. | Kitploit
도구/GitHubGitHub/echosecure/vuln-chain-lab
Vulnerability AnalysisWeb Application ExploitationWeb SecurityCTFPenetration TestingMisconfigurationLearning & EducationLabs & Practice
GitHubechosecure/vuln-chain-lab

vuln-chain-lab

PoC Docker lab: 파일 업로드 우회 + 저장형 XSS를 연쇄하여 관리자 계정 생성. 침투 테스터를 위한 교육 자료.

저장소 보기
14개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

파일 업로드 우회 + 저장형 XSS PoC 실습 환경

의도적으로 취약하게 만든 웹 애플리케이션으로, CSP, CORS, CSRF 보호가 적용된 상태에서도 파일 업로드 우회가 저장형 XSS와 연계되어 백도어 관리자 계정을 생성하는 방법을 보여줍니다.

전체 블로그 글: KurtiseBear Blog

이 실습 환경은 방어적 보안 훈련을 위한 교육용입니다. 공개적으로 접근 가능한 곳에 배포하지 마십시오.

이 실습이 보여주는 것

애플리케이션에는 실제 보안 제어가 적용되어 있습니다:

  • Content Security Policy가 스크립트 소스를 'self'로 제한합니다 (단 'unsafe-inline' 및 'unsafe-eval' 허용).
  • CORS 헤더가 전송되지 않아 브라우저에서 교차 출처 요청이 차단됩니다.
  • 모든 양식 제출(메시지, 파일 업로드)에 CSRF 토큰이 포함됩니다.
  • 표준 보안 헤더(X-Content-Type-Options, X-Frame-Options, Referrer-Policy)가 적용됩니다.

낮은 권한의 사용자 계정을 가진 공격자는 두 가지 취약점을 연계하여 이 모든 것을 우회합니다:

  1. 파일 업로드 우회 -- 업로드 양식은 클라이언트 측 accept 속성을 통해 .pdf만 허용하지만, 서버는 파일 유형 검증을 전혀 수행하지 않습니다. 공격자는 JavaScript가 포함된 .js 파일을 업로드합니다. 다운로드 엔드포인트가 동일 출처에서 제공하므로 CSP와 CORS가 차단하지 않습니다.

  2. 메시지 제목을 통한 저장형 XSS -- 메시징 기능은 사용자 입력을 정제 없이 저장합니다. 관리자 받은 편지함은 메시지 제목을 원시 HTML로 렌더링합니다. XSS 페이로드는 `` 핸들러를 사용하여 업로드된 스크립트를 가져와서 eval()로 실행합니다. CSP가 이를 허용하는 이유는 'unsafe-inline'과 'unsafe-eval'이 허용되기 때문입니다.

  3. API 엔드포인트에 CSRF 누락 -- 사용자 관리 API(/api/manage-user.php)는 양식 엔드포인트와 달리 CSRF 토큰을 검증하지 않습니다. XSS 페이로드는 관리자의 동일 출처 세션을 사용하여 이 API를 호출합니다. CSRF가 있더라도 동일 출처 JavaScript는 DOM에서 토큰을 읽을 수 있습니다.

결과: 관리자가 받은 편지함을 열면 XSS가 발동되고, JavaScript가 관리자의 세션을 사용하여 백도어 관리자 계정을 생성합니다. 모든 방어가 적용되어 정상 작동합니다. 이 체인이 작동하는 이유는 결코 출처를 벗어나지 않기 때문입니다.

사전 요구 사항

  • Docker
  • Docker Compose

설정

root@kitploit:~
docker-compose up -d

MySQL이 초기화될 때까지 10-15초 기다린 후 http://localhost:8080에 접속하세요.

자격 증명

역할이메일비밀번호
Admin[email protected]admin
User[email protected]user

공격 실습

1단계: 일반 사용자로 로그인

http://localhost:8080으로 이동하여 [email protected] / user로 로그인하세요.

2단계: 페이로드 업로드

Upload Files로 이동하세요. 양식에는 "PDF only"라고 되어 있지만 클라이언트 측에서만 적용됩니다. 다음 중 하나를 수행하세요:

  • 브라우저 개발자 도구를 사용하여 파일 입력에서 accept=".pdf" 속성을 제거하거나,
  • curl/Burp를 사용하여 직접 업로드하세요(양식의 CSRF 토큰을 포함해야 함).

제공된 payload.js(또는 자신의 파일)를 업로드하세요. 반환된 파일 ID(예: 1)를 기록하세요.

업로드된 파일은 이제 동일 출처의 /api/download.php?file_id=1에서 제공됩니다. CSP는 이 엔드포인트로의 가져오기를 차단하지 않습니다. 'self'이기 때문입니다.

3단계: XSS 메시지 작성

Send Message로 이동하세요. 제목 필드에 다음을 입력하세요:

root@kitploit:~
r.blob()).then(b=>b.text()).then(eval)">

(2단계의 실제 파일 ID로 1을 바꾸세요.)

본문에는 아무 내용이나 입력하세요. 우선순위를 체크하면 받은 편지함 맨 위에 위치합니다. 전송하세요.

onerror 핸들러가 작동하는 이유는 CSP가 'unsafe-inline'을 허용하기 때문입니다. eval()이 작동하는 이유는 CSP가 'unsafe-eval'을 허용하기 때문입니다. 다운로드 엔드포인트로의 가져오기가 작동하는 이유는 동일 출처이기 때문입니다.

4단계: 관리자가 받은 편지함을 확인할 때까지 기다림

로그아웃하세요. [email protected] / admin으로 로그인하세요. Inbox로 이동하세요.

메시지 제목이 원시 HTML로 렌더링됩니다. `` 태그 로드에 실패하여 onerror 핸들러가 발동하고, 업로드된 페이로드를 가져와서 eval()이 실행합니다. 페이로드는 관리자의 세션 쿠키(동일 출처 요청에 자동으로 첨부됨)를 사용하여 /api/manage-user.php로 POST 요청을 보냅니다. API 엔드포인트가 CSRF 토큰을 확인하지 않으므로 필요하지 않습니다.

5단계: 백도어 확인

Users로 이동하세요. BackdoorAdmin이라는 새 사용자가 역할 admin 및 이메일 [email protected]으로 표시되어야 합니다.

로그아웃 후 [email protected] / Compromised1!로 로그인하여 확인하세요.

방어가 실패한 이유

root@kitploit:~
CSP blocks external scripts
  --> But the payload is hosted on the same origin via file upload
  --> And unsafe-inline/unsafe-eval allow the onerror handler and eval()

CORS blocks cross-origin requests
  --> But every request in the chain is same-origin

CSRF tokens protect form submissions
  --> But the API endpoint doesn't validate them
  --> And even if it did, same-origin JS can read tokens from the DOM

Session cookies have standard protections
  --> But same-origin requests carry them automatically

방어는 모두 정상 작동합니다. 교차 출처 공격을 막도록 설계되었습니다. 이 체인은 결코 출처를 벗어나지 않습니다.

방어 조치

이 체인을 실제로 차단할 수 있는 방법:

  1. 서버 측 파일 유형 검증 -- MIME 유형, 파일 확장자 및 매직 바이트를 확인하세요. 클라이언트를 신뢰하지 마세요. 이는 공격자가 당신의 출처에 페이로드를 호스팅하는 것을 방지합니다.
  2. 출력 인코딩 -- 모든 사용자 제어 출력에 htmlspecialchars()를 사용하세요. 받은 편지함이 $row['subject']를 원시로 렌더링합니다. 이는 XSS를 완전히 차단합니다.
  3. 엄격한 CSP -- 'unsafe-inline' 및 'unsafe-eval'을 제거하세요. 합법적인 인라인 스크립트에는 nonce 또는 해시를 사용하세요. 이는 onerror 핸들러와 eval()을 차단합니다.
  4. Content-Disposition: attachment -- 사용자가 업로드한 파일에 대해 인라인 렌더링 대신 다운로드를 강제하세요. 이는 브라우저가 업로드된 콘텐츠를 해석하는 것을 방지합니다.
  5. 모든 상태 변경 엔드포인트에 CSRF 적용 -- 양식뿐만 아니라 API 엔드포인트도 포함하여.
  6. 업로드에 대한 접근 제어 -- 다운로드 API는 인증된 사용자에게 모든 파일을 제공합니다. 파일은 소유자에 따라 범위를 지정해야 합니다.

정리

root@kitploit:~
docker-compose down -v

고지 사항

이 애플리케이션은 의도적으로 취약하게 만들어졌습니다. 교육 및 방어적 보안 훈련 목적으로만 설계되었습니다. 신뢰할 수 없는 사용자가 접근 가능한 네트워크에 배포하지 마십시오. 명시적인 서면 승인 없이 시스템에 대해 이러한 기술을 사용하지 마십시오.

도구 다운로드