[버그바운티] CVE 분석 - NextChat SSRF 취약점(CVE-2023-49785)

Jay·2025년 1월 31일

BugBounty

목록 보기
3/6

NextChat이란? ChatGPT Next Web를 지칭하며 크로스 플랫폼으로 제공되는 LLM 서비스 대상 웹 인터페이스이다.

주로 기업들이 고객과의 소통하기 위해 사용하는 AI 챗봇 플랫폼을 칭한다. 자동화된 고객 서비스(자주 묻는 질문에 대한 자동 응답 기능), 자연어 처리, 채널 통합, 분석과 보고 등의 기능을 제공하며 해당 기능을 통해 운영 효율성을 높인다.

해당 취약점은 NextChat의 클라이언트 설정 동기화 기능에 사용되는 API를 통해 인가되지 않은 사용자가 SSRF를 수행할 수 있는 취약점이다.

개요

NextChat은 Next.js 기반 자바스크립트 애플리케이션으로, 대부분의 기능이 client-side code로 구현되어 있다.

  • NextRequest, NextResponse를 next/server에서 import. (모듈 임포트)
  • 핸들러 함수 정의 handle 비동기 함수. HTTP 요청과 URL 파라미터를 인자로 받음.
  • 요청 메서드가 OPTIONS인 경우, JSON 형식으로 응답을 반환. CORS 요청을 처리하는데 사용.
  • 요청 파라미터에서 프로토콜, 서브 경로를 추출하여 targetUrl을 구성. >> 요청을 보낼 대상 URL이 됨.
  • 요청 헤더에서 메서드를 가져오고, 메서드가 GET이나 HEAD인 경우 본문이 없어야 함 확인.
  • fetchOptions 객체로 요청 헤더와 본문 설정.
  • fetch 함수를 호출하여 targetUrl에 요청을 보냄.

해당 코드에서 확인할 수 있는 점: 서버 측에서 클라이언트의 요청을 다른 서버로 전달하고, 그 응답을 다시 클라이언트에 반환하는 역할을 하고 있다.

취약점에 노출될 수 있는 구조:
1. 사용자가 제공한 URL(targetUrl)로 요청을 보낼 수 있음 > 악의적인 사용자가 내부 네트워크의 서비스, API에 접근 가능.
2. 임의의 HTTP 메서드 사용 > 클라이언트가 요청 메서드를 지정할 수 있기에 원치 않는 데이터 변경, 삭제 수행 가능
3. 인증 헤더 노출 > 요청에 인증 헤더가 포함되기에, 공격자가 다른 서버로 보낸 요청에 사용자의 인증 정보가 포함될 수 있음.
4. 입력 검증 부족 > URL 파라미터에 대한 검증 부족.

정리하자면,
NextChat은 클라이언트 설정 데이터 동기화를 위해 원격 서버로부터 데이터를 불러오는 과정에서 /api/cors API 엔드포인트를 통해 서버를 프록시 삼아 CORS 정책을 우회한다. 이때 인증되지 않은 일반 사용자도 API 엔드포인트에 접근 가능하며, 임의의 HTTP 요청을 보낼 수 있게 된다. 입력받는 원격 서버 경로에 대한 검증이 부족하여 공격자는 해당 엔드포인트를 통해 NextChat 서버를 대상으로 SSRF를 수행할 수 있다.

탐지

해당 취약점은 다음의 nuclei 템플릿을 사용해서 탐지할 수 있다.

http:
  - method: GET
    path:
      - "{{BaseURL}}/api/cors/data:text%2fhtml;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+%23"
      - "{{BaseURL}}/api/cors/http:%2f%2fnextchat.{{interactsh-url}}%23"

    matchers-condition: and
    matchers:
      - type: word
        part: interactsh_protocol # Confirms the DNS interaction from second request
        words:
          - "dns"
      
      - type: dsl
        dsl:
          - 'contains(body_1, "<script>alert(document.domain)</script>") && contains(header_1, "text/html")' # XSS validation in first request
          - 'contains(header_2, "X-Interactsh-Version")' # Or got HTTP response back from Interact server

http: HTTP 요청을 통해 취약점을 탐지하는 방법을 정의함.

  • path 1: XSS 공격을 유발할 수 있는 데이터 URL을 사용. 이 URL은 HTML 스크립트를 포함하고 있으며, 이를 통해 악성 스크립트가 실행될 수 있다.
  • path 2: DNS 상호작용을 확인. 공격자가 DNS 요청을 생성했는지를 추적하는 데 사용.

matchers
- matchers type "word": dns라는 단어가 포함되어 있는지 확인. 공격자가 DNS 요청을 통해 자신의 서버와 상호작용했는지를 확인한다.

- matchers type "dsl"

  • matchers 1: 첫 번째 요청의 응답 본문에 가 포함되어 있어야 함. (=XSS 공격을 유발하는 스크립트) 악성 스크립트가 실행될 수 있음을 나타낸다.

  • matchers 2: 두 번째 요청의 응답 헤더에 "X-interactsh-Version"이 포함되어 있는지 확인. interact 서버로부터 응답을 받았음을 확인하는 것으로, 공격자가 DNS 상호작용을 성공적으로 수행했음을 의미한다.

완화

  • 애플리케이션을 공개 인터넷에 노출하지 않도록 권장함.

  • 인터넷에 노출해야 하는 경우, 다른 내부 리소스에 접근할 수 있는 격리된 네트워크에서 애플리케이션을 실행한다.

  • 취약점이 패치된 버전이 존재하기에 업데이트를 통한 조치가 가능함.

references:
https://www.horizon3.ai/attack-research/attack-blogs/nextchat-an-ai-chatbot-that-lets-you-talk-to-anyone-you-want-to/
https://s2w.inc/ko/resource/detail/720
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2023-49785

0개의 댓글