반응형

문제 링크

https://portswigger.net/web-security/csrf/bypassing-token-validation/lab-token-validation-depends-on-request-method

 

 

목표 & 사용 도구

목표: CSRF 취약점을 이용하여 피해자의 이메일 주소를 변경시키는 것입니다.

 

사용도구: Burp Suite

 

 

문제 설명

해당 랩의 이메일 변경 기능에는 CSRF 취약점이 존재한다고 합니다. CSRF를 차단하려고 시도를 하지만 특정한 타입의 요청에만 방어가 되고 있으며 exploit 서버를 이용해서 다른 계정의 이메일 주소를 바꿔야 랩 문제를 해결할 수 있다고 합니다. 자격 증명에 사용되는 사용자(본인)의 계정은 다음과 같습니다.

 

wiener:peter

 

 

문제 풀이

  • ACCESS THE LAB을 클릭해서 랩에 접속합니다.

 

  • My account를 클릭합니다.

 

  • My account 페이지에 접속하기 위해서 로그인을 해야 하며 문제에서 제공된 계정으로 로그인합니다.

 

  • 이메일 변경을 위해 변경할 이메일 주소를 입력 후 Update email을 클릭합니다.

 

  • 이메일이 변경된 것을 확인합니다.

 

  • 이때 이메일을 변경할 때 요청을 취득해 보면 변경할 이메일 주소와 csrf 토큰이 같이 전송되고 있다는 것을 알 수 있습니다.

 

  • 이메일 변경할 때의 요청을 Burp Suite Repeater 기능에 세팅합니다.

 

  • email, csrf 파라미터 중 csrf 파라미터 값을 임의의 값으로 하면 유효하지 않은 CSRF 토큰이라는 응답을, 제거하고 요청을 보내면 csrf 파라미터가 없다는 응답을 받게 됩니다.

-csrf 파라미터 값을 임의의 값으로 변경하고 요청을 전송했을 때

 

-csrf 파라미터를 제거하고 요청을 전송했을 때

 

  • 실제로 My account 페이지를 보면 이메일이 바뀌지 않고 있는 것을 볼 수 있습니다. 

 

  • 다시 이메일 변경 요청으로 돌아와서 Change request method 기능을 사용합니다.

 

  • Change request method를 통해 기존 POST 메서드를 GET 메서드로 변경한 뒤 요청을 전송하면 302 Found 결과를 받는 것을 볼 수 있습니다. 302 응답과 함께 Location이 My account인 것으로 봤을 때 요청이 정상적으로 처리되었다는 것을 알 수 있습니다.

 

  • 이어서 My account 페이지에 접속하여 새로고침을 해보면 이메일이 변경된 것을 볼 수 있습니다. 

[설명]

기존의 이메일 변경 요청을 전송할 때는 POST 메서드 방식이었고 CSRF 토큰 값이 유효하지 않거나 없으면 이메일 변경이 불가능했습니다. 하지만 CSRF 공격에 대한 방어가 POST 메서드 방식일 때만 적용되고 있었고 GET 메서드 방식은 방어가 적용이 되지 않고 있었습니다. 그렇기 때문에 GET 메서드로 이메일 변경을 요청하면 CSRF 토큰 값 검사를 하지 않아 CSRF 방어를 우회하여 이메일 변경이 가능했던 것입니다.

 

  • Go to exploit server를 클릭합니다.

 

  • 접속한 뒤 Body 부분에 페이로드를 삽입하고 Store을 클릭합니다.

[페이로드]

<form id="myForm" method="GET" action="https://{lab-id}.web-security-academy.net/my-account">
<input type="hidden" name="email" value="test@attack.com">
</form>

<script>
document.getElementById('myForm').submit();
</script>

[설명]

해당 페이로드의 경우 form 태그와 script 태그를 이용하여 다른 사용자가 페이로드가 삽입된 페이지에 접근했을 때 자동으로 자신의 이메일 주소를 변경하도록 하는 페이로드입니다. 

method 속성은 form 태그 요청 메서드를 지정합니다. action 속성은 요청을 보낼 URL을 지정합니다. script 태그 내부 내용의 경우 id가 myForm인 요소를 가져와 submit(), 즉 제출을 하도록 처리합니다. script 태그를 이용하면 form 데이터를 전송할 때 제출 버튼 클릭과 같이 상호작용을 하지 않아도 요청이 전송됩니다.

 

 

  • Store 후 Deliver exploit to victim을 클릭합니다.

 

  • 피해자(다른 사용자)가 이메일 변경 요청 페이로드가 삽입된 페이지로 접속을 하게 되면서 피해자의 이메일 주소가 변경되어 랩 문제가 해결된 것을 볼 수 있습니다.

 

  • exploit 페이지에서 Access log를 클릭합니다.

 

  • 로그를 보면 이메일 변경 요청 페이로드가 삽입된 페이지에 피해자가 접근했던 기록이 있는 것을 볼 수 있습니다. 

