[PHP] Ich finde Sicherheitslücke nicht

Alles rund um PHP und die Datenbanksprache MySQL.

Moderatoren: Thies, Soltano

Antworten
Benutzeravatar
Thies
Webmaster
Webmaster
Beiträge: 1482
Registriert: Mo 04 Aug, 2003 8:45 pm
Kontaktdaten:

[PHP] Ich finde Sicherheitslücke nicht

Beitrag von Thies »

Hallo, ich brauche mal Hilfe.

Um in einem Umfragetool einigermassen realistische Ergebnisse zu erzielen, wird die IP des Teilnehmers sowie dessen Session-ID, die vom Tool automatisch generiert wird in der Datenbank mit abgespeichert. Das Tool prüft dann, ob in den letzten X Sekunden ( X kann eingestellt werden ) bereits ein Abstimmungsergebnis mit der IP des aktuellen Besuchers oder der SessionID des aktuellen Users vorhanden ist. Wenn ja, wird das aktuelle Ergebnis angezeigt und eine Abstimmung wird nicht zugelassen, wenn nicht, kann der User abstimmen.

Bei mir klappt das auch einwandfrei, nur gibt es einen User, der das irgendwie schafft zu umgehen, da ich heute zwischen 0:25 und 0:30 Uhr 42 Abstimmungsergebnisse des Users in der Datenbank hatte. Alle 42 hatten dieselbe IP und dieselbe Session-ID. Und ich weiss nicht, wie er das System umgeht, weil wie gesagt ich beim Testen selbst mit dauerhaftem Drücken von F5 nicht mehr wie ein Ergebnis in die DB eingetragen bekomme.

Hier der Code-Teil mit der Abfrage, ob der User bereits abgestimmt hat:

Code: Alles auswählen

            	$sql2 ="SELECT count(id) FROM ".$prefix_table."u_replies WHERE un='$un' AND ( ip='".getenv(REMOTE_ADDR)."' OR session='$dclp' ) AND zeit > NOW()-".$cfg[sperrzeit];
	  	if( ($result = $db->sql_query($sql2)) ) 
			{
			$r = $db->sql_fetchrow($result);
	            	if($r[0] > 0) 
        				{ $u_action = "result";  }
			}
Ich selber kann das nicht umgehen und bin daher vollkommen ratlos, wie das überhaupt passieren kann. Hat jemand vielleicht Ideen für mich, wonach ich suchen muss?

Danke im Voraus

Frank-Andre

P.S. Pro registriertem user nur eine Abstimmung geht nicht, da die Umfragen unter allen Besuchern laufen soll!
if ( $ahnung == 'keine' ) { use ( Suche ) }
if ( $antwort == 0 ) { post ( $frage ) }
Benutzeravatar
Thies
Webmaster
Webmaster
Beiträge: 1482
Registriert: Mo 04 Aug, 2003 8:45 pm
Kontaktdaten:

Beitrag von Thies »

Hi,

ich habe durch Zufall heute nacht herausgefunden, was passiert ist. Es geht um die Query:

SELECT count(id) FROM ".$prefix_table."u_replies WHERE un='$un' AND ( ip='".getenv(REMOTE_ADDR)."' OR session='$dclp' ) AND zeit > NOW()-".$cfg[sperrzeit]

und dort insbesondere um den Part

zeit > NOW()-".$cfg[sperrzeit]

Zeit ist ein timestamp-Feld und mit dieser Abfrage wird geprüft, ob innerhalb der Sperrzeit der User mit der IP / Session-ID bereits gevotet hat. Das klappt tagsüber auch einwandfrei. Ich hätte mich ja bereits wundern müssen, dass die Mehrfachvotes eines Users immer in der Zeit zwischen 0:15 und 0:30 Uhr passierten. Und heute nacht bin ich um diese Zeit online und stelle fest, dass auch ich auf einmal sooft voten kann, wie ich möchte. Ich habe nun die Zeitabfrage nicht mehr direkt in der Query ermittelt, sondern folgendermassen geändert:

Code: Alles auswählen

$check_time = time() - $cfg[sperrzeit];
$check_time2 = strftime("%Y%m%d%H%M%S",$check_time);
$sql2 ="SELECT count(id) FROM ".$prefix_table."u_replies WHERE un='$un' AND ( ip='".getenv(REMOTE_ADDR)."' OR session='$dclp') AND zeit > " . $check_time2; 
Und siehe da, der Bug ist behoben!!!!

Bin froh, dass ich heute nacht online war, sonst hätte ich wohl noch ewig gesucht. Wobei ich noch nicht so richtig verstehe, warum der vorherige Code mal ging und nach Mitternach nicht ...... ?(

Frank-Andre
if ( $ahnung == 'keine' ) { use ( Suche ) }
if ( $antwort == 0 ) { post ( $frage ) }
Antworten