Veilig files includen?

Status
Niet open voor verdere reacties.

grumbkow

Gebruiker
Lid geworden
20 aug 2007
Berichten
924
Hallo!,

Ik ben de laatste tijd wat onderzoek aan het doen voor mezelf naar een aantal standaard veiligheidsmaatregelen.

nu zat ik te denken, als ik een bestand include en er komt bijvoorbeeld een hacker die dit door heeft, kan hij natuurlijk met wat stukjes code in de URL of wat dan ook mijn include aanpassen zodat er in plaats van mijn include een ander bestand wordt ingeladen.

Nu dacht ik, misschien is het een idee om te kijken of het bestand wel daadwerkelijk bestaat.

PHP:
<?php
	$file = 'includes/bestand.php';
	if(file_exists($file))
	{
		include_once($file);
	}
	else
	{
		die('Er is een fout opgetreden');	
	}
?>

Echter, als de zogeheten hacker het bestandspad aanpast en een externe file include, dan zal $file ook bestaan dus voert hij de include alsnog uit.

Ik hoop dat er een aantal mensen zijn die een verschillende kijk hier op kunnen geven en hun ideeën hierover willen openbaren.


Groeten,
Jeffrey von Grumbkow
 
Het beste kun je een lijst opnemen met veilige files en/of mappen en alleen includes van die files of files in die mappen accepteren. Vervolgens moet je zorgen dat die mappen op "read only" staan zodat niemand er via een andere exploit files in kan zetten. Dan ben je veilig :)
 
Het beste kun je een lijst opnemen met veilige files en/of mappen en alleen includes van die files of files in die mappen accepteren. Vervolgens moet je zorgen dat die mappen op "read only" staan zodat niemand er via een andere exploit files in kan zetten. Dan ben je veilig :)

Klinkt logisch,

Heb je misschien een iets diepere kijk op hoe je die bestanden dan op "geaccepteerd" zet zeg maar?
 
Het makkelijkst is om ze te matchen tegen een lijst die je bijhoudt; bijv zo:

PHP:
$safe = array( 'file1', 'file2' );

if ( isset( $_GET['page'] ) && in_array( $_GET['page'] ) ) {
  include $_GET['page'] . '.php';
}
 
Of je gebruikt auto including, maar dat kan alleen met classes.
 
Het makkelijkst is om ze te matchen tegen een lijst die je bijhoudt; bijv zo:

PHP:
$safe = array( 'file1', 'file2' );

if ( isset( $_GET['page'] ) && in_array( $_GET['page'] ) ) {
  include $_GET['page'] . '.php';
}

Duidelijk. thanks :)
 
Dus als ik het goed begrijp is dit niet veilig?
PHP:
<?php include ("test.php") ?>

Nu is mijn vraag waarom niet?
Want ik heb PHP geleerd uit een boek en daar word niet gezegd dat dit niet veilig zou zijn?
 
Dus als ik het goed begrijp is dit niet veilig?
PHP:
<?php include ("test.php") ?>

Nu is mijn vraag waarom niet?
Want ik heb PHP geleerd uit een boek en daar word niet gezegd dat dit niet veilig zou zijn?

Nou, ik zie er zo niets onveiligs aan, afgezien van de dubbele quotes. Enkele quotes zijn sneller en veiliger :)

Wat je ook kunt doen om je includes te testen is het volgende:
PHP:
<?php

function SafeInclude($file) {

	// Forbidden items
	$forbidden = array(
						'http://',
						'www.',
						':',
						'https://',
						'..',
					);
	
	// Replace forbidden items
	$file = str_replace($forbidden, '', $file);
	$file = trim($file);
	
	if(file_exists($file)) {
	
		include_once($file);
		
	} else {
	
		return FALSE;
	
	}
	
}

SafeInclude('index.php');

?>

Heb het eventjes losjes geschreven en niet getest, maar dit moet bescherming bieden tegen externe files includen, of dingen in bovenliggende mappen.
 
Wat hier besproken wordt is door aan de hand van een waarde die uit de url gehaald een include te doen.
Nu kan iedereen natuurlijk zelf de waarde veranderen.
En als je dan niet een test doet en zeker weet dat de ontvange waarde valide is kan dit je helen site laten crashen of in de soep laten lopen.

als je zo als jij beschrijft de waarde hardcode in je script dan is er nix aan de hand.
 
De files die je include moet je gewoon in een bepaalde map zetten, en deze map hoeft niet meegegeven te worden in de url. Als iemand een url invoert als input, dan zal het de mapnaam, gevolgt door deze url worden, wat dus niet kan! :)
 
De files die je include moet je gewoon in een bepaalde map zetten, en deze map hoeft niet meegegeven te worden in de url. Als iemand een url invoert als input, dan zal het de mapnaam, gevolgt door deze url worden, wat dus niet kan! :)

Ik ben geen hacker weet dus ook niet precies hoe dit in zijn werk gaat, maar bij mijn oude stageplek is er een expert hacker ingehuurd om alle problemen en lekken te zoeken etc.

