해킹스터디

[Normaltic 웹해킹 입문] 12주차 CSRF-Get Admin 2

herini0829 2026. 1. 6. 10:33

🕵️ CSRF-Get Admin 2 문제 풀이: POST 방식의 요청 위조와 스텔스 기법

CSRF-Get Admin 2번 문제다. 1번과 유사한 내용이지만, 이번에는 공격 방식에서 한 단계 더 나아간 고민이 필요했다. 이번에도 fsi5 계정을 생성하여 fsi5_admin의 비밀번호를 탈취하는 시나리오로 진행했다.


1. 문제 분석: GET이 안 된다면?

우선 비밀번호 변경 request 패킷을 분석해 보니, 지난번과는 다르게 POST 방식으로 데이터를 전달하고 있었다. 혹시나 하는 마음에 GET으로 방식을 바꿔서 보내봤지만, 서버에서 에러를 뱉으며 받아주지 않았다.

 

💡 여기서 얻은 결론
서버가 POST 방식만 수용한다는 것은 공격을 위해 폼(Form) 태그 전송이 반드시 필요하다는 뜻이고, 이는 곧 XSS 공격 포인트가 필수적이라는 의미다.

2. 공격 전략: 문의게시판 XSS 활용

이번에는 일반 게시판이 아닌 '문의게시판'을 이용해보기로 했다. 확인 결과 제목과 내용 모두 XSS가 열려있어 공격 코드를 심기에 아주 적합했다.

✅ 핵심 페이로드 분석 (iframe + Form)

<iframe width="0" height="0" name="StealthFrame" id="StealthFrame" style="display:none;" sandbox="allow-forms"></iframe>

<form method="POST" action="/update_pw" id="myForm" target="StealthFrame">
    <input type="hidden" name="pw" value="12345" />
</form>

<script>
    document.getElementById('myForm').submit();
</script>

이 코드의 핵심은 다음과 같다.

  • target="StealthFrame": 폼 제출 후 돌아오는 응답(Response) 화면을 내가 만든 투명 iframe으로 보내버린다. 그래야 관리자 화면에서 페이지 이동이나 알림이 뜨지 않는다.
  • name vs id: formtarget 속성은 iframe의 id가 아닌 name 값을 참조한다. 그래서 iframe에 name을 지정해주는 것이 중요하다.

🔍 기술 딥다이브: sandbox="allow-forms"의 역할

지난번에도 언급했듯, sandbox는 iframe 내부의 동작을 제한하는 보안 기능이다. 예외를 두지 않으면 자바스크립트 실행, 폼 제출, 팝업 등이 모두 금지된다. 여기서 좀 헷갈리는 개념이 등장하는데 어차피 form은 request로 iframe 밖에서 나가고 target은 response를 iframe 안에서 받는다는 건데 왜 allow-forms가 필요할까?(request는 iframe 밖에서 이뤄지는데?)

여기서 중요한 개념이 target을 지정하는 순간 브라우저는 form과 관련된 일체의 행위가 iframe 안에서 일어나는 것으로 이해한다고 한다. 이를 브라우저의 컨텍스트(Context) 분리샌드박싱(Sandboxing) 모델이라고 한다고 함

❓ 왜 allow-forms만 쓰나요?
우리의 목적은 '비밀번호 변경 폼 제출'이다. allow-forms를 주면 폼 제출은 가능해지지만, 자바스크립트 실행(allow-scripts)이나 모달창(allow-modals) 권한이 없으므로 서버가 보내는 "변경되었습니다"라는 알림창(Alert)은 실행되지 못하고 무시된다. 덕분에 완벽한 스텔스 공격이 가능해지는 것이다.

3. 최종 공격 성공

문의게시판에 해당 페이로드를 심고 관리자 봇이 확인하게 만들었다. 잠시 후 fsi5_admin 계정에 내가 설정한 비밀번호 12345를 입력하니 성공적으로 로그인이 되며 플래그를 획득할 수 있었다.

 


💡 마무리하며

POST 방식의 CSRF는 XSS와의 연계가 얼마나 강력한지를 보여주는 사례였다. 특히 target 속성을 이용해 응답을 가로채고 sandbox로 알림을 차단하는 기법은 실전에서도 매우 유용할 것 같다. 뿌듯하다! 😎