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.
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 queryunion, 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).
Ada penambahan backslash (\) sebelum karakter '. Ini dikarenakan fungsi mysqli_real_escape_string() yang melakukan encoding pada spesial karakter (bisa dibaca ).