본문 바로가기
정보보안/Web Hacking

[CSRF] CSRF(Cross Site Request Forgery)공격 실습 - (DreamHack 실습예제)

by 우동이 2020. 7. 30.
300x250

CSRF(CrossSiteRequestForgery)

  • 사용자의 의도와 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 HTTP 요청을 하는 행위

CSRF 공격을 수행하기 위해 요구되는 조건 ▼

  • 웹 사이트의 인증방식은 쿠키를 이용해야 한다 혹은 예측 가능한 토큰 사용
  • 공격자가 알지 못하는 파라미터가 존재하면 안 된다 (공격은 전부 정상적인 경로로 수행된다)

 

 

Dreamhack의 CSRF-1 문제입니다.

제공된 사이트로 먼저 접속해보겠습니다.

 

4개의 링크가 존재합니다

/csrf

/memo

/notice flag

/flag

 

 

/csrf - 발생 가능한 csrf 취약점에 대한 힌트

/csrf는 현 사이트에 존재하는 csrf 취약점에 대한 힌트를 제공합니다.

위 url창에 입력된 주소를 보면

<script>alert(1)</script> 가 입력되었으나

<*> alert(1)로 출력되었습니다.

즉 script라는 문자열이 filtering 됨을 알 수 있습니다.

 

※ <script>alert(1)</script> = 1을 안내 메시지로 발생시키는 JavaScript

 

/memo - csrf를 통한 flag값이 여기로 출력된다

/memo에서는 url에 입력한 값이 그대로 전달되어 출력되고 있습니다.

 

/notice_flag : admin에 속해있으며 접속이 거부됨

/notice_flag는 admin계정에 속해있으며

현재 접속이 거부된 상태입니다.

 

 

/flag

/flag에서는 csrf 취약점을 발생시키는 공격 코드를 넣으면 되는 듯싶습니다.

이제 코드를 한번 살펴봅시다.

42번째 줄에서는 xss_filter가 frame, script, on 과같은 문자열을 필터링하고 있습니다.

 

 

67번째 줄의 /admin/notice_flag 에서부터 살펴보면

접속 주소가 127.0.0.1(localhost)이 아니면 'Access denied' 메시지를 출력하며

userid 값이 admin이 아닐 경우에도 조건에 부합하지 않습니다.

즉 우리는 로컬 호스트에 admin 계정이 아닌 이상

notice_flag에 접속할 수 없다는 얘기입니다.

 

<img src="link">
<img src=1 onerror="fetch('/link');">
<link rel="stylesheet" href="link">

위 세줄의 코드는 dreamhack 강의에서 제공 혹은 제가 긁어모은 

CSRF 공격 코드 예시입니다.

<img> 태그와 <link> 태그 두 가지 종류가 존재합니다.

이를 이용해 적절한 공격코드를 짜 보겠습니다.

 

<img src="/admin/notice_flag?userid=admin">

<img> 태그의 경로를 ' /admin/notice_flag? userid=admin'으로 지정했습니다.

위에도 적어뒀듯 CSRF 취약점은 사용자의 의도와 무관한

행위를 통해 HTTP 요청이 진행되는 취약점입니다.

즉 img 태그를 통해 userid가 admin이라는 요청을 했기에 위 코드를 통해

userid가 admin일 때만 접속 가능한 /admin/notice_flag에 접속할 수 있게 됩니다.

 

 

해당 코드를 그대로 /flag에 제출합니다.

그러면 /memo 항목에 flag가 출력됩니다.

이상 감사합니다.

 

 

 

300x250

댓글