Als je een bestand op die manier include, kan de hacker dmv bepaalde waardes in de URL en door middel van externe scripts dus zorgen dat er andere bestanden worden ingeladen.

Nogmaals ik weet niet hoe het moet, maar het is mogelijk. Nu zullen hackers geen moeite doen om een portfolio te hacken dmv includes, omdat hier toch geen belangrijke data in staat etc.

Stel je bijvoorbeeld voor dat helpmij.nl niet veilig is en een bestand wordt zo geïnclude. Als de hacker op de voor mij nog onbekende manier een extern script weet te includen door de server te manipuleren zal hij in dat externe script dus een query kunnen uitvoeren die alle tabellen uit de database geeft.

Eenmaal een overzicht van de tabellen kan hij daar automatisch queries op los gooien die alle gegevens uit de database halen welke bijvoorbeeld daarna worden doorgestuurd naar de hacker zijn server. Dan een kwestie van de gegevens bruteforcen en hij heeft een aantal emailadrs/gebruikersnaam/wachtwoord combinaties, welke in nederland op de zwarte markt voor 9 euro per stuk over de drempel gaan.

100 gebruikers op helpmij staat dan gelijk aan 900 euro, en dat alles met automatische scripts.


Geef mij maar het zekere voor het onzekere met 100% veilige includes :)
 
Onzinverhaal van die hacker, dus dat scheelt.

Als je uitsluitend include in een bepaalde map, is er niets dat de hacker kan doen om dat te omzeilen via de URL.
 
Mits je .. en / niet toestaat in je include althans. Anders krijg je dingen als

"includes/../mag_niet_includen/verboden_file.php"
 
Onzinverhaal van die hacker, dus dat scheelt.

Als je uitsluitend include in een bepaalde map, is er niets dat de hacker kan doen om dat te omzeilen via de URL.

Ik vraag niet of je me wilt geloven, maar ik weet wat ik ze heb zien doen met een aantal systemen.
Ik heb hier een antwoord gezocht op mijn vraag, die heb ik gekregen en deze doet zijn werk prima.
 
Laatst bewerkt:
Ga niet lopen verkondigen dat ik hier loop te liegen oke? Thanks kan je nu je mond dicht houden als je niets nuttigs te melden hebt.

Netjes om zo de helpers te woord te staan. Kan mij nu voorstellen dat ze nu wel wel na gaan denken om je eventueel een volgende keer weer te helpen. Hou daar rekening mee met je bewoording :)
 
Ja, dit is inderdaad wel een naam die ga onthouden voor de volgende keer. Lijkt erop dat grumbkow er weinig van begrepen heeft.
 
Je kunt sowieso geen externe bestanden includen.

include(_once) en require(_once) werken alleen lokaal.

Daarnaast geeft SvU aan dat volgens hem het verhaal dat jij schetst onzin is.
Daarmee zegt hij niet dat je liegt, alleen dat het verhaal zeer onwaarschijnlijk is.

Verder stellen we het niet op prijs dat je mensen gaat sommeren niet te reageren.
Ik zou je dan ook vriendelijk willen verzoeken die regel zelf te verwijderen.

Frameworks werken vaak ook met URL = bestand alleen zijn die vaak een stukje beter dichtgetimmerd.

Het scenario dat je schetst lijkt meer met database-beveiliging te maken te hebben dan met URL-principes :)
 
Allereerst excuses voor mijn reactie, bedoelde het zeker niet zo ***lig als het er uit kwam, maar kreeg erg het gevoel dat ik gewoon werd weggeschreven als leugenaar zonder verstand, terwijl ik ook maar mijn best doe mijn kennis verder te ontwikkelen.

Ik zal met plezier de discussie verder volgens, gezien er volgens mij genoeg mensen zijn met verschillende meningen hierover.

@Tha Devil, je kan wel externe bestanden includen, helaas zijn er te veel hosting partijen die dit niet uitgeschakeld hebben.
 
If "URL fopen wrappers" are enabled in PHP (which they are in the default configuration), you can specify the file to be included using a URL (via HTTP or other supported wrapper - see Supported Protocols and Wrappers for a list of protocols) instead of a local pathname. If the target server interprets the target file as PHP code, variables may be passed to the included file using a URL request string as used with HTTP GET. This is not strictly speaking the same thing as including the file and having it inherit the parent file's variable scope; the script is actually being run on the remote server and the result is then being included into the local script.
http://php.net/manual/en/function.include.php
Deels waar, includen kan wel maar je include dan de output nadat deze door de externe server is uitgevoerd :)
Je krijgt dus gewoon een HTML-pagina, net als via fopen().
 
Deels waar, includen kan wel maar je include dan de output nadat deze door de externe server is uitgevoerd :)
Je krijgt dus gewoon een HTML-pagina, net als via fopen().

Voor zover ik weet is het dus niet echt schadelijk.

Voor uploadsites is het wel gevaarlijk, aangezien je d.m.v. speciale hacks php bestanden kunt includen en met de url dat bestand kan includen. Gelukkig zijn de meeste uploadsites beschermd tegen deze hacks.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan