web security academy 20

2026. 3. 16. 15:33ㆍ보안/Web security Academy

Lab: DOM XSS in jQuery selector sink using a hashchange event

 

This lab contains a DOM-based cross-site scripting vulnerability on the home page. It uses jQuery's $() selector function to auto-scroll to a given post, whose title is passed via the location.hash property.

To solve the lab, deliver an exploit to the victim that calls the print() function in their browser.

(이 연구실에는 홈페이지에 있는 DOM 기반 사이트 간 스크립팅 취약점이 포함되어 있습니다. 이 연구실은 jQuery의 $() 셀렉터 함수를 사용하여 주어진 게시물에 자동으로 스크롤되며, 해당 게시물의 제목은 location.hash 속성을 통해 전달됩니다.

실험실 문제를 해결하려면 피해자에게 브라우저에서 print() 함수를 호출하는 익스플로잇을 전달하세요.)

 

1. 현재 이 lab에서 입력을 할 수 있는 창이 보이지 않아 코드를 살펴보니 의심가는 부분이 
<script>
                        $(window).on('hashchange', function(){
                            var post = $('section.blog-list h2:contains(' + decodeURIComponent(window.location.hash.slice(1)) + ')');
                            if (post) post.get(0).scrollIntoView();
                        });
</script>

이 부분 입니다 여기서 window.location.hash를 보고 URL에 입력을 하여 사용하는 방식인것을 짐작했습니다

그렇게 이전에 했던 onerror를 통해 <img src =x onerror=print()> 구문을 입력해주면 

 

print관련 페이지가 발생합니다 그럼 이를 바탕으로 문제에 있는 

To solve the lab, deliver an exploit to the victim that calls the print() function in their browser.

( 실험실 문제를 해결하려면 피해자에게 브라우저에서 print() 함수를 호출하는 익스플로잇을 전달하세요. )

이 부분이 사용자가 브라우저에 접속을 하면 print()함수를 호출하도록 해야합니다 

이 부분을 보면 브라우저에 접속을 할때 서버와 연결이 되면서 브라우저에서 서버에서 받는 부분에 print함수가 있어야한다고 생각할 수 있습니다

 

그럼 go to exploit server에 들어가서 

확인을 하면 입력할 수있는 부분들이 file head body가 있습니다 

여기서 body 부분에 iframe을 사용하여 코드를 작성할 것입니다 

iframe을 사용하는 이유는 

 

"단순히 악성 페이로드가 담긴 URL을 전달하는 대신 <iframe>을 활용하는 이유는, hashchange 이벤트를 인위적으로 발생시켜 취약한 자바스크립트 함수가 확실히 실행되도록 유도하기 위함이다. 또한 이는 공격 코드를 주소창에서 숨기는 은폐성과 실행 타이밍을 조절하는 안정성을 동시에 제공한다."(제미나이)

 

 

이제 body 부분에 

<iframe src="https://[본인의-LAB-ID].web-security-academy.net/#" onload="this.src+='<img src=x onerror=print()>'"></iframe> 코드를 작성해 주시면 됩니다

여기서 이제 onload는 웹페이지가 로딩이 된 다음에 this.scr+=.. 부분을 hashchange이벤트가 발생되어 악성코드가 실행하게 됩니다 this.scr에는 http...#까지가 들어 있고 이제 <img ... 부분이 추가가 됩니다 

 

ps. 입력할 수 있는 부분에 file head body가 있는데 왜 body에 해야하는지 의문이 들어 제미나이에게 물어봤습니다 

 

"익스플로잇 서버의 File 필드는 서버 내의 자원 경로(Endpoint)를 지정하는 곳이다. 실제 공격을 수행하는 HTML/JS 코드는 서버가 응답으로 돌려줄 데이터 본문인 Body 필드에 작성해야만, 피해자가 해당 경로에 접속했을 때 브라우저가 코드를 정상적으로 해석하고 실행할 수 있다." file 부분에 넣으면 해당 코드에 맞는 파일을 찾기 때문에 오류가 발생할 수 있다는 것이다

 실제로 이런 오류가 발생했고 파일 경로의 형식에 맞지 않는다 라고 오류가 발생했습니다 

 

다음으로는 head에 넣어봤는데 

 

브라우저는 HTML을 위에서부터 순차적으로 해석합니다. <head>는 페이지의 정보를 담는 공간이고, <body>는 실제 콘텐츠가 표시되는 공간입니다. <iframe>과 같은 화면 구성 요소를 조작할 때는 요소가 브라우저에 의해 완전히 인식된 상태인 <body> 단계에서 실행해야 에러 없이 안정적으로 hashchange 이벤트를 트리거할 수 있습니다.

 

 

이런 오류가 발생했다 이 내용은 http 형식에 맞지 않는다라는 오류이며 따라서 이 lab에서는 file과 head부분에 악성코드를 넣는것이 아니다라고 알 수 있습니다

'보안 > Web security Academy' 카테고리의 다른 글

web security academy 22  (0) 2026.03.18
web security academy 21  (0) 2026.03.17
web security academy 19  (0) 2026.03.14
web security academy 18  (0) 2026.03.13
web security academy 17  (0) 2026.03.11