DVWA - CSRF ( Low )
DVWA - CSRF ( Low ) 입니다

개요
이 포스팅에서는 DVWA(Damn Vulnerable Web Application) - CSRF, Low 단계 실습을 진행하면서 공부했던 내용에 대한 내용을 정리해 보았고, 모두 본인이 소유한 가상머신에서 실습이 이루어졌습니다
실습환경
M1 MacBook Air
16G RAM
UTM - 가상머신
Kali Linux 2023.1 - Apple Silicon (ARM64)
목차
1. 취약점 설명 및 분석 - 소스코드 분석, CSRF
2. CSRF 실습
3. 대응방안
취약점 설명 및 분석
소스코드 분석
// 위치 : /var/www/html/dvwa/vulnerabilities/csrf/source -> low.php
// 중요내용 제외 삭제하였음
<?php
if( isset( $_GET[ 'Change' ] ) ) {
$pass_new = $_GET[ 'password_new' ]; // 비밀번호, 비밀번호 확인 정보 가져오기
$pass_conf = $_GET[ 'password_conf' ];
if( $pass_new == $pass_conf ) { // 비밀번호 일치 확인
// 비밀번호가 일치할 경우 비밀번호에 md5 적용
$pass_new = md5( $pass_new )
// 데이터베이스 변경
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser()
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die(이하생략);
// 사용자에게 변경 완료 알려주기
$html .= "<pre>Password Changed.</pre>";
}
else {
// 비밀번호가 일치하지 않을 경우 에러 메시지 보여주기
$html .= "<pre>Passwords did not match.</pre>";
}
}
?>
입력된 비밀번호 일치 여부를 확인하고 일치한다면 현재 사용자의 비밀번호를 변경한다
// 위치 : /var/www/html/dvwa/vulnerabilities/csrf -> test_credentials.php
// 중요내용 제외 삭제하였음
<?php
// db 연결
dvwaDatabaseConnect();
$login_state = "";
if( isset( $_POST[ 'Login' ] ) ) {
$user = $_POST[ 'username' ]; // 아이디 비밀번호 가져오기
$pass = $_POST[ 'password' ];
$pass = md5( $pass ); // 비밀번호 md5 적용
// 유저 정보 조회하기
$query = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';";
$result = @mysqli_query($GLOBALS["___mysqli_ston"], $query) or die('이곳의 내용은 생략');
if( $result && mysqli_num_rows( $result ) == 1 ) {
// 로그인 성공
$login_state = "<h3 class=\"loginSuccess\">Valid password for '{$user}'</h3>";
}else{
// 로그인 실패
$login_state = "<h3 class=\"loginFail\">Wrong password for '{$user}'</h3>";
}
}
?>
아이디와 비밀번호로 유저 정보를 조회하고 유저 정보가 있다면 로그인 성공/실패 메시지를 띄운다
CSRF
DVWA - CSRF ( Low ) 는 비밀번호를 변경하는 과정에서 비밀번호만 일치한다면 현재 사용자의 비밀번호를 바꾸는 취약점이 있다
CSRF 실습
CSRF 적용하기
새로운 비밀번호를 asdf로, 비밀번호 확인란도 asdf로 한 뒤 전송했다
유저 정보가 존재하는지 확인하기 위해 로그인을 해 보니 성공했다
대응방안
비밀번호를 변경하는데 별다른 검증 없이 입력된 비밀번호만 일치한다면 해당 유저의 비밀번호를 변경하는데 취약점이 있다
1. 비밀변호 변경을 정상적으로 이루어지게 하기 위해서 비밀번호 변경 요청은 비밀번호 변경페이지에서 온 요청만 처리하도록 해야 한다
2. 현재 사용자의 비밀번호까지 입력하도록 한다면 실제 사용자가 아닌 이상 비밀번호를 변경하는데 어려움이 있다
문제풀이
https://ruang0124.tistory.com/212