본문 바로가기
해킹/DVWA

DVWA 실습 3. Cross Site Request Forgery (CSRF) (Medium)

by yenua 2022. 5. 25.
반응형
Objective
Your task is to make the current user change their own password, without them knowing about their actions, using a CSRF attack.

CSRF를 이용하여 사용자가 비밀번호를 바꾸도록 하는 것이 목표이다.

 

low 단계에서 사용했던 html을 사용하면 아래와 같은 에러가 뜬다.

referer 값을 확인하는 로직이 추가된 모양이다.

 

그냥 해보다가 잘 안되서, 코드를 봤다.

<?php
if( isset( $_GET[ 'Change' ] ) ) {
    // Checks to see where the request came from
    if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
        // Get input
        $pass_new  = $_GET[ 'password_new' ];
        $pass_conf = $_GET[ 'password_conf' ];

        // Do the passwords match?
        if( $pass_new == $pass_conf ) {
            // They do!
            $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
            $pass_new = md5( $pass_new );

            // Update the database
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
            $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

            // Feedback for the user
            echo "<pre>Password Changed.</pre>";
        }
        else {
            // Issue with passwords matching
            echo "<pre>Passwords did not match.</pre>";
        }
    }
    else {
        // Didn't come from a trusted source
        echo "<pre>That request didn't look correct.</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

리퍼러를 검증하는 로직이 stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false 였다.

stripos는 첫 번째 인자에서 두 번째 인자가 있는 지 없는지, 대소문자 구분없이 찾아보는 함수이다.

https://e2xist.tistory.com/568

 

그렇다면, 내가만든 html이름을 서버 이름으로 바꾸면 괜찮지 않을까! 라고 생각했는데, 파일로 열면 referer가 찍히지 않고, 로컬호스트로 열자니 지금 컴퓨터에서 dvwa를 호스팅하고 있어서 불가능했다.

그래서 티스토리 블로그를 이용해보았다.

그런데 게시글 주소가 https://yenua.tistory.com/entry/1921680101 로 저장이 되어서 그냥 이부분은 패킷 변조로 referer 가 https://yenua.tistory.com/entry/192.168.0.101 인 것으로 바꾸었다.

호스트 주소가 아닌, 주소의 일부가 호스트 주소 이름이기만 해도 referer를 우회할 수 있었다. 

반응형

'해킹 > DVWA' 카테고리의 다른 글

DVWA 실습 5. File Upload (Medium)  (0) 2022.05.26
DVWA 실습 4. File Inclusion (Medium)  (0) 2022.05.25
DVWA 실습 2. Command Injection (Medium)  (0) 2022.05.24
DVWA 실습 1. Brute Force (Medium)  (0) 2022.05.24
DVWA 실습 14. JavaScript (Low)  (0) 2022.05.22