Server Sicherheit testen

03/08/2016 20:25 IzeBreakzz#1
Abend zusammen,

ich suche eine Möglichkeit meine fixes beim Server zu testen.

Wie kann ich z.B. Sachen wie die mysql schwachstelle (injection) oder backdoor, coredowner usw. testen?

Da ich kein "Hacker" bin (und nie sein möchte), habe ich keinen Plan wie ich das Zeugs benutze. Vor dem Serverstart aber, wäre es gut wenn man die Probleme getestet hätte.

Danke schon mal im voraus.

Greetings

IzeBreakzz
03/08/2016 21:00 IceFear#2
Google nach "SQL Injection", da solltest du fündig werden. Wo du das genau anwenden musst, solltest du wissen, je nachdem welche Funktionen du gefixxt hast, musst du die Aufrufe testen.
03/08/2016 23:43 IzeBreakzz#3
Danke schon mal für die Antwort :) Habe jetzt mal länger gesucht, mit mehreren Begriffen, finde aber leider nichts.

Ich habe gelesen dass es was mit dem Login im Client zu tun hat und man dass auch verhindern kann wenn man eine maximale Länge des usernames vorgibt, o.Ä.

Stimmt das?

Würde übrigens auch gerne jemandem eine kleine Entlohnung geben wenn er mit mir mal den Server checken könnte.

Greetings

IzeBreakzz
03/09/2016 00:37 [SA]xAmnezia#4
Kann dir ne 100%ige Game Datei ohne backdoors alles gefixxt etc anbieten einfach in deine files rein ziehen ^_^
03/09/2016 09:24 rollback#5
Hier mal ein Beispiel einer SQL-Injection aus meiner Präsentation:
[Only registered and activated users can see links. Click Here To Register...]

und hier einmal wenn die Eingaben escaped wurden:
[Only registered and activated users can see links. Click Here To Register...]

Ich würde dir bei der Homepage allerdings empfehlen mit Prepared Statements zu arbeiten, anstatt die Eingaben zu escapen.


Je nachdem wie die Rechte des Users eingestellt sind, mit dem die Query ausgeführt wird, können durch SQL-Injections kleinere bis sehr große Schäden entstehen. Wenn der User volle Rechte hat kann man sich per SQL-Injection einen eigenen User mit vollen Rechten erstellen und dann dementsprechend alles mit der Datenbank machen.
03/09/2016 10:21 IzeBreakzz#6
Quote:
Originally Posted by [SA]xAmnezia View Post
Kann dir ne 100%ige Game Datei ohne backdoors alles gefixxt etc anbieten einfach in deine files rein ziehen ^_^
Was für eine game revision wäre das? Auch ne 34k? Wenn ja, wäre echt stark wenn du mir die hochladen könntest :)

An Sensi:

Also hat die Injection auch was mit der Homepage zu tun... Wie kann ich dagegen am besten vorgehen?
03/09/2016 10:41 rollback#7
Quote:
Originally Posted by IzeBreakzz View Post
Also hat die Injection auch was mit der Homepage zu tun... Wie kann ich dagegen am besten vorgehen?
Überall, wo eine Query mit Variablen ausgeführt wird, die vom User veränderbar sind bzw. der User Einfluss auf die Query hat. Also z.B. bei der Erstellung einer Gilde, erstellen eines Charakters, ...

Wie bereits gesagt: Alle Eingaben Escapen, Prepared Statements.
Ausserdem die Rechte des DB-Users ordentlich einstellen und wenn möglich Stored Procedures etc. nutzen.


EDIT:
Aus einer PN mit @[Only registered and activated users can see links. Click Here To Register...], vielleicht auch für andere Interessant:

Quote:
Originally Posted by Seחsi
Nur die Rechte vergeben, die der User auch benötigt.
Ein Homepage-User braucht normalerweise folgende Rechte:
  • Select, Update, Insert auf Account-Tabelle (Registration, Benutzerverwaltung, Itemshop-Coins)
  • Select auf Player-Tabelle (Rangliste)
  • Select auf Itemshop-Tabelle

und eigentlich braucht der User auch garkeine direkten Berechtigungen auf die Tabellen. Du kannst z.B. für die Erstellung eines Accounts eine Prozedur schreiben und dem User dann nur Rechte für den Zugriff auf diese Prozedur geben anstatt auf einen Insert in die Account-Tabelle.

Beispiel einer solchen Prozedur:
Code:
USE account;

delimiter //
CREATE FUNCTION createAccount(v_Login VARCHAR(16), v_Password VARCHAR(16), v_Email VARCHAR(50), v_Deletecode VARCHAR(7))
RETURNS BOOLEAN
BEGIN
	DECLARE loginAlreadyExists BOOLEAN;
	
	IF v_Login IS NULL
		OR v_Password IS NULL
		OR v_Email IS NULL
		OR v_Deletecode IS NULL
	THEN
		RETURN FALSE;
	END IF;
	
	SET loginAlreadyExists = (SELECT count(*) >= 1 FROM account.account WHERE login = v_Login);
	IF loginAlreadyExists THEN
		RETURN FALSE;
	END IF;
	
	
	INSERT INTO account.account (login, password, email, social_id) VALUES (v_Login, PASSWORD(v_Password), v_Email, v_Deletecode);
	RETURN TRUE;
END;//
delimiter ;
In PHP würde das mit einem Prepared Statement dann so aussehen:
Code:
$conn = /* your db connection (mysqli) */

$stmt = $conn->prepare("SELECT account.createAccount(?, ?, ?, ?);");
$stmt->bind_param("ssss", $_POST["username"], $_POST["password"], $_POST["email"], $_POST["deletecode"]);

$stmt->execute();