Angriffsversuche auf PHP Skripte mit PHPIDS erkennen

28 06 2011

Gerade erst wurden tagelang hundertfach SQL Injections auf meine Seiten ausprobiert. Das ist insofern schlecht, als dass der Angreifer mit der Vielzahl der Versuche vielleicht doch irgendwann irgendwo mal eine Lücke findet. Das soll so nicht passieren, deshalb ist es natürlich ideal solche Angriffe möglichst schnell zu erkennen. Da sich mein Hoster dafür nicht zuständig fühlte – man bedenke, ich habe nur Webspace gebucht und erwarte da auch eine Logfile-Überwachung des Hosters – musste eine andere Lösung her.

Auf meiner Suche stieß ich auf PHPIDS, das Anfragen auf einen Server mittels regulären Ausdrücken auf den Grad der Gefährlichkeit einzustufen versucht. Einen Einstieg findet man bei heise Security.

Also das Paket heruntergeladen und für einen ersten Test die Dateien aus /libs auf meinen Server in das Verzeichnis phpids gelegt. In dem Projekt, in dem ich PHPIDS testen wollte musste der include Pfad entsprechend erweitert werden:

set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__).'/phpids/lib/');

Jetzt wird die Überwachung scharf geschaltet. Dies habe ich in der Konfigurations-Datei meines Projekts eingebunden, da diese Datei grundsätzlich bei jedem Aufruf geladen wird.

// Einbinden der Init.php
require_once 'IDS/Init.php';

try {
	// Welche Requests sollen geprüft werden?
	$request = array(
		'REQUEST' => $_REQUEST,
		'GET' => $_GET,
		'POST' => $_POST,
		'COOKIE' => $_COOKIE
	);

	// Die Konfigurationsdatei von PHPIDS einbinden
	$init = IDS_Init::init(dirname(__FILE__) . '/phpids/lib/IDS/Config/Config.ini.php');

	// Initialisieren
	$init->config['General']['base_path'] = dirname(__FILE__) . '/phpids/lib/IDS/';
	$init->config['General']['use_base_path'] = true;
	$init->config['Caching']['caching'] = 'none';
	$ids = new IDS_Monitor($request, $init);
	$result = $ids->run();

	// Der Zugriff ist potentiell gefährlich
	if (!$result->isEmpty()) {
		require_once 'IDS/Log/Composite.php';
		$compositeLog = new IDS_Log_Composite();

		// Standard ist, in die Logdatei auf dem Server zu schreiben.
		// Dazu muss /lib/IDS/tmp sowie /lib/IDS/tmp/phpids_log.txt für den Webserver schreibbar sein
//		require_once 'IDS/Log/File.php';
//		$compositeLog->addLogger(IDS_Log_File::getInstance($init));

		// Ich persönlich finde es besser, die Zugriffe in der Datenbank zu speichern.
		// So kann ich bei mehreren verdächtigen Aktionen einer IP diese sperren.
        require_once 'IDS/Log/Database.php';

		// Zusätzlich kann man sich auch via E-Mail informieren lassen
		require_once 'IDS/Log/Email.php';

		// Schicke die E-Mail und schreibe in die Datenbank
        $compositeLog->addLogger(IDS_Log_Email::getInstance($init), IDS_Log_Database::getInstance($init));
		$compositeLog->execute($result);
	}

}

// Fehlerbehandlung
catch (Exception $e) {
	printf(
		'Es ist ein Fehler aufgetreten: %s',
		$e->getMessage()
	);
}

Bevor man das so laufen lassen kann, muss man noch die MySQL Tabelle anlegen. Das SQL Statement dazu findet man in der lib/IDS/Log/Database.php. Die Tabelle kann man grundsätzlich nennen wie man will, den Zugriff steuert man in der lib/IDS/Config/Config.ini.php. Ich habe diese phpids_intrusions genannt.

    wrapper         = "mysql:host=localhost;port=3306;dbname=DATENBANK-NAME"
    user            = DATENBANK-BENUTZER
    password        = DATENBANK-PASSWORT
    table           = phpids_intrusions

Das wird dann in die Tabelle geschrieben:

id: "2"
name: "GET.action"
value: "suche\\'\\';!--\\\"="
page: "/index.php?action=suche'';!--%22%3CXSS%3E=&{()}"
tags: "xss, csrf, id, rfe, sqli, lfi"
ip: "xxx.xxx.xxx.xxx"
impact: "43"
origin: "xxx.xxx.xxx.xxx"
created: "2011-06-28 00:10:50"

Für das Mailing sind zudem folgende Zeilen in der Konfigurationsdatei anzupassen:

    recipients[]    = E-MAIL
    subject         = "PHPIDS detected an intrusion attempt!"
    header          = "From:  E-MAIL"

Eine Alarmierungs-Mail sieht dann in etwa so aus:

IP: xxx.xxx.xxx.xxx
Date: 2011-06-28T00:10:49+02:00
Impact: 86
Affected tags: xss csrf id rfe sqli lfi
Affected parameters: REQUEST.action=suche%5C%27%5C%27%3B%21--%5C%22%3CXSS%3E%3D, GET.action=suche%5C%27%5C%27%3B%21--%5C%22%3CXSS%3E%3D,
Request URI: /index.php?action=suche'';!--%22%3CXSS%3E=&{()}
Origin: xxx.xxx.xxx.xxx

Ist die Analyse-Software Piwik in das Projekt eingebunden, kommt es zu fehlerhaften Meldungen, da die Piwik-Cookies als Angriff gewertet werden. Deshalb sollte man diese in der Config.ini.php ausschließen:

    ; define which fields shouldn't be monitored (a[b]=c should be referenced via a.b)
    ; Diese beiden Zeilen sind standardmäßig aktiviert. Sie schließen 
    ; aus, dass Google Analytics als Angreifer gewertet wird. Aber aus 
    ; Datenschutz-Gründen verwenden wir ja eh keine Google-Programme.
    ; exceptions[]    = GET.__utmz
    ; exceptions[]    = GET.__utmc
    ; Diese Zeite wird hinzugefügt und gibt das Suchmuster für das Cookie an
    exceptions[]    = COOKIE./.*_pk_ref.*/i
Advertisements

Aktionen

Information

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s




%d Bloggern gefällt das: