DVWA | SQL Injection | medium

728x90

SQL Injection

  • 입력값을 통해 SQL 쿼리를 조작하여 데이터베이스 정보를 탈취하거나 수정하는 공격

 

DVWA SQL Injection 페이지는 위 사진과 같이 User ID(1~5)를 제출하는 기능이 구현되어 있었다.

 

Burp Suite를 통해 패킷을 캡처해보니, POST 요청으로 id값과 Submit 값이 서버로 보내지는 걸 알 수 있었다.

 

<?php

if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    $id = $_POST[ 'id' ];

    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);

    switch ($_DVWA['SQLI_DB']) {
        case MYSQL:
            $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
            $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );

            // Get results
            while( $row = mysqli_fetch_assoc( $result ) ) {
                // Display values
                $first = $row["first_name"];
                $last  = $row["last_name"];

                // Feedback for end user
                $html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
            }
            break;
        case SQLITE:
            global $sqlite_db_connection;

            $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
            #print $query;
            try {
                $results = $sqlite_db_connection->query($query);
            } catch (Exception $e) {
                echo 'Caught exception: ' . $e->getMessage();
                exit();
            }

            if ($results) {
                while ($row = $results->fetchArray()) {
                    // Get values
                    $first = $row["first_name"];
                    $last  = $row["last_name"];

                    // Feedback for end user
                    $html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
                }
            } else {
                echo "Error in fetch ".$sqlite_db->lastErrorMsg();
            }
            break;
    }
}

// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
$query  = "SELECT COUNT(*) FROM users;";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
$number_of_rows = mysqli_fetch_row( $result )[0];

mysqli_close($GLOBALS["___mysqli_ston"]);
?>

DVWA 깃허브 코드를 보니 사용자가 Submit 버튼을 누르면 POST 요청으로 id를 받아 id 변수에 저장하고 있다.
mysqli_real_escape_string()을 사용하여 사용자가 입력한 id에 특수문자를 이스케이프 처리하여 SQL Injection을 방지하고 있는 것으로 보인다.
데이터베이스 종류에 따라 다르게 처리하며, SELECT 문을 사용하여 user_id에 대한 first_namelast_name 값을 조회하고 있다.

id 값에 있는 특수문자를 이스케이프 처리하고 있지만, id 값을 SQL 쿼리에 직접 사용하고 있기 때문에 완벽한 방어가 되진 않아보인다.

union 을 사용하여 select문을 하나 더 실행시켜보도록 하겠다.
union은 컬럼 수가 같아야하기 때문userpassword를 출력하도록 하였다.

 

union select user, password from users를 같이 입력해주었고,

users 테이블의 정보가 출력된 것을 볼 수 있었다.

728x90

'DVWA' 카테고리의 다른 글

DVWA | Weak Session IDs | medium  (0) 2024.11.26
DVWA | Blind SQL Injection | medium  (0) 2024.11.21
DVWA | Insecure CAPTCHA | medium  (1) 2024.11.20
DVWA | File Upload | medium  (0) 2024.11.20
DVWA | File Inclusion | medium  (0) 2024.11.20