Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Hohes Sicherheitsrisiko im Sessionmanagment PHP 5.2.0 session.save path safe mode und open basedir bypass

Frage Sicherheit

Mitglied: gnarff

gnarff (Level 2) - Jetzt verbinden

09.12.2006, aktualisiert 07.01.2009, 7263 Aufrufe

Autor: Maksymilian Arciemowicz (SecurityReason)
Verfasst am: 02.10.2006
Veroeffentlicht am: 08.12.2006
SecurityAlert Id: 43
Sicherheitsrisiko: Hoch
Betrifft: PHP 5.2.0
Original-Advisory : http://securityreason.com/achievement_securityalert/43,
bugtraq 08.12.2006, 2:59pm
Vendor: http://www.php.net

Beschreibung:

Durch Session Support in PHP besteht die Moeglichkeit Zugriffsdaten auch bei nachfolgenden
Sessions zu schuetzen. Dabei wird einen Benutzer eine persoenliche ID [unique ID],
auch Session-ID gennant, zugewiesen. Die Session-ID wird in einem
Cookie auf dem Rechner des Benutzers abgelegt und in der URL angezeigt.

session.save_path definiert den Parameter der an den save handler uebergeben wird.
Bei Benutzung des standard files handler, ist dies der Pfad wo die Dateien erstellt werden.
Standardmaessig in /tmp.
Vgl. session_save_path().

Als Option gibt es den Parameter N der die Anzahl der Verzeichnisebenen bestimmt,
auf die die session files verteilt werden.

Ein '5;/tmp' z.B. kann dazu fuehren, dass ein session file erstellt wird, an einem Ort wie
/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If .

Um N benutzen zu koennen, muessen zunaechtst alle diese Verzeichnisse
geschaffen werden

Dafuer gibt es ein shell-script in ext/session, mit Namen mod_files.sh.

Zu beachten ist, dass wenn die Option N benutzt wird und groesser als 0
ist, funktioniert die automatische Speicherbereinigung nicht mehr.
Vgl. php.ini fuer weiter Informationen

Ebenfalls ist sicherzustellen, dass bei der Benutzung des Parameters N,
session.save_path in "quotes" einzubetten, weil der Separator
(;) auch fuer die comments in der php.ini benutzt wird.

1. session.save_path safe mode und open basedir bypass

Der session.save_path kann festgelegt werden mit der ini_set(), session_save_path() Funktion.
In session.save_path muss der Pfad zu dem Ort angegeben werden wo die tmp-files gespeichert werden sollen
Der Syntax fuer session.save_path kann so aussehen:

[/PATH]

oder

[N;/PATH]

N - kann eine Zeichenkette sein.

Beispiele:

1. session_save_path("/DIR/WHERE/YOU/HAVE/ACCESS")
2. session_save_path("5;/DIR/WHERE/YOU/HAVE/ACCESS")

und

3. session_save_path("/DIR/WHERE/YOU/DONT/HAVE/ACCESS\0;/DIR/WHERE/YOU/HAVE/ACCESS")


01.
-- -1477-1493--- Code from PHP520 ext/session/session.c [START] 
02.
PHP_FUNCTION(session_save_path) 
03.
04.
	zval **p_name; 
05.
	int ac = ZEND_NUM_ARGS(); 
06.
	char *old; 
07.
 
08.
	if (ac < 0 || ac > 1 || zend_get_parameters_ex(ac, &p_name) == FAILURE) 
09.
		WRONG_PARAM_COUNT; 
10.
	 
11.
	old = estrdup(PS(save_path)); 
12.
 
13.
	if (ac == 1) { 
14.
		convert_to_string_ex(p_name); 
15.
		zend_alter_ini_entry("session.save_path", sizeof("session.save_path"), Z_STRVAL_PP(p_name), Z_STRLEN_PP(p_name), PHP_INI_USER, PHP_INI_STAGE_RUNTIME); 
16.
17.
	 
18.
	RETVAL_STRING(old, 0); 
19.
20.
- -1477-1493--- Code from PHP520 ext/session/session.c [END] 
21.
 
22.
Die Werte werden an hash_memory uebergeben, doch bevor dies passiert ueberpruefen safe_mode and open_basedir Diese. 
23.
Wenn die Session dann gestartet wird, z.B. mit  session_start(),  
24.
wird der Wert von session.save_path von function PS_OPEN_FUNC(files) ueberprueft.. 
25.
 
26.
-- -242-300--- Code from PHP520 ext/session/mod_files.c [START] 
27.
PS_OPEN_FUNC(files) 
28.
29.
	ps_files *data; 
30.
	const char *p, *last; 
31.
	const char *argv[3]; 
32.
	int argc = 0; 
33.
	size_t dirdepth = 0; 
34.
	int filemode = 0600; 
35.
 
36.
	if (*save_path == '\0') { 
37.
		/* if save path is an empty string, determine the temporary dir */ 
38.
		save_path = php_get_temporary_directory(); 
39.
40.
	 
41.
	/* split up input parameter */ 
42.
	last = save_path; 
43.
	p = strchr(save_path, ';'); 
44.
	while (p) { 
45.
		argv[argc++] = last; 
46.
		last = ++p; 
47.
		p = strchr(p, ';'); 
48.
		if (argc > 1) break; 
49.
50.
	argv[argc++] = last; 
51.
 
52.
	if (argc > 1) { 
53.
		errno = 0; 
54.
		dirdepth = (size_t) strtol(argv[0], NULL, 10); 
55.
		if (errno == ERANGE) { 
56.
			php_error(E_WARNING,  
57.
					"The first parameter in session.save_path is invalid"); 
58.
			return FAILURE; 
59.
60.
61.
	 
62.
	if (argc > 2) { 
63.
		errno = 0; 
64.
		filemode = strtol(argv[1], NULL, 8); 
65.
		if (errno == ERANGE || filemode < 0 || filemode > 07777) { 
66.
			php_error(E_WARNING,  
67.
					"The second parameter in session.save_path is invalid"); 
68.
			return FAILURE; 
69.
70.
71.
	save_path = argv[argc - 1]; 
72.
 
73.
	data = emalloc(sizeof(*data)); 
74.
	memset(data, 0, sizeof(*data)); 
75.
	 
76.
	data->fd = -1; 
77.
	data->dirdepth = dirdepth; 
78.
	data->filemode = filemode; 
79.
	data->basedir_len = strlen(save_path); 
80.
	data->basedir = estrndup(save_path, data->basedir_len); 
81.
	 
82.
	PS_SET_MOD_DATA(data); 
83.
	 
84.
	return SUCCESS; 
85.
86.
- -242-300--- Code from PHP520 ext/session/mod_files.c [END]

In session.save_path ist ein NULL byte vor dem ; gesetzt,
strchr() kann; nicht lesen und der Pfad ist dann /DIR/WHERE/YOU/DONT/HAVE/ACCESS.

Dieses Problem entseht, weil safe_mode und open_basedir den Pfad nach dem ; ueberpruefen.
Daher ist es noetig den Pfad nach dem ; korrekt zu bestimmen!

2. Wie man das Problem fixen kann
http://cvs.php.net/viewcvs.cgi/php-src/NEWS

saludos
gnarff
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (12)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...