[php]path controleren en blokken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een script, zodat ik na het opgeven van een password en een file, de bron code krijg te zien.

Nu zit ik het het probleem, dat als je in het input veldje c:\winnt\php.ini
opgeeft, deze gewoon te zien krijgt.
Nu dacht ik zo, dan lees ik de url uit met

$_ENV["PATH_TRANSLATED"], dan krijg je bijvoorbeeld (windows server)
c:\\www\\showfile\\show_source.php te zien.

Maar nu weet je natuurlijk nooit hoeveel path's het filetje bevat.
(dus c:\\www\\blaat\\blaat\\blaat\\file.php)

iemand die me kan helpen ?
PHP:
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
62
63
64
65
66
67
68
69
70
71
72
73
<?php
//Ferenz PHP file viewer. 
//version 0.1.0

$PassWord = "eenpassword";      // The password to acces the source code
$ShowFileDenied = true;     // if you are be able to see this file, false to see it.
$win32 = true;              // of het het script op een windows platform draait. 

/*
 * Todo: 
 * zorgen dat je geen file's niveau's lager dan de huidige dir kan lezen (dus ../file.blaat)
 * zorgen dat je geen absolut path mag opgeven c:\windows\php.ini enz.
 * zorgen dat er alleen html, htm,  css, php, js, php3 gelezen kan woorden. 
 *
 * Een lijst maken met huidige bestanden in de dir, na opgeven password.  
 * via aankruisvakje, en verzendknop.
 *
 */


$PostPassWord = $HTTP_POST_VARS['password'];

addslashes($PostPassWord);
addslashes($PassWord);

if ($PostPassWord == $PassWord) {

$MyFile = $HTTP_POST_VARS['file'];
    
    //controleren of er niet een ander path wordt opgevraagt. 
    if ($win32 == true) {
        
    } else {
    //andere besturingsystemen.
    
    }
}  


// Check of the file is show_source.php and check of this is allowed to display
if(($MyFile == "show_source.php") AND ($ShowFileDenied == true)){
    echo "<p>Not be able to access this file</p>";  
    exit();
} else {


if(empty($MyFile)) {
    echo "<p>file is not set or password is incorect!<p>";
    exit();

} else {
    if (file_exists($MyFile)) {
        $file = $MyFile;    
    } else {
        echo "<p>Given file does not exists</p>";
        exit();
    }
}  // end else empty file.
}// end else show_source blok.

echo "<p>This is the source code from $file\n</p><br>";
?>
<ol><li>

<?
ob_start();
show_source("$file" );
$t = ob_get_contents();
ob_end_clean();

echo ereg_replace( "<br />" , "</li><li>" , $t );

?>

Acties:
  • 0 Henk 'm!

  • esf
  • Registratie: Juni 2002
  • Laatst online: 21-02 08:56

esf

Misschien dat je wat kan doen met de PHP functie realpath(), waarna je kan controleren of het bestand dat je wilt bekijken wel binnen het gedeelte van je schijf ligt waar mensen op kunnen kijken.

[ Voor 7% gewijzigd door esf op 20-10-2003 11:43 ]

The hardest thing in the world to understand is the income tax. - Albert Einstein


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Ik weet niet om wat voor files het precies gaat, en ook niet wat je doel precies is. Maar je zou er ook voor kunnen kiezen alle files waarvan je de scource wil zien binnen een bepaalde map te houden. Bijv. binnen "C:\Inetpeb\www\" en dan dus altijd dat VOOR de URL te plakken die geopend moet worden. Dan weet je zeker dat niemand dichter bij de root komt als jou (van te voren ingestelde) path.

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik vind de oplossing van okke wel okke :)
Ga ook nog ff kijken naar realpath() die ken ik niet.
laat horen of het lukt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
gelukt met
PHP:
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
<?php
$RootPath = "c:\\www\\myWeblog\\"; //the path with the show_source file.

if(empty($MyFile)) {
    echo "<p>file is not set or password is incorect!<p>";
    exit();

} else {
    if (file_exists($MyFile)) {
        
        $TryLower = trim(substr("$MyFile", 0, 3));
        
        if($TryLower == "../") {
            echo "Not be allowed to see a lower path";
            exit();
        }       
        $file = "$RootPath" . "$MyFile";    
    } else {
        echo "<p>Given file does not exists</p>";
        exit();
    }
}  // end else empty file.
}// end else show_source blok.

?>

Acties:
  • 0 Henk 'm!

  • esf
  • Registratie: Juni 2002
  • Laatst online: 21-02 08:56

esf

Moet je dan niet eerst het rootpath aan de url naar het bestand toevoegen, voordat je if(file_exists($myfile)) aanroept? Want dan weet je of dat bestand daadwerkelijk bestaat.
Ik heb ook pas geleden iets gedaan dat hier op lijkt en ik heb het ongeveer als volgt gedaan:
1) filename uit $_POST halen (duh :))
2) Kijken of de volgende strings in de directory zitten:
: Om gebruik van bijvoorbeeld C: als filename tegen te gaan
../ , ..\ , < , > , # , ' , [b]\[/b] , / ook om vage combinaties er uit te halen
3) Als een van die combinaties in de naam zit, wordt $filename gelijk aan "." (zonder aanhalingstkens)
4) $rootdir is de hoofddirectory, dus jouw $RootPath.
5) $internaldir = realpath($rootdir . "/" . $currentdir);

De realpath is handig omdat hij namen als C:/www/blaat/../ zo veel mogelijk versimpelt en dingen als ../ eruit haalt. Ook controleert hij of het uiteindelijke bestand bestaat en returnt dan de goede directory (of false als hij niet bestaat). Ik hoop dat je hier wat aan hebt..

Je moet sowieso op meer illegale strings zoeken, want als je bij jou bijvoorbeeld ..\ als directory opgeeft, kom je in een directory hoger dan jouw directory en dat is precies wat je niet wilt..

[ Voor 21% gewijzigd door esf op 20-10-2003 21:15 ]

The hardest thing in the world to understand is the income tax. - Albert Einstein

Pagina: 1