Schrift
[thread]656[/thread]

Sicherheit: PERL-HASH -> Codereferenz



<< >> 7 Einträge, 1 Seite
sosum
 2006-01-22 17:21
#6725 #6725
User since
2006-01-10
11 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

Ich lese das Forum hier zwar erst seit ein paar Wochen, aber habe den Eindruck, dass sich hier einige Leute mit Know-How tummeln, daher oute ich mich jetzt mal, bevor es evtl. jemand anderes mit mir tut. Es handelt sich um eine Sicherheitsfrage, die ich seit geraumer Zeit verdränge.

Also: mein CM System arbeitet über 4 zenralen, ausführbaren .pl Dateien.

Diese sind semantisch kodiert:
1. zugang beschränkt -> nur anzeigen
2. zugang beschränkt -> ausführen & anzeigen
3. public -> nur anzeigen
4. public -> ausführen und anzeigen

Erläuterungen:
a) "anzeigen" und "ausführen" sind als eindeutige Kommandocodes an das Skript zu verstehen. Es wird geprüft, ob für den Kommandocode x eine Hashreferenz auf eine Funktion f(x) definiert ist. Wenn ja, wird der Code ausgeführt. Der Code führt anschliessned noch evtl. Benutzerspezifische Berechtigungsfunktionen aus.
Code: (dl )
if (ref $act{$input->{cmd}} eq 'CODE') { &{$act{$input->{cmd}}} }


b) 1 und 2 (1,2) sind also Skripte mit vorgestellter Identitätsprüfung.
3 und 4 sind Skripte ohne Identitätsprüfung.

c) die Variablenmengen für (1,2) und (3,4) sind getrennt.
Code: (dl )
1
2
%act = (); # Aktionen mit beschr. Zugang
%pubact = (); # Aktionen für d. öffentlichen Raum.


Kennt ihr eine Möglichkeit um den HTTP-GET Parameter cmd so zu manipulieren, so dass nicht der referenzierte Code ausgeführt wird, sondern ein beliebiger? Mann soll ja Benutzereingaben nie blanko übernehmen.

Danke schon mal :)
esskar
 2006-01-22 17:26
#6726 #6726
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
wie prüfst du denn, ob dein user aktionen aus %act ausführen darf?
sosum
 2006-01-22 17:30
#6727 #6727
User since
2006-01-10
11 Artikel
BenutzerIn
[default_avatar]
Hierzu frage ich in der von act-Referenzierten Funktion die Datenbank, ob eine bestimmte Eigenschaft gesetzt ist:
Code: (dl )
1
2
3
4
sub Text_loeschen () {
&notAuthorized() if (!db->getUserPriv ("te_loeschen"));
#... Befehle für die gewählte Aktion ausführen
}

notAuthorized() führ nach einer Meldung
Code: (dl )
exit (-1)
aus\n\n

<!--EDIT|sosum|1137943907-->
esskar
 2006-01-22 18:03
#6728 #6728
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ja-
ich überleg nur; das einzige was dir per GET passieren kann, ist, dass jemand vorgibt, jemand anders zu sein.
pq
 2006-01-22 18:05
#6729 #6729
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=sosum,22.01.2006, 16:21]Kennt ihr eine Möglichkeit um den HTTP-GET Parameter cmd so zu manipulieren, so dass nicht der referenzierte Code ausgeführt wird, sondern ein beliebiger? Mann soll ja Benutzereingaben nie blanko übernehmen.[/quote]
dadurch, dass du die benutzereingabe nur als hash-key benutzt, kann
als value nur etwas verwendet werden, was du bestimmst (prinzip des dispatch-tables).
du hast allerdings vergessen, den inhalt von %act zu posten.
wenn da also geheimer_string => \&loesche_festplatte
drinsteht, hast du verloren.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
sosum
 2006-01-22 20:03
#6730 #6730
User since
2006-01-10
11 Artikel
BenutzerIn
[default_avatar]
Ja, also die möglichen Befehle für den öffentlichen Bereich sind ja eh harmlos. Meist nur abfragen.

Der Ablauf für den beschränkten Zugang sieht aktuell so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
1. frage Sessionkey aus Cookie ab, und schau nach, ob ein solcher Benutzer angemeldet ist.
1a. wenn nein, beende das Skript.
1b. wenn ein solcher Benutzer angemeldet ist, frage die GET-Variable cmd ab, und rufe ggf die Funktion f(act{cmd}) auf.

2. Ist f(act{cmd}) eine für alle Benutzer verfügbare Funktion, so führe sie aus.

3. Gibt es Restriktionen für das Ausführen dieser Funktion, so frage nach, ob der Benutzer diese Erlaubnis hat (SessionKey (cookie)->userid (db)/ userid->Rechte(db):
&notAuthorized() if (!db->getUserPriv ("loesche_festplatte"));
3a. wenn nein, beende das Kommando.
3b. wenn ja, führe das Kommando aus.

4. zeige das (Ergebnis-)Formular an


Der kontrollierte Funktionsbereich innerhalb des act-hashes macht mir aufgrund der zusätzlichen kontextsensitiven Rechteabfrage eher weniger Sorgen.

Ich habe mit halt gefragt, ob der (öffentliche) "Benutzer" mithilfe von (mir unbekannten) Steuerzeichen aus
Code: (dl )
$act{$input->{cmd}}

soetwas wie
Code: (dl )
$input->{act} = 'gueltiges_harmloses_cmd}{;system('bösesZeug');}'

machen kann. Klingt zugegeben ein wenig weit hergeholt. Funktioniert bei mir auch nicht. Aber boshafte Menschen denken halt auch anders. Die Frage an sich lautet also was Perl aus dem Befehl intern baut. Wie also $input->{act} evaluiert wird.

Gelingt es $input->{act} so zu beschreiben, dass der PERL Interpreter diesen beim Auswerten ausführt, habe ich verloren. Wahrscheinlich würde dann zwar ein Syntaxfehler kommen, aber wohl erst, nachdem der Befehl ausgeführt worden ist.


Oder denke ich nun zu kompliziert?
(ich kann auch weiterhin den Kopf in den Sand stecken :) )\n\n

<!--EDIT|sosum|1137953089-->
esskar
 2006-01-22 22:23
#6731 #6731
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
nein, so wie du es machst, kann er das nicht!
diese würde nur bei sowas passieren

Code: (dl )
eval $input->{cmd};
<< >> 7 Einträge, 1 Seite



View all threads created 2006-01-22 17:21.