본문 바로가기
Portswigger/DOM-based vulnerabilities

Portswigger - DOM XSS using web messages and JSON.parse solution

by jh117jh 2024. 1. 18.
728x90

 

이번 문제는 웹 메시지를 JSON으로 구문분석하고 print함수를 호출하면 문제가 풀린다.

 

 

사이트의 script문을 보면 createElement로 ifame 태그를 생성하고 iframe변수로 선언한다 그리고 appendChild를 이용해 iframe 변수를 body안에 넣는다.

 

그다음 JSON.parse를 이용해 e.data 즉, 메시지의 내용을 자바스크립트 객체로 만들어준다.

이로써 메시지를 JSON형태로 작성하면 되는 걸 알 수 있다.

 

그 아래 switch문을 봐보자

3가지의 case로 나눠져 있는데

이중 우리가 주목해야 될 case는 두 번째다.

만약 d.type 즉, JSON형태의 메시지에서 type키를 가진 값이 load-channel일 때 ACMEplayer.element.src(iframe의 src)를 d.url로 선언한다.

 

그러면 메시지를 JSON형태로 {"type":"load-channel", "url":javascript:print()"}을 넣어서 보내면 url이 src로 들어가게돼 print함수가 출력될 것이다.

 

<iframe  src="https://0a8d005a044ee8208192028b00f000cd.web-security-academy.net" height=100% width=100% 
onload="this.contentWindow.postMessage('{"type":"load-channel","url":"javascript:print()"}',
'https://0a8d005a044ee8208192028b00f000cd.web-security-academy.net')">

 

코드를 작성 후 제출해 보자 

 

print함수가 호출되지 않는다...

 

 

그래서 코드를 봤더니 더블쿼터(")가 특수문자로 해석돼서 구문오류가 일어났다.

 

그럼 저번 문제처럼 앞에 백슬레쉬(\)를 추가해서 문자로 취급되게 해 보자

 

 

....?

 

왜 문자취급이 안되지..?

 

흠...

 

고민 끝에 html엔티티를 이용하기로 했다.

 

<iframe  src="https://0a8d005a044ee8208192028b00f000cd.web-security-academy.net" height=100% width=100% 
onload="this.contentWindow.postMessage('{&quot;type&quot;:&quot;load-channel&quot;,&quot;url&quot;:&quot;javascript:print()&quot;}',
'https://0a8d005a044ee8208192028b00f000cd.web-security-academy.net')">

 

 

정상적으로 print함수가 출력되었다.

 

왜 \"가 문자로 취급이 안되었는지는 다시 찾아봐야 할 것 같다.

 

728x90