[WARGAME] DVWA write-up/ Cross Site Request Forgery (CSRF)/ medium

jckim22·2022년 10월 26일
0

[WEBHACKING] STUDY (WARGAME)

목록 보기
33/114

/*

웹서버 환경: Window 10

공격 클라이언트 환경: Kali linux (VMware 구동)

*/

이번 문제는 csrf이다.

csrf의 관한 내용은 아래 low레벨 풀이에서 볼 수 있다.
low레벨 풀이
csrf 공격자는 게시물에 악성코드를 담거나 악성파일을 심어 놓고 타겟을 피싱하여 그 스크립트를 타겟의 로그인된 권한으로 악의적 요청을 보내도록 해야한다.

하지만

이라는 REFERER에 관한 경고가 뜨게 되면서 비밀번호 변경에 실패하게 된다.

이번 문제에서 low와 다른 점이라고 한다면 요청 패킷의 헤더에서 Referer를 검사한다.
Referer 라는 것은 이전에 어디서 요청 보내왔는지에 관한 것이다.
우리가 블로그를 찾을 때 유입된 곳을 알아내는 것이라고 생각하면 편하다.

서버에서는 아래 코드로 Referer를 검사한다.
stripos는 전자를 대상으로 후자의 문자열이 있는지 검사하게 된다.
SERVER의 ip가 REFERER에 담겨야지만이 정상적인 요청이라고 받아들이게 되는 것이다.

if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {

아래는 이전에 low레벨처럼 GET요청을 악용한 URL로 접속했을 때 패킷이다.
Referer가 보이지 않는다.

아래는 사용자가 정상적으로 form에서 비밀번호를 변경하고 성공하는 요청이다.
Referer를 보게 되면 사용자는 서버에서 요청을 보내게되고 Referer는 정상적으로 192.168.11.1인 Server의 주소를 갖고 있다.

위에 Referer를 검사하는 코드를 보면 Referer내에 서버의 주소만 담겨있으면 되는 것을 알 수 있다.
그렇다는 것은 파일명을 서버의 주소로 하게 되면 코드는 Referer에 192.168.11.1.이 있는 것으로 인식하고 성공적으로 비밀번호 변경을 진행시켜 줄 것이다.

그럼 low레벨을 풀이할 때 사용했던 아래 파일을 준비하자.
대신 이 파일에 이름을 서버의 호스트 ip로 변경해주자.
이걸 서버에 있는 악성 스크립트라고 생각하고 이 파일의 링크를 보낼 것이다.

아래처럼 사용자가 충분히 피싱당할 수 있게 숨겨서 보낸다.

하지만

strict-origin-when-cross-origin 정책

이 정책이 2021년도부터 시행 되면서 아래치럼 Refere 뒷부분이 잘리는 것을 볼 수 있다.
origin이 맞지 않다면 뒤에 부분을 자르면서 Referer의 파라미터에 보이는 개인정보들을 보호하는 것 같다.

이 정책은 클라이언트에게 편의를 봐주는 정책이기 때문에 쉽게 해제할 수 있다. 악성 html파일에 <a> 태그에 referrerpolicy 속성값을 unsafe-url을 추가해주면 된다고 한다.

그렇기에 파일을 조금 수정을 해보자.

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Hi</title>
</head>
<body>
	<a href="http://192.168.5.1/dvwa/vulnerabilities/csrf/?password_new=12345&password_conf=12345&Change=Change#"
	referrerpolicy="unsafe-url">
	Click !!</a>
</body>
</html>

그럼 이제 타켓의 pc로 다시 피싱 url로 접속을 해보자
아래와 같이 Referer에 뒤에 파일명이 호스트 ip인 파일이 같이 나오게 되면서 성공적으로 비밀번호가 변경되게 된다.

칼리 리눅스가 잘 돌아가지 않아서 로컬에서 임의로 했지만 원래는 아래와 같이 unsafe-url이라는 값이 헤더에 담기게 된다.

profile
개발/보안

0개의 댓글