Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Webmaster-Security Fragen zur richtigen Serverkonfiguration oder Absicherung dynamischer Scripte gehören hier hinein.

PHP Website effektiv gegen Angriffe schützen

Diskussion: PHP Website effektiv gegen Angriffe schützen im Forum Webmaster-Security, in der Kategorie Security Area; Anzeige Hallo, ich programmiere zur Zeit ein Userportal. In dem Portal können sich User anmelden, Texte posten, Links einfügen, Bilder/Avatare ...

Antwort
Alt 30.10.07, 15:29   #1 (permalink)
 
Registriert seit: 03.02.06
Rothkegel Leistung: Facit NTK
Rothkegel eine Nachricht über ICQ schicken
Likes: 0
Standard PHP Website effektiv gegen Angriffe schützen

Anzeige

Hallo,
ich programmiere zur Zeit ein Userportal.
In dem Portal können sich User anmelden, Texte posten, Links einfügen, Bilder/Avatare online stellen.

Zur Zeit nutze ich dieses Script um mich zu schützen

PHP-Code:
function Sichern($String)
    {
    return 
nl2br(strip_tags(mysql_real_escape_string(trim(stripslashes($String)))));
    }
function 
SQL_Injektion()
    {
    foreach(
$_GET as $get => $value)
        {
        
$_GET[$get] = Sichern($value);
        }
    foreach(
$_POST as $post => $value)
        {
        
$_POST[$post] = Sichern($value);
        }
    }
SQL_Injektion(); 
Ist das erstmal ein (sinnvoller) Standardschutz gegen übliche Injektionen mit Veränderung des URL Pfades bzw. der Eingabe von Benutzernamen o.ä.?

Was gibt es sonst noch zu beachten?


Das Includen der Inhaltsdateien läuft über diese 3 Zeilen:
PHP-Code:
//$do = $_GET['do'].$_POST['do'];
if (file_exists("includes/$do.php"))
include (
"includes/$do.php");
else include (
"include/start.php"); 
Oder ist das Crap weil keine Überprüfung stattfindet, ob das erste Zeichen von $do ein "." oder "/" ist?
Bzw. Alternativ gefragt: Was kann passieren wenn ich diese Includes so nutze? Es können ja nur Dateien vom eingenen Server includet werden und kein fremder Inhalt...

Was gibt es sonst noch für Tips?
Wie sieht das mit Cookieinjektionen aus? Sollte man die o.g. Injektionsfunktion noch auf Cookies ausweiten?

Besten Dank,
jRothkegel
Rothkegel ist offline   Mit Zitat antworten
Alt 30.10.07, 15:40   #2 (permalink)
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard

Bei includes prüfe vorher ob kein ".." im Dateipfad vorkommt.
sonst kann man Dateien von was weiß ich woher einbinden.

Desweiteren kann man nie paranoid genug sein.
Prüfe alles was von außen kommt, bevor du es irgendwo anders verwendest, sonst übersiehst du ganz schnell mal eine Sicherheitslücke.

MFG - Keks
keksinat0r ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 30.10.07, 15:46   #3 (permalink)
 
Registriert seit: 03.05.07
HighTec Leistung: Facit NTK
HighTec eine Nachricht über ICQ schicken
Likes: 0
Standard

Was mich in dem Bereich sowieso interessieren würde:
Zum Beispiel bei Joomla heisst es man sollte den Adminbereich zusätzlich mit einer htaccess schützen, weil der login nicht sicher sein. Wie sollte man denn schon anders in den admin bereich kommen ohne das man die url verändert denn ich denke mal dass man darüber nicht den login knacken kann?
HighTec ist offline   Mit Zitat antworten
Alt 30.10.07, 15:51   #4 (permalink)
Senior Member
 
Benutzerbild von Chakky
 
Registriert seit: 28.10.03
Chakky Leistung: 8086
Chakky eine Nachricht über ICQ schicken
Likes: 110
Standard

