Damn Vulnerable Web App – DVWA

Damn Vulnerable Web Application: DVWA Damn Vulnerable Web Application: DVWA

Damn Vulnerable Web App (DVWA)

Damn Vulnerable Web App, kurz DVWA, ist eine PHP/MYSQL Web Anwendung, die schwer verwundbar ist. Deshalb ist sie für Angreifer ein attraktives Ziel ist. Die Software bietet für IT-Sicherheitsexperten eine Oberfläche, um die eigenen Fähigkeiten in einem legalen Umgebung zu testen. Zusätzlich soll DVWA Web-Entwickler helfen, sichere Web Anwendungen zu schreiben. Es können unterschiedliche Arten von Webangriffen performt werden, um somit die Seite zu kompromittieren. Unter anderem stellt DVWA Angriffsplatformen für Brute-Force, Command Execution, CSFR, File Injection, SQL Injection und XSS zur Verfügung. Dabei gibt es 3 Sicherheitsstufen. Jede Schwierigkeitsstufe erhöht den Schwierigkeitsgrad. Somit ist vom Anfänger bis hin zum Experten alle Bereiche abgedeckt. Die Applikation kann frei verwendet, modifiziert und verteilt werden.

Installation

Viele Wege führen nach Rom und so ist es auch bei der Installation. DVWA kann unter Windows und Linux installiert und betrieben werden. Am Einfachsten ist es mittels XAMPP den Web- und Datenbankserver bereit zu stellen. Ich habe mich aber für eine direkte Installation auf mein Kali Linux System entschieden. Kali ist eine Distribution extra für Pentester entwickelt und bietet schon eine große Anzahl an Werkzeuge. Die Installation von DVWA findet ihr unter folgenden Link. Link zur Installation.

Warnung

Weder ich noch der Hersteller tragen Verantwortung für die Installation und Verwendung der Software. Dies geschieht unter der festen Verantwortung des Benutzers. Veröffentlicht die Seite nicht auf ein frei zugänglichen Webseite. Es wird empfohlen eine virtuelle Maschine aufzusetzen. Die Maschine sollte die NAT networking mode beherrschen.

 

 

PHP Datenbank Klasse verwenden

Im vorherigen Artikel habe ich gezeigt, wie ich den Zugriff auf einer Datenbank durch meine Klasse bereitstelle. Ich werde darauf jetzt nicht mehr direkt eingehen und euch zeigen, wie die Datenbank Klasse verwendet wird.

Zuerst muss ein neue Objekt der Datenbank angelegt und die erwarteten Werte mitgegeben werden. Damit wären die Weichen für eine Datenbankverbindung schon einmal gestellt.

$db = new DB("Server","DB","User","Password");

Vorweg definiere ich die Query für die spätere Abfrage Funktion.

$query = "select * from Table";

Datenbankabfragen haben meist mehr als nur eine Zeile. Die Werte stammen aus dem Array der Funktion execute_query(). Im Foreach ist dadurch mein Aufruf für die eigentliche SQL Abfrage gegeben. Über das $view Objekt werde ich hier nicht sprechen, da es nicht relevant für die Datenbank Abfrage ist.

foreach($db->execute_query($query) as $info){

    $view->draw_table($info[0],$info[2],$info[3],$info[4]);
    
    }

Zum Schluss wird natürlich nur noch die Session wieder geschlossen.

$db_machines->closeSQL();

 

Hier der komplette Code.

db = new DB("Server","DB","User","Password"); 
$query = "select * from Table"; 

foreach($db->execute_query($query) as $info)
{
  $view->draw_table($info[0],$info[2],$info[3],$info[4]);
 }
 
 $db_machines->closeSQL();

 

Hinweis

Da ich bisher noch nicht auf Sicherheit bedacht war, empfehle ich die Klasse nur für interne Projekte und nicht für externe benutzen. Ich möchte hiermit auch nur Denkanstöße geben, wie eine Klasse aussehen könnte.

PHP Datenbank Klasse

