kostenloser Webspace werbefrei: lima-city


Sicherheit Script

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    philippkern

    Kostenloser Webspace von philippkern

    philippkern hat kostenlosen Webspace.

    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 philippkern

    Abstimmung (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)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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.
  4. 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
  5. Autor dieses Themas

    philippkern

    Kostenloser Webspace von philippkern

    philippkern hat kostenlosen Webspace.

    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?
  6. 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
  7. Autor dieses Themas

    philippkern

    Kostenloser Webspace von philippkern

    philippkern hat kostenlosen Webspace.

    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.
  8. 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:
    <?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";
    			}
    		}
    ?>
    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.

    Ich habe den "dig $domainname" aus sicherheitsgründen nur schreiben lassen. Das ganze später durch ein
    shell_exec("dig $domainname");
    zu ersetzen solltest du ja hin bekommen, falls hier wider erwarten niemand was dran auszusetzen hat.

    Beitrag zuletzt geändert: 9.12.2011 8:04:58 von bloedesvieh
  9. <?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
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!