Zitat:
Original von HighTec
Was mich in dem Bereich sowieso interessieren würde:
Zum Beispiel bei Joomla heisst es man sollte den Adminbereich zusätzlich mit einer htaccess schützen, weil der login nicht sicher sein. Wie sollte man denn schon anders in den admin bereich kommen ohne das man die url verändert denn ich denke mal dass man darüber nicht den login knacken kann.
hä? htaccess != pfad ändern

wenn du den pfad zu deiner admin änders kann evtl fehler im script auftreten oder spätestens wenn man durch dummen zufall die log files sieht die admin wider rausbekommen (ich denk so an webalizer....)
__________________
cu
Chakky

we are dreaming in digital
we are living in realtime
we are thinking in binary
we are talking in IP
welcome to our world
Chakky ist offline   Mit Zitat antworten
Alt 30.10.07, 16:43   #5 (permalink)
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard

ergänzend zu meinem ersten post würde ich dir eventuell zu einer whitelisting methode bei den includes raten, sprich du "sammelst" erst alle verfügbaren module und vergleichst dann die übergebene variable mit den vorhandenen module.

( gerade kein Plan wie man in PHP Ordner-Inhalte ausließt )

PHP-Code:

  $MODULE 
= array( sammle_alle_dateinamen_im_modulverzeichnis );

  if( isset 
$_GET['do'] ){
    
$do $_GET['do'];
  }elseif( isset 
$_POST['do'] ){
     
$do $_POST['do'];
  }

  
$gefunden 0;
  foreach( 
$MODULE as $modul ){
    if( 
$modul == "$do.php" ){
      
$gefunden 1;
      include( 
"include/$do.php" );
      break;
    }
  }
  if( 
not $gefunden ){
    include( 
"include/start.php" );
  } 
keksinat0r ist offline   Mit Zitat antworten
Alt 30.10.07, 16:48   #6 (permalink)
 
Registriert seit: 03.05.07
HighTec Leistung: Facit NTK
HighTec eine Nachricht über ICQ schicken
Likes: 0
Standard

Zitat:
...ohne das man die url verändert ...
@Chakky
Nicht den Pfad ändern.
Die URL im Browser

Aber ich hatte ja schon ausgeschlossen, dass man darüber den login umgehen kann.
HighTec ist offline   Mit Zitat antworten
Alt 30.10.07, 19:02   #7 (permalink)
 
Registriert seit: 06.08.07
jumpa Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von keksinat0r
ergänzend zu meinem ersten post würde ich dir eventuell zu einer whitelisting methode bei den includes raten, sprich du "sammelst" erst alle verfügbaren module und vergleichst dann die übergebene variable mit den vorhandenen module.

( gerade kein Plan wie man in PHP Ordner-Inhalte ausließt )

PHP-Code:

  $MODULE 
= array( sammle_alle_dateinamen_im_modulverzeichnis );

  if( isset 
$_GET['do'] ){
    
$do $_GET['do'];
  }elseif( isset 
$_POST['do'] ){
     
$do $_POST['do'];
  }

  
$gefunden 0;
  foreach( 
$MODULE as $modul ){
    if( 
$modul == "$do.php" ){
      
$gefunden 1;
      include( 
"include/$do.php" );
      break;
    }
  }
  if( 
not $gefunden ){
    include( 
"include/start.php" );
  } 
Das ist eine gute Idee.

PHP-Code:
<?php
    