Damit ich mir die Arbeit für den Datenbankzugriff und die jeweilige Auswertung der Daten vereinfachen kann, habe ich die Datenbank Klasse geschrieben.

In der Klasse habe ich 6 private Variablen erzeugt, die die Daten der Datenbank Session speichern.

private $_connection;
private $_connectionInfo = array();
private $_host;
private $_username;
private $_db;
private $_password;

Der Konstruktor erwartet die Übergabe des Server, Zugangsdaten und die Datenbank und speichert diese in die privaten Variablen ab.

public function __construct($host,$db,$username,$password)
    {
    $this->_host					= $host;
    $this->_db						= $db;
    $this->_username			= $username;
    $this->_password			= $password;
    $this->_connectionInfo	=array("Database" => $this->_db, "UID"=>$this->_username,"PWD"=>$this->_password);
        $this->_connection = sqlsrv_connect( $this->_host, $this->_connectionInfo);
    }

Somit sind die Zugangsdaten der Klasse bekannt. Damit wir noch ein Nutzen daraus ziehen können, fehlt natürlich noch die SQL Abfrage. Dafür habe ich die Funktion execute_query angelegt, die überprüft, ob eine Datenbank Session erstellt wurde. Als Übergabeparameter wird eine SQL Abfrage erwartet. Das Ergebnis der SQL Abfrage wird in einem mehrdimensionalen Array abgelegt. Die erste Dimension des Arrays ist für die Zeilen der Abfrage, während die zweite Dimension die jeweiligen Daten beinhaltet. Das komplette Array dient als Rückgabewert.

public function execute_query($query)
  {
    $var 	= array();
    $e	= 0;
      if($this->_connection)
      {
        
        $stmt1 = sqlsrv_query($this->_connection, $query);
        while( $row = sqlsrv_fetch_array($stmt1,  SQLSRV_FETCH_NUMERIC))
        {
          
          for($i=0;$i<sizeof($row);$i++){
            $var[$e][$i] = $row[$i];
          }
          $e++;
        }
        
      }else{
        
        echo "<p style='color:red; font-size:20px;'>Connection could not be established to SQL.<br /></p>";
        die( print_r( sqlsrv_errors(), true));
           
       } 
    
    return $var;
  }

Zwar nicht notwendig, aber übersichtshalber habe ich die Funktion closeSQL angelegt, die nichts weiter macht als die aktuelle DB Session zu schließen.

public function closeSQL(){
  sqlsrv_close($this->_connection);
}

Zum Schluss noch einmal der komplette Code der Datenbank Kasse.

<?php
/********************************Informationen**************************************************

Author: Stefan Többen
Developed: 24.08.2017

**************************************Funktion***************************************************



************************************TODO*********************************************************

alles erledigt

************************************************************************************************/

class DB{
  private $_connection;
  private $_connectionInfo = array();
  private $_host;
  private $_username;
  private $_db;
  private $_password;
  
  

/*****************************************************************************************************/
/*****************************************************************************************************/
public function __construct($host,$db,$username,$password)
    {
    $this->_host					= $host;
    $this->_db						= $db;
    $this->_username			= $username;
    $this->_password			= $password;
    $this->_connectionInfo	=array("Database" => $this->_db, "UID"=>$this->_username,"PWD"=>$this->_password);
        $this->_connection = sqlsrv_connect( $this->_host, $this->_connectionInfo);
    }
  
/*****************************************************************************************************/
/*****************************************************************************************************/	
public function execute_query($query)
  {
    $var 	= array();
    $e	= 0;
      if($this->_connection)
      {
        
        $stmt1 = sqlsrv_query($this->_connection, $query);
        while( $row = sqlsrv_fetch_array($stmt1,  SQLSRV_FETCH_NUMERIC))
        {
          
          for($i=0;$i<sizeof($row);$i++){
            $var[$e][$i] = $row[$i];
          }
          $e++;
        }
        
      }else{
        
        echo "<p style='color:red; font-size:20px;'>Connection could not be established to SQL.<br /></p>";
        die( print_r( sqlsrv_errors(), true));
           
       } 
    
    return $var;
  }
  
/*****************************************************************************************************/
/*****************************************************************************************************/	
public function closeSQL(){
  sqlsrv_close($this->_connection);
}	
  
  
}
?>

