
CVE-2025-68147용 PoC 저장소: OpenSourcePOS의 저장형 교차 사이트 스크립팅(XSS). 이 취약점은 Store Config 모듈에 악성 JavaScript를 주입하여 권한 상승을 허용합니다. 페이로드 세부 정보 및 패치 검증(v3.4.0) 포함. 보안 연구원: Aditya Singh (Nixon-H).
| 메타데이터 | 세부 사항 |
|---|
| CVE ID | CVE-2025-68147 |
| 심각도 | 높음 CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N |
| 취약점 유형 | 저장형 교차 사이트 스크립팅 (CWE-79) |
| 영향을 받는 버전 | OpenSourcePOS v3.4.0, v3.4.1 |
| 패치된 버전 | v3.4.2 |
| 취약한 구성 요소 | 매장 구성 모듈 (반품 정책 필드) |
| 보고자 | Aditya Singh (Nixon-H) |
OpenSourcePOS의 매장 구성 모듈에서 저장형 교차 사이트 스크립팅 (XSS) 취약점이 발견되었습니다. 애플리케이션이 "반품 정책" 필드에서 사용자 입력을 ospos_app_config 데이터베이스 테이블에 저장하기 전에 제대로 이스케이프(escape)하지 못했습니다.
이 결함으로 인해 구성 권한이 있는 인증된 공격자(또는 별도의 CSRF 체인을 이용하는 공격자)가 임의의 JavaScript 페이로드를 주입할 수 있었습니다. "반품 정책"은 모든 판매 영수증에서 동적으로 렌더링되므로, 주입된 페이로드는 영수증이 생성되거나 조회될 때 모든 사용자(낮은 권한의 계산원, 다른 관리자, 고객 포함)의 브라우저에서 자동으로 실행됩니다.
취약점은 영수증 보기 템플릿 app/Views/sales/receipt_default.php에 있습니다.
애플리케이션은 전역 구성 배열($this->config['return_policy'])에서 "반품 정책" 문자열을 가져와 표시를 준비합니다.
nl2br()를 사용하여 새 줄을 HTML 줄 바꿈(<br>)으로 변환했습니다.nl2br()는 HTML 특수 문자를 정화(sanitize)하지 않습니다. <script>, ``, onload 속성 같은 태그를 그대로 남겨둡니다.취약한 코드 (패치 전):
<div id="sale_return_policy">
<?php echo nl2br($this->config['return_policy']); ?>
</div>
관리자가 구성을 저장하면 페이로드가 데이터베이스에 원본 그대로 저장됩니다.
ospos_app_configreturn_policyPolicy Text... <script>alert('XSS')</script>컨트롤러 측(Config.php)에서 입력 정화가 없고, 뷰 측(receipt_default.php)에서 출력 이스케이프가 없기 때문에 애플리케이션은 저장형 XSS에 취약합니다.
공격은 Store Configuration 패널을 대상으로 하지만 Sales/Receipt 모듈에 영향을 미칩니다.
http://[TARGET]/config (구성을 저장하는 POST 요청)http://[TARGET]/sales/receipt/[SALE_ID]1단계: 주입 관리자로 로그인한 후 Store Configuration -> General로 이동했습니다. "Return Policy" 텍스트 영역에 다음 특정 페이로드를 주입했습니다:
Standard Return Policy: No Refunds.
<script>alert('XSS_BY_NIXON_SUCCESSFUL')</script>
2단계: 지속성
"Submit"을 클릭하면 애플리케이션이 /config/save로 POST 요청을 보냈습니다. 페이로드가 데이터베이스에 성공적으로 저장되었습니다.
3단계: 트리거 다른 사용자에 대한 영향을 확인하기 위해:
http://localhost/sales/receipt/1)로 리디렉션됩니다. 브라우저가 return_policy div를 구문 분석하고 <script> 태그를 만나 즉시 JavaScript를 실행합니다.관찰된 결과:
메시지가 XSS_BY_NIXON_SUCCESSFUL 인 브라우저 경고 상자가 나타났습니다.
스크린샷 1: 알림 트리거
스크린샷 2: 구성 내 페이로드
🎥 동영상 데모: PoC 동영상 다운로드 / 보기
이는 범위 변경 (S:C) 취약점입니다. 공격이 서버에 저장되지만 피해자의 브라우저 컨텍스트에서 실행되기 때문입니다.
/sales/receipt/105)을 조회합니다. 스크립트가 조용히 실행되어 document.cookie(ospos_session ID 포함)를 공격자의 서버로 전송합니다./employees/save에 숨겨진 POST 요청을 보냅니다.hacker / password123)이 생성됩니다. 피해자는 영수증만 볼 뿐이며, 공격자는 영구적인 백도어를 얻습니다.이 취약점은 OpenSourcePOS v3.4.2에서 수정되었습니다.
관리자는 컨텍스트 인식 출력 인코딩을 구현하는 패치를 적용했습니다. 이제 구성 값이 nl2br()에 전달되기 전에 CodeIgniter의 전역 esc() 헬퍼 함수로 래핑됩니다.
패치 (커밋 22297a):
<div id="sale_return_policy">
<?php echo nl2br(esc($this->config['return_policy'])); ?>
</div>
확인: v3.4.2로 업그레이드한 후, 동일한 페이로드가 무해한 텍스트로 렌더링됩니다:
Standard Return Policy: No Refunds. <script>alert('XSS_BY_NIXON_SUCCESSFUL')</script>
22297a) 및 연구자가 검증.