반응형
반응형

| CSRF

요청을 위조하여 서버로부터 해당 요청을 하게 만드는 공격.

 

| CSRF가 발생할 수 있는 곳

모든 요청에서 CSRF는 발생할 수 있습니다.

 

💡 CSRF vs XSS 

CSRF XSS
서버측 공격 클라이언트측 공격
스크립트 삽입하지 않아도 실행됨. 스크립트를 삽입하여 하는 공격

 

+) CSRF, XSS는 서로 다른 종류의 공격이지만 CSRF를 XSS와 연계했을때 시너지가 좋습니다.


▶️ 공격방식(요청 위조시)

CSRF는 요청을 위조하여 서버 측에서 실행시키도록 하는 공격입니다. 이때 GET Method, POST Method 2가지 방법으로 CSRF 공격을 수행할 수 있습니다. 실습을 해보면서 GET Method, POST Method 각각에서 어떻게 CSRF 공격이 수행되는지 살펴보겠습니다.

 

🔓 CSRF - GET Method 찾아보기

어떤 웹사이트에서 정말 간단한 비밀번호 변경 페이지가 있다고 가정합니다.

비밀번호 변경페이지

 

이때 새로운 비밀번호를 입력해 주고 비밀번호 변경을 했을 때 요청, 응답 데이터를 취득하여 확인합니다.

비밀번호 변경 시 요청 및 응답 데이터(1)
비밀번호 변경 시 요청 및 응답 데이터(2)

 

요청 데이터 부분을 확인해 보면 데이터 전송 방식이 POST Method인 것을 알 수 있으며 파라미터 정보들 또한 알 수 있습니다. 이제 해당 요청을 보낼 때 POST Method가 아닌 GET Method 방식으로 데이터를 전송하여 GET Method 방식으로도 비밀번호 변경이 가능한지 확인합니다. (이전 비밀번호: 1234, 변경할 비밀번호: 123)

GET Method로 비밀번호 변경을 시도 했을 때 요청 및 응답 데이터

 

바로 위 사진과 같이 GET Method 형태로 바꾼 뒤 해당 요청을 전송을 합니다. 변경된 비밀번호로 로그인을 해보면 성공적으로 비밀번호가 바뀐 것을 알 수 있습니다.

GET Method로 변경된 비밀번호 입력

 

GET Method를 통해 비밀번호 변경을 요청할 때 URL 링크를 확인하면 다음과 같습니다. 

/update_info.php?new_password=123

 

저는 localhost 환경에서 테스트하고 있기 때문에 전체 주소는 다음과 같습니다.

http://localhost/update_info.php?new_password=123

 

[중요]

만약 여기서 해당 웹사이트를 이용하고 있는 어떤 사용자가 바로 위 주소로 접속하게 된다면? => 비밀번호가 123으로 바뀌게 됩니다. 

 

로그아웃을 한 뒤 다른 계정으로 접속하고 해당 링크를 클릭하여 정말 비밀번호가 변경되는지 확인해 보겠습니다. 현재 접속한 계정 정보는 다음과 같습니다. (사용자 아이디: sudo, 비밀번호: 1234)

 

이 상태에서 사용자가 비밀번호를 변경하는 URL 링크 주소에 접속해 보겠습니다. 페이로드는 다음과 같습니다.

http://localhost/update_info.php?new_password=change

비밀번호 변경 URL 링크 입력

 

위와 같이 주소를 입력하고 접근 해보면 다음과 같이 패스워드가 변경되는 것을 알 수 있습니다.

링크에 접속했더니 비밀번호가 변경됨.

 

정말로 비번이 바뀌었는지 확인하기 위해서 기존 비밀번호인 1234를 입력하고 로그인을 시도하면 다음과 같이 로그인에 실패하는 것을 볼 수 있습니다.

원래 비밀번호로 로그인 시도

 

이번엔 바뀐 비밀번호인 change를 입력하고 로그인을 시도해 보면 정말로 비밀번호가 바뀐 것을 알 수 있습니다.

바뀐 비밀번호로 로그인 시도

 

웹사이트 사용자가 누군가가 보낸 URL 링크에 접속했을 때 위 과정처럼 비밀번호를 변경하는 주소였다면 사용자는 링크에 접속하는 것만으로도 비밀번호가 변경되게 됩니다. 이처럼 사용자의 요청을 위조하여 자신의 의지와 무관하게 공격자가 의도한 행위를 하도록 하는 것이 CSRF 공격입니다.

 

지금까지 실습 과정을 통해 GET Method를 통한 CSRF 공격을 살펴봤습니다. 만약 GET Method를 사용할 수 없다면 다른 방법을 사용해야 하는데 그 방법은 다른 글에서 찾아뵙도록 하겠습니다.

반응형

+ Recent posts