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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-33331 — 로컬 랩에서 oRPC의 OpenAPI 문서 생성 시 저장형 XSS를 재현합니다(CVE-2026-33331). 취약 버전과 패치 버전을 비교용으로 포함하며, 독립 실행형 PoC도 제공합니다. | Kitploit
도구/GitHubGitHub/abhayclasher/cve-2026-33331
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityLearning & EducationLabs & Practice
GitHubabhayclasher/cve-2026-33331

CVE-2026-33331

로컬 랩에서 oRPC의 OpenAPI 문서 생성 시 저장형 XSS를 재현합니다(CVE-2026-33331). 취약 버전과 패치 버전을 비교용으로 포함하며, 독립 실행형 PoC도 제공합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-33331 — oRPC OpenAPI 참조 플러그인의 저장형 XSS

CVE GHSA CWE-79 Patched

orpc의 OpenAPI 문서 생성에서 발생하는 저장형 XSS에 대한 개념 증명 실습 환경


목적

oRPC는 OpenAPI 스펙을 기반으로 API 문서 페이지를 생성합니다. v1.13.9 이전 버전에서는 HTML 인코딩 없이 JSON.stringify()를 사용하여 스펙을 <script> 태그에 직접 넣었습니다. 공격자가 제어할 수 있는 info.description과 같은 필드는 해당 태그를 조기에 닫고 스크립트를 실행할 수 있었습니다.

이 저장소는 버그를 재현할 수 있는 로컬 실습 환경과 비교용 패치 버전을 제공합니다.

주요 정보

필드값
CVE IDCVE-2026-33331
GHSAGHSA-7f6v-3gx7-27q8
CWECWE-79 (웹 페이지 생성 중 입력값의 부적절한 중화)
제품middleapi/orpc
영향 범위v1.13.9 미만의 모든 버전
패치 버전v1.13.9
발견자Abhay Kumar (@abhayclasher)

취약점 상세

packages/openapi/src/plugins/openapi-reference.ts의 취약한 코드는 스펙을 다음과 같이 렌더링합니다:

root@kitploit:~
<script id="spec" type="application/json">${JSON.stringify(spec)}</script>

JSON.stringify()는 유효한 JSON을 생성하지만 < 또는 >를 이스케이프하지 않습니다. 브라우저는 <script type="application/json"> 내부에서도 </script>를 여전히 HTML 종료 태그로 처리합니다.

실행을 유발하는 info.description의 페이로드:

root@kitploit:~
"</script><script>alert('XSS')</script>"

브라우저는 다음과 같이 인식합니다:

root@kitploit:~
<script id="spec" type="application/json">{"info":{"description":"
</script><script>alert('XSS')</script>"}}
</script>

첫 번째 </script>가 블록을 닫습니다. 그 이후의 모든 내용은 인라인 JavaScript로 실행됩니다.

영향

  • 쿠키 또는 토큰 탈취를 통한 세션 하이재킹
  • 문서를 보는 피해자를 대신한 임의 API 호출
  • 신뢰할 수 있는 문서 도메인 내에서 렌더링되는 피싱 오버레이

이는 애플리케이션이 사용자 제어 입력값으로 OpenAPI 스펙을 생성할 때 적용되며, 이는 oRPC가 라우터 정의를 통해 지원하는 정확한 사례입니다.

시스템 요구 사항

  • Node.js 18 이상
  • Docker (선택 사항, 컨테이너형 실습 환경용)
  • 500 MB 여유 디스크 공간

설치

옵션 1: 직접 실행

root@kitploit:~
git clone https://github.com/abhayclasher/CVE-2026-33331.git
cd CVE-2026-33331/app
npm install
node server.js

옵션 2: Docker로 실행

root@kitploit:~
git clone https://github.com/abhayclasher/CVE-2026-33331.git
cd CVE-2026-33331
docker compose up -d

사용 방법

서버가 시작된 후 다음 URL을 방문하세요:

URL설명
http://localhost:3000/docs취약한 문서 페이지 — 로드 시 XSS 페이로드 실행
http://localhost:3000/docs/safev1.13.9 패치가 적용된 동일 페이지
http://localhost:3000/spec.json원본 OpenAPI 스펙 JSON

취약한 버전은 페이지 로드 시 alert()을 실행하여 스크립트 실행을 확인합니다. 패치된 버전은 동일한 악성 스펙을 안전하게 렌더링합니다 — 페이로드가 일반 텍스트로 표시됩니다.

독립형 PoC도 실행할 수 있습니다:

root@kitploit:~
cd poc
node exploit.js

이 명령은 포트 3000에서 전체 애플리케이션 컨텍스트 없이 동일한 버그를 시연하는 최소 서버를 실행합니다.

작동 원리

탐지 흐름

root@kitploit:~
1. 공격자가 OpenAPI 스펙의 필드(예: description)를 제어
2. oRPC가 JSON.stringify(spec)로 문서 HTML 생성
3. 페이로드의 </script>가 <script> 태그를 조기에 닫음
4. 브라우저가 이후 내용을 인라인 JavaScript로 실행

공격 체인

root@kitploit:~
┌─────────────────────────────────────────────────────┐
│  1. 악성 스펙 생성:                                   │
│                                                       │
│     info.description =                                │
│       "</script><script>alert('XSS')</script>"        │
│                                                       │
│  2. orpc가 스펙을 HTML에 삽입:                         │
│                                                       │
│     <script id="spec" type="application/json">        │
│     {"info":{"description":"</script>    <-- 태그     │
│       <script>alert('XSS')</script>      <-- 페이로드 │
│       "}}                                             │
│     </script>                                         │
│                                                       │
│  3. 브라우저가 alert('XSS') 실행                       │
└─────────────────────────────────────────────────────┘

수정 사항

버전 1.13.9는 JSON을 스크립트 태그에 삽입하기 전에 HTML에 민감한 문자를 유니코드 이스케이프로 대체하는 escapeJsonForHtml()을 도입했습니다:

root@kitploit:~
const escapeJsonForHtml = (obj) => JSON.stringify(obj)
  .replace(/&/g, '\\u0026')
  .replace(/'/g, '\\u0027')
  .replace(/</g, '\\u003C')
  .replace(/>/g, '\\u003E')
  .replace(/\//g, '\\u002F');

유니코드 이스케이프는 유효한 JSON으로 유지되기 때문에 작동합니다 — JSON.parse()가 원래 문자열을 재구성합니다 — 하지만 브라우저 파서에는 HTML처럼 보이지 않습니다.

패치는 또한 DOM dataset.config 속성에서 JSON을 읽는 방식(값에 괄호가 포함된 경우 깨지는 문제)에서 이스케이프된 JSON을 인라인 변수에 직접 할당하는 방식으로 변경되었습니다.

전체 커밋 보기: 4f0efa8

프로젝트 구조

root@kitploit:~
CVE-2026-33331/
├── README.md               # 이 파일
├── docker-compose.yml      # Docker 실습 환경 구성
├── app/
│   ├── Dockerfile          # 컨테이너 빌드 구성
│   ├── package.json        # Node.js 의존성
│   └── server.js           # 취약 + 패치된 문서 렌더러
└── poc/
    └── exploit.js          # 독립형 최소 개념 증명

참고 자료

  • NVD — CVE-2026-33331
  • GitHub 보안 권고
  • 패치 커밋
  • 릴리스 v1.13.9
  • CWE-79

Abhay Kumar이(가) 보고했습니다. 이 저장소는 로컬 교육용으로만 사용하도록 제작되었습니다. 취약한 서버를 공용 네트워크에 배포하지 마십시오.

교육 목적으로만 사용 — 격리된 환경에서 사용하세요

도구 다운로드