Wie die Datenbank Klasse verwendet wird, zeige ich in meinem nächsten Beitrag. PHP Datenbank Klasse verwenden

Rückblende: Sao Paulo

Als ich meine Reise nach Brasilien antrat, war ich aufgrund meines ersten Interkontinentalfluges aufgeregt. Für mich war es das erste Mal, dass ich das Große Wasser überquerte. Als ich in Sao Paulo angekommen bin, wurde ich von einem Taxifahrer abgeholt und erstmal zur Firma gebracht. Dort wurde ich vom Betriebsleiter und Geschäftsführer freundlich empfangen. Ziel der Reise war es, die Netzwerkumgebung und Serverstruktur in unsere Umgebung zu integrieren. Alle Rechner, Drucker und Server mussten in unsere Domäne. Schnell stellte sich heraus, dass die Sprachbarriere ein Problem wird, denn dort wurde nur grob Englisch gesprochen. So wurde oft der Google Translator benutzt, damit ich mich überhaupt mit der Belegschaft ordentlich unterhalten konnte.

Geschäftsessen

In Erinnerung wird mir vor allem das Geschäftsessen bleiben, welches in einem guten brasilianischen Restaurant stattgefunden hat. Die brasilianische Küche hat einiges zu bieten. Interessant war das servieren der Speißen, denn dort gingen die Kellner mit den Fleischsorten von Tisch zu Tisch. Ist man satt, wird die Karte, die auf dem Platz liegt, umgedreht. Damit signalisiere ich, dass ich satt bin und nichts mehr möchte.

Sight Seeing in Sao Paulo

Insgesamt blieb ich 7 Tage in Brasilien. Am am Samstag bekam ich eine Rundreise durch Sao Paulo. Sao Paulo hat ca 22 Millionen Einwohner. Diese Stadt ist monströs. Viel Zeit und viele Sehenswürdigkeiten rundeten das Sight seeing ab. Unter anderem war ein Museum, ein Garten und viele Statuen Ziel der Besichtigung. 

[modula id=”2382″]

Geschäftsreise Budapest (Ungarn)

Vor kurzem war ich auf Geschäftsreise in Budapest/Ungarn. An für sich eine sehr schöne Stadt. Als Hauptstadt von Ungarn wohnen hier ca. 2 Millionen Menschen, wohingegen Ungarn nur 10 Millionen Einwohner hat. Insgesamt war ich 4 Tage vor Ort, wobei ich am letzten Tag noch Zeit hatte und mir es erlaubt war für knappe 2 Stunden eine Stadt Tour zu machen, ehe mein Flug nach Deutschland zurück ging. Da die Zeit begrenzt war, konnte ich mir nicht alle Sehenswürdigkeiten anschauen und hatte auch nur geringfügig Zeit mir jene anzuschauen.

Unter anderem waren die älteste Kettenbrücke, der Heldenplatz, die Matthiaskirche und das Parlamentsgebäude Teil meiner Tour. Gestartet bin ich mit einem Rundgang der Zitadelle. Leider konnte ich nicht das innere sehen, da sie aufgrund eines kleines Konflikts zwischen Stadt und Eigentümer vorübergehend geschlossen war. Die Zitadelle liegt höher als Budapest selber, sodass mir von hier einige schöne Ausblicke gewährt worden sind. An der Zitadelle gelegen ist die Freiheitsstatue von Budapest, die für die Befreiung Ungarns im 2.ten Weltkrieg zur Ehrung der Soldaten errichtet worden war. Gefallen hat mir auch der Burgpalast in mitten der Stadt. Dieses riesige Gebäude hinterlässt eine beeinträchtigen Eindruck. Budapest ist eine sehr schöne Stadt und ich freue mich schon auf den nächsten Besuch. 

 

[modula id=”2372″]