CVE-2025-55854 - 저장형 크로스 사이트 스크립팅(XSS) 취약점
취약점 개요
CVE ID: CVE-2025-55854
취약점 유형: 저장형 크로스 사이트 스크립팅(XSS)
심각도: 높음(High)
영향을 받는 구성 요소: 사용자 프로필 Bio 필드
영향을 받는 애플리케이션: FreelanceHub (https://github.com/nooncarlett/FreelanceHub)
설명
FreelanceHub 애플리케이션의 사용자 프로필 기능에서 저장형 크로스 사이트 스크립팅(XSS) 취약점이 발견되었습니다. 이 취약점은 Bio 필드의 입력값 검증(sanitization)이 불충분하여 발생하며, 공격자가 악성 JavaScript 코드를 주입하여 다른 사용자가 해당 프로필 페이지를 열람할 때 코드가 실행되도록 할 수 있습니다.
이 취약점을 통해 공격자는 다음을 수행할 수 있습니다:
- 다른 사용자의 브라우저 컨텍스트에서 임의의 JavaScript 실행
- 세션 토큰 및 쿠키 탈취
- 인증된 사용자를 대신한 작업 수행
- 사용자를 악성 웹사이트로 리디렉션
- 애플리케이션 인터페이스 변조(디페이싱)
영향을 받는 버전
- FreelanceHub (패치 이전의 모든 버전)
- 테스트 환경: 포트 8080에서 실행되는 localhost 배포
기술적 세부 사항
근본 원인
애플리케이션이 Bio 필드의 사용자 입력을 데이터베이스에 저장하고 프로필 페이지에 렌더링하기 전에 적절히 검증하지 못합니다. HTML이 특수 문자를 이스케이프하거나 위험한 태그 및 이벤트 핸들러를 제거하지 않은 채 직접 렌더링됩니다.
공격 경로
- 공격 유형: 저장형 XSS
- 입력 경로: 사용자 프로필 Bio 필드
- 실행 컨텍스트: 공격자의 프로필을 열람하는 모든 사용자
- 인증 필요 여부: 예(공격자는 유효한 계정이 필요함)
개념 증명(PoC)
사전 요구 사항
- 실행 중인 FreelanceHub 애플리케이션 인스턴스
- 웹 브라우저(Chrome, Firefox, Edge 등)
- 사용자 계정 생성 권한
단계별 재현 절차
1단계: 새 계정 생성
http://localhost:8080/auth로 이동
- 유효한 자격 증명을 사용하여 새 사용자 계정으로 가입
- 등록 절차를 완료하고 로그인

2단계: 프로필 페이지로 이동
- 로그인 성공 후
http://localhost:8080/profile로 이동
- 프로필 편집 양식에서 Bio 필드를 찾습니다
3단계: XSS 페이로드 주입
- Bio 필드에 다음 페이로드를 입력합니다:
4단계: 양식 제출
- 저장(Save) 또는 프로필 업데이트(Update Profile) 버튼을 클릭합니다
- 프로필이 업데이트되었다는 확인 메시지를 기다립니다
5단계: XSS 트리거
- 프로필 페이지를 방문하거나 새로고침합니다:
http://localhost:8080/profile
- JavaScript 경고 상자가 자동으로 실행됩니다
- 결과: JavaScript 코드가 성공적으로 실행되어 저장형 XSS 취약점이 확인됩니다
기대 동작
애플리케이션은 입력값을 검증하여 다음 중 하나를 수행해야 합니다:
- Bio 필드에서 모든 HTML 태그 제거
- 특수 문자(
<, >, ", ' 등) 인코딩
- CSP(Content Security Policy) 헤더 구현
실제 동작
악성 HTML/JavaScript 페이로드가 데이터베이스에 저장되고, 프로필 페이지가 렌더링될 때 아무런 검증이나 인코딩 없이 실행됩니다.
영향 평가
심각도: 높음(HIGH)
CVSS v3.1 점수: 8.1 (높음)
벡터 문자열: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
실제 영향
- 세션 하이재킹: 공격자가 세션 토큰을 탈취하여 사용자를 사칭할 수 있음
- 자격 증명 탈취: 악성 스크립트가 가짜 로그인 양식을 생성하여 자격 증명을 캡처할 수 있음
- 데이터 유출: 민감한 사용자 데이터가 공격자가 제어하는 서버로 전송될 수 있음
- 악성코드 유포: 사용자가 악성 웹사이트로 리디렉션될 수 있음
- 피싱 공격: 신뢰할 수 있는 도메인을 사용하여 설득력 있는 피싱 콘텐츠를 호스팅할 수 있음
- 계정 탈취: 다른 취약점과 결합하여 전체 계정 손상으로 이어질 수 있음