🕵️ 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> 태그 내에서 사용할 수 있는 onfocus와 autofocus를 조합해 보기로 했다.
공격 코드 구성
우선 "를 사용해 placeholder 속성을 닫고, 바로 이어서 스크립트가 실행되도록 구성했다.
주의할 점: Burp Suite의 URL 파라미터로 날릴 때는 반드시 URL 인코딩을 해줘야 한다. 공백은 +로, 자바스크립트 코드의 + 기호는 %2b로 변환하는 것을 잊지 말자.
4. 공격 실행 및 결과
완성된 공격 링크를 통해 접속해 보니, 페이지가 로딩되자마자 ID 입력창에 포커스가 가면서 스크립트가 실행되었다.


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

💡 보안 분석 및 소감
이번 문제는 속성 값(Attribute Value) 영역에서의 XSS였다. 많은 개발자가 <script> 태그만 막으면 된다고 생각하지만, HTML 태그의 속성 안에서도 얼마든지 이벤트 핸들러를 통해 공격이 가능하다는 것을 배웠다.
✅ 방어 핵심 요약
1. 속성 값 이스케이프: HTML 태그의 속성 내에 사용자 입력값을 넣을 때도 반드시 인코딩 처리를 해야 한다. 특히"나'를 막지 못하면 속성을 탈출해 새로운 명령어를 주입할 수 있게 된다.
2. 이벤트 핸들러 제한:onfocus,onerror,onload등 잠재적으로 위험한 이벤트 핸들러 속성이 입력값에 포함되지 않도록 화이트리스트 검증이 필요하다.
매번 다른 위치에서 취약점을 찾아내고, 그 상황에 맞는 문법을 짜 맞추는 과정이 마치 퍼즐을 푸는 것 같아 재미있었다. 다음 단계로 넘어가 보자! 😎
'해킹스터디' 카테고리의 다른 글
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-5 (0) | 2025.12.31 |
|---|---|
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-4 (0) | 2025.12.30 |
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-2 (0) | 2025.12.30 |
| [Normaltic 웹해킹 입문] 9주차 문제풀이 XSS-1 (1) | 2025.12.30 |
| [Normaltic 웹해킹 입문] 9주차 XSS-내용정리 (0) | 2025.12.30 |