본문 바로가기

웹 해킹

[주통기반] 로컬 웹 서버 취약점 찾기 (CSRF)

CSRF는 사용자의 의지와 상관없이 서버로 공격자가 원하는 임의의 요청을 보내게 하는 공격입니다.
그렇기 때문에 서버에서 발생하는 모든 요청이 CSRF 공격의 대상이 될 수 있고, 요청의 중요성을 판단하여 대응이 필요합니다.

 

만약 서버에 사용자의 비밀번호 변경 요청이나, 계정 삭제 등의 요청을 사용자의 의지와 상관없이 보낼 수 있게 된다면 사용자는 자신도 모르게 비밀번호가 변경되고 계정이 삭제되는 것입니다.

 

제가 만든 서버에 CSRF 취약점을 찾으려 했는데 POST 메서드를 사용하는 요청은 전에 XSS에 대해 대응을 적용하여 폼을 생성할 수 없었고, GET 메서드 요청에는 그닥 CSRF 공격을 통해 효과를 보지 못하였습니다. 

그렇다고 POST 메서드로 요청을 처리한다고 CSRF 공격을 무조건 막을 수 있는 것이 아닙니다. XSS 취약점을 이용하여 가짜 폼을 생성하여 POST 요청을 보낼 수 있기 때문에 CSRF 의 근본적인 대응방안은 되지 못합니다.

 

그래서 잠깐 회원정보 변경 요청을 GET으로도 처리할 수 있게 변경하고 원래 비밀번호를 추가로 받던 로직을 없애 변경할 데이터만 입력해주면 변경할 수 있게 바꾸었습니다.

 

점검 내용 : 사용자의 신(인증) 정보의 변조 여부 점검

1. 회원정보 수정

1) 회원정보 페이지에 접속합니다.

마이페이지

 

2) 수정 요청 패킷을 잡아 확인합니다.

회원정보 변경 요청 패킷 확인

 

3) 요청 메서드를 GET으로 변경하여 요청 성공 확인

GET 메서드 요청

 

4) 전화번호 바뀐 것 확인

 

GET으로 요청을 해도 회원정보가 변경되는 것을 확인할 수 있습니다.

 

그럼 이제 이 요청 링크를 그대로 복사하여 admin 계정이 링크를 클릭했을 때를 확인해보겠습니다.

 

5) admin 계정이 링크를 클릭하여 서버로 회원정보 변경 요청을 보냅니다.

CSRF 공격

 

연습에서는 URL을 입력하였지만, 실제 공격에서는 링크를 배포하여 링크를 클릭하면 요청이 실행됩니다.

 

6) 요청이 성공적으로 완료되었는 지 확인해봅니다.

회원정보 변경 완료

 

우리가 정한 데이터로 회원정보가 변경된 것을 확인했습니다.

 

[대응방안]

대응방안은 제가 처음 구현한 것처럼 추가인증을 받아 요청을 처리하는 것이 가장 좋습니다.

추가로 비밀번호를 입력받아야한다면 공격자가 비밀번호를 알지 못하는 상황에서는 요청을 만들 수 없어 CSRF 공격을 원천적으로 막을 수 있습니다.

 

또한, 매번 추가 인증을 구현하기 힘든 페이지에는 CSRF Token을 사용하여 정상적인 요청인지 확인하면 될 것 같습니다.

CSRF Token은 해당 페이지를 요청할 때 서버에서 임의의 랜덤한 값을 응답에 포함해서 보냅니다. 그럼 해당 페이지를 통해서 요청을 보낼 때만 토큰 값이 포함되어 서버에서는 정상적인 요청임을 확인할 수 있습니다.

 

1) 추가 인증 정보를 받는 로직 구현

<?php
require_once('models/user-model.php');

$enteredName = $_POST['name'];
$enteredEmail = $_POST['email'];
$enteredPhone = $_POST['phone'];
$enteredBirth = $_POST['birth'];
$enteredConfirmPassword = $_POST['confirmPassword'];

$updateUserClass = new User($userId, $enteredName, '', $enteredEmail, $enteredPhone, $enteredBirth);

if (!$updateUserClass->checkPassword($enteredConfirmPassword)) {
    echo "<script>alert('비밀번호가 틀력습니다.')</script>";
    exit;
}

$updateUserClass->updateUser();
header('location: mypage.php');
?>

 

CSRF
공격 실패

 

링크를 클릭하여도 사진과 같이 회원정보가 변경되지 않습니다.