Sicherheit Script
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
angeben
bedarf
befehl
code
domain
ersetzen
fein punkt
haar
host
kenntnis
kolossalen vorsicht
nutz
punkt
sicherheit
statischen fertigen befehlen
suchmaschine
umlaut
vorgefertigte befehle
zufall
-
Hallo,
ich habe gerade folgendes Script geschreiben.
Mich würde nun interessieren ob irgendjemand hier eine Sicherheitslücke finden kann.
<?php if(isset($_GET['dig'])) { echo "<pre>"; $digcommand = $_GET['dig']; if((substr($digcommand, 0, 4) != "dig ") || strpos($digcommand, ";")) die("Didn't get it right, ha?"); echo "\n" . shell_exec($digcommand) . "\n"; echo "</pre>"; } ?>
lg
Philipp
Edit:
Achja, falls jemand unsicher anklickt, dann bitte auch begründen. -.-
Danke.
Beitrag zuletzt geändert: 6.12.2011 0:26:44 von philippkernAbstimmung (Nur eine Auswahl möglich)
Script ist sicher 0 % (0 Stimmen) Script ist unsicher 81,82 % (9 Stimmen) Was ist PHP? 18,18 % (2 Stimmen) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Jede halbwegs dämliche Suchmaschine kann da durch Zufall drauf stoßen. Dann noch gänzlich ungefiltert irgendwelche Exec-Befehle ausführen zu lassen... Du musst deinen Server echt hassen.
-
Da stehen mir ja die Haare zuberge...
1. Nutze nie shell_exec
2. Verifiziere IMMER deinen Input auf Sonderzeichen
Okay ich ignoriere mal Punkt 1.
Du hast zwar ';' exkludiert, aber es gibt noch viele weitere Möglichkeiten mehrer Befehle auszuführen (z.B. command && command oder command | command) und gewisse Linux Freaks werden dir noch 100 andere Möglichkeiten angeben können.
Darum komm ich wieder auf Punkt 1 zurück: Nutze nie shell_exec (oder exec oder ...)!
mfg Klasset -
Vielen Dank für eure Antworten.
@fabo: Es ist ja nich ungefiltert.
Ich hab nur nicht dran gedacht das es ja noch einige mehr Zeichen gibt um Commands zu "verbinden".
@klasset:
Wie würdest du denn eine NS-Abfrage mit dig machen wenn nicht per exec & Co? -
Vorgefertigte Befehle ohne Die Möglichkeit irgendwelche Befehle einzuschleusen.
Wenn exec, dann nicht mit irgendwelchen Userinputs sondern mit statischen, fertigen Befehlen... Und eigentlich selbst dann nicht. :D -
Ich kann ja die Domainabfrage nicht statisch machen. Es sind ja immer andere Domains.
Ich könnte nun eventuell per RegEx alles ausschließen bis auf [a-zA-Z0-9\.].
Nur will ich nicht unbedingt RegEx dazu starten müssen. -
Ich hoffe, ich habe das jetzt richtig verstanden, dass du lediglich mit dig eine domain-abfrage machen wolltest.
Also ich habe da mal ein bisschen was zusammen geschraubt... Bei meinen kolossalen(vorsicht, Ironie) php-Kenntnissen sicher auch nicht besser, aber es läuft ohne RegEx, wenn auch nicht besonders schnell und so...
Prinzipiell gilt: shell_exec ist ganz böse. Aber wenn es nicht anders geht würde ich es in etwa so anfangen:
Unterschied ist: Es wird nur noch die Domain übergeben, diese dann Stellenweise darauf überprüft, ob auch alles fein punkt, a-z, A-Z oder 0-9 ist. Umlaute kann man dann bei bedarf selbst noch unter bringen. Wenn nicht, wird die Variable $error gesetzt, was dann zum Exception-Handling führen kann.<?php if(isset($_GET['dig'])){ $domainname = $_GET['dig']; for($i=0; $i<=strlen($domainname)-1; $i++){ $tmp = ord(substr($domainname, $i, 1)); if(($tmp == 46)||(($tmp>=48)&&($tmp<=57))||(($tmp>=65)&&($tmp <=90))||(($tmp >= 97)&&($tmp <=122))){ }else{ $error = 1; } } if($error){ echo "fehler!"; }else{ echo "dig $domainname"; } } ?>
Ich habe den "dig $domainname" aus sicherheitsgründen nur schreiben lassen. Das ganze später durch ein
zu ersetzen solltest du ja hin bekommen, falls hier wider erwarten niemand was dran auszusetzen hat.shell_exec("dig $domainname");
Beitrag zuletzt geändert: 9.12.2011 8:04:58 von bloedesvieh -
<?php function Dig ($domain) { $dig = `dig $domain`; preg_match_all("/in\s+ns\s+(.+?)\s+/is", $dig, $name_servers, PREG_PATTERN_ORDER); preg_match_all("/$domain.\s+[0-9]+\s+in\s+a\s+([0-9.]+)\s+/is", $dig, $ips, PREG_PATTERN_ORDER); $dns[name_servers] = $name_servers[1]; $dns[ips] = $ips[1]; return($dns); } if(isset($_POST['dig']) && !empty($_POST['dig'])) { $url_parts = parse_url(strip_tags($_GET['dig'])); $dns = Dig($url_parts[host]); print_r($dns[name_servers]); print_r($dns[ips]); }
Aber es gibt mit Sicherheit auch rein PHP basierte Lösungen.
Um dich ein wenig vor Suchmaschinen zu schützen, würde ich auch eher POST an Stelle von GET verwenden und das Ganze zusätzlich mit einem Captcha sichern.
Beitrag zuletzt geändert: 9.12.2011 14:04:55 von fabo -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage