이번 문제는 표준 링크 태그에 사용자입력을 반영하고 꺽쇠(<,>)를 이스케이프 처리한다.
또한 사용자가 세 가지의 키 조합을 누르는 걸 가정한다.
- ALT+SHIFT+X
- CTRL+ALT+X
- Alt+X
표준링크란
위에 사진에서 rel="canonical"로 표시된 링크로 Google이 사이트의 중복된 페이지 중 가장 대표적이라고 간주하는 페이지의 URL을 말한다. 예를 들어, 동일한 페이지의 URL이 여러 개 있는 경우(example.com?dress=1234 및 example.com/dresses/1234) Google은 하나를 표준 URL로 선택한다.
https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls?hl=ko
이러한 표준링크에서 사용자의 입력을 반영한다는 것인데
url에 ?a=123을 입력하면
반영된 걸 볼 수 있다.
보통이면 꺽쇠(<,>)를 이용해 link태그를 종료하고 스크립트문을 넣겠지만 이번 문제에서는 필터링되어 사용할 수 없다.
문제에서 사용자가 세가지의 키 조합을 누른다고 되어 있는데 이는 accesskey 속성을 사용하라는 뜻이다.
말 그대로 바로가기 키(access key)이므로 accesskey 속성이 적용된 요소는 포커스를 받거나 실행이 이루어진다. input 요소에 적용되면 포커스를 받게 되고, a 요소에 적용되면 해당 키를 눌러 곧바로 목적지로 이동한다.
단축키 조합은 웹 브라우저 마다 다르다.
<a href="http://www.google.com/" accesskey="g">Google</a>
예를 들어 위 a태그처럼 accesskey를 g로 지정해 놓으면 Alt + Shift + g를 누를 시 구글로 바로 이동된다.
심지어 accesskey는 글로벌 속성(Global Attribute)으로 모든 태그 안에 적용할 수 있다.
그럼 이제 href 속성을 닫아주고 accesskey속성만 작성해 주면 문제가 풀릴 것이다.
url에 ?'accesskey='x'onclick='alert(0)을 입력하면
accesskey가 적용되고
Alt + Shift + x(mac os 사용 시 Ctrl + opt + x)를 누르면 alert함수가 호출되는 걸 볼 수 있다.