function getFiles($dir)
    {
        
$handle opendir($dir);
        if(!
$handle)
               return 
0;
        
$files = array();
        while(
false !== ($file readdir($handle))
        {
             
$files[] = $file;
         }
        return 
$files;
     }
     
$module_dir ".../mudule";
     
$files getFiles($module_dir);
     if(isset(
$_GET["do"]) && in_array($_GET["do"].".php"$files)
    {
         require(
$_GET["do"].".php");
     }
?>
jumpa ist offline   Mit Zitat antworten
Alt 30.10.07, 21:34   #8 (permalink)
 
Registriert seit: 17.01.06
Oi!Alex Leistung: 8086
Likes: 7
Standard

Haben wir sowas nicht schon?

Ich frage mich immer wieder warum das mit den Inkludieren von Seiten so kompliziert gemacht wird.

Ein einfaches 'switchcase' löst das ganze Problem doch ziemlich einfach und übersichtlich.
Oi!Alex ist offline   Mit Zitat antworten
Alt 30.10.07, 21:36   #9 (permalink)
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard

Dann muss aber jedesmal wen man ein modul hinzufügt, ein fall in das switch einegfügt werden.
Dh whiteliste ich die erlaubten Module einfach

MFG - Keks
keksinat0r ist offline   Mit Zitat antworten
Alt 30.10.07, 21:45   #10 (permalink)
 
Registriert seit: 17.01.06
Oi!Alex Leistung: 8086
Likes: 7
Standard

Zitat:
Original von keksinat0r
Dann muss aber jedesmal wen man ein modul hinzufügt, ein fall in das switch einegfügt werden.
Dh whiteliste ich die erlaubten Module einfach

MFG - Keks
Richtig und ist sicherer als irgend ein hin und her gemurkse, und mal ehrlich eine Zeile dazuschreiben ist nicht wirklich das Problem.
Oi!Alex ist offline   Mit Zitat antworten
Alt 30.10.07, 22:39   #11 (permalink)
LX
Moderator
 
Registriert seit: 14.02.06
LX Leistung: Z3
LX eine Nachricht über ICQ schicken LX eine Nachricht über AIM schicken LX eine Nachricht über Yahoo! schicken
Likes: 21
Standard

Zitat:
Original von keksinat0r
ergänzend zu meinem ersten post würde ich dir eventuell zu einer whitelisting methode bei den includes raten, sprich du "sammelst" erst alle verfügbaren module und vergleichst dann die übergebene variable mit den vorhandenen module.
Solange sich die "Module" im gleichen Verzeichnis befinden ist das unnötiger Overhead, da ein einfaches file_exists() das gleiche rausfindet. Sicherzustellen ist nur, dass alles, was irgendwann mal in eine Pfadangabe wandert, von Steuerzeichen und Verzeichniswechseln ('../') befreit wird.

BTW, statt einzeln in $_POST und $_GET zu wursteln könnte man ggf. auch gleich auf $_REQUEST zurückgreifen.
__________________
"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

JS BB LX UP
LX ist offline   Mit Zitat antworten
Alt 31.10.07, 14:01   #12 (permalink)
Themenstarter
 
Registriert seit: 03.02.06
Rothkegel Leistung: Facit NTK
Rothkegel eine Nachricht über ICQ schicken
Likes: 0
Standard

Besten Dank für die Anregungen.
Ich denke mal ich werde endweder eine Whitelist machen oder die Steuerzeichen rausfiltern.

Das mit den einzelnen Switchanweisungen fällt für mich prinzipiell flach, da ich an einer "universellen" Lösung arbeite dich ich für mehrere Websites verwenden kann, ohne viele Änderungen machen zu müssen (Und da eine Website z.T. aus sehr sehr vielen Dateien bestehen kann ist mir das zuviel arbeit - ich bin halt faul )

Schöne Woche noch,
jRothkegel
Rothkegel ist offline   Mit Zitat antworten
Alt 31.10.07, 14:23   #13 (permalink)
 
Registriert seit: 25.07.07
BigDevil Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von keksinat0r
Bei includes prüfe vorher ob kein ".." im Dateipfad vorkommt.
sonst kann man Dateien von was weiß ich woher einbinden.
Was ist an dem ".." den so gefährlich? Wenn ich " include ("../blub.php"); " angebe, holt er sich doch nur die blub.php Datei aus dem Verzeichnis, dass genau um eins höher in der Hierarchie liegt. Das ist doch eine ganz genaue Zielangabe.
BigDevil ist offline   Mit Zitat antworten
Alt 31.10.07, 14:35   #14 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Zitat:
Original von LX
BTW, statt einzeln in $_POST und $_GET zu wursteln könnte man ggf. auch gleich auf $_REQUEST zurückgreifen.
Das kann aber evtl. auch wieder eine Sicherheitslücke öffnen, da dann sämtliche Aktionen auch per GET möglich sind. Wenn das "Opfer" also auf der Seite eingeloggt ist, kann der "Angreifer" ihn ein Bild oder einen Link laden lassen, um so beispielsweise Admin-Aktionen, Profil/Passwort-Änderungen oder ähnliche unangenehme Dinge unter einer fremden Benutzerkennung durchführen zu lassen.

Ein einfaches <img src="http://anysite.xx/post.php?content=xxx"> würde dann beispielsweise reichen, um einen GB-Eintrag erstellen zu lassen, ohne dass der User das verhindern kann oder merkt.

Zitat:
Original von BigDevil
Was ist an dem ".." den so gefährlich? Wenn ich " include ("../blub.php"); " angebe, holt er sich doch nur die blub.php Datei aus dem Verzeichnis, dass genau um eins höher in der Hierarchie liegt. Das ist doch eine ganz genaue Zielangabe.
Was sagst du denn zu sowas: include("../admin/passwords.db");?
Es wird ganz einfach dadurch möglich, auf sämtliche Dateien lesend zuzugreifen, auf die der Webserver Zugriff hat. Wenn er schlecht (SEHR schlecht) konfiguriert ist, läuft er unter root-Kennung. Das kommt häufiger vor als man denkt.
Eydeet ist offline   Mit Zitat antworten
Alt 31.10.07, 14:52   #15 (permalink)
 
Registriert seit: 06.01.07
keksinat0r Leistung: Facit NTK
Likes: 0
Standard

Zitat:
Original von LX
Solange sich die "Module" im gleichen Verzeichnis befinden ist das unnötiger Overhead, da ein einfaches file_exists() das gleiche rausfindet. Sicherzustellen ist nur, dass alles, was irgendwann mal in eine Pfadangabe wandert, von Steuerzeichen und Verzeichniswechseln ('../') befreit wird.
Mit einer Whitelist kann man aber viel mehr machen, man kann sie während der Erstellung zB durch eine Regex jagen, sprich man kann sie leicht filtern.
Man erstellt einmal eine Whitelist und kann im Laufe des Scripts immer wieder darauf zugreifen, dh es gibt nur einmal eine Abfrage welche Dateien in den Modul-Verzeichnissen existieren.
Zudem kann man eine Whitelist zB auch in einem geschützten Verzeichnis (read-only) ablegen und die erlaubten Module darin fest vorgeben.
Das ist einfacher als immer im Script rumzuwurschteln.
Zudem ist es so zB einfacher ein Installer-Script für Module zu schreiben, da die einfach ihre Module an eine Whitelist anghängen, etc...
Fazit: Whitelisting hat den gleichen Effekt, ist aber vielfäliger und oft einfacher einsetzbar

Zitat:
Original von LXBTW, statt einzeln in $_POST und $_GET zu wursteln könnte man ggf. auch gleich auf $_REQUEST zurückgreifen.
Stimmt.
Wie gesagt, habe schon lange nixmehr in PHP geschrieben ...

MFG - Keks
keksinat0r ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Security Area » Webmaster-Security » PHP Website effektiv gegen Angriffe schützen
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Präsentation gegen Beenden schützen Sven Applikationen 3 28.05.09 11:10
C++ Projekt gegen SQL-Injection schützen Machine Code Kitchen 3 26.06.07 13:21
Webcambild auf der Website mit Passwort schützen und weitere Funktionen dfi Network · LAN, WAN, Firewalls 8 27.08.05 17:19
Private Website schützen! Shame (In)security allgemein 13 08.08.05 09:14
CIA: China plant Hacker-Angriffe gegen die USA STeFaN News & Ankündigungen 12 29.04.02 09:45


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61