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를 연쇄하여 관리자 계정 생성. 침투 테스터를 위한 교육 자료.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

파일 업로드 우회 + 저장형 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가 차단하지 않습니다.

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

  • 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
    

    고지 사항

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

    도구 다운로드