Archiv

Archive for Januar 2011

Securing your PHP file upload scripts

2011/01/14 Kommentare aus

Since there is not much documentation on this topic i want to give you some suggestions about how to handle file uploads in PHP. This tutorial will just describe how to identify file formats and size.

First of all you may want to allow only certain file formats to be uploaded. Allowing the upload of PHP/html/etc. files is a really BAD idea since it can get you owned in just a few seconds. 🙂

So the first step is to create a WHITELIST of file formats allowed to be uploaded. Please note that you still can’t trust the file content, it can still contain anything.

File extensions (like .exe, .com, .txt and so on) can be easily changed, don’t rely on them solely. A good alternate way to identify file formats is by the so called „magic number“ which is just a 2-byte (or longer) identifier at the beginning of a file.

What wikipedia says about magic numbers:
http://en.wikipedia.org/wiki/File_format#Magic_number

a short overview of different magic numbers in files:
http://en.wikipedia.org/wiki/Magic_n…mbers_in_files

Now some sample code..
Here the magic number will be checked to allow only files in the libpcap format.

as http://wiki.wireshark.org/Development/LibpcapFileFormat says about the libpcap file header:

Code:
  typedef struct pcap_hdr_s {
        guint32 magic_number;   /* magic number */
        guint16 version_major;  /* major version number */
        guint16 version_minor;  /* minor version number */
        gint32  thiszone;       /* GMT to local correction */
        guint32 sigfigs;        /* accuracy of timestamps */
        guint32 snaplen;        /* max length of captured packets, in octets */
        guint32 network;        /* data link type */
} pcap_hdr_t;

magic_number:
used to detect the file format itself and the byte
ordering. The writing application writes 0xa1b2c3d4 with it’s native
byte ordering format into this field. The reading application will read
either 0xa1b2c3d4 (identical) or 0xd4c3b2a1 (swapped). If the reading
application reads the swapped 0xd4c3b2a1 value, it knows that all the
following fields will have to be swapped too.

..so we just have to check for:

PHP Code:

if ( is_uploaded_file ( $_FILES['file']['tmp_name'] ) )
{
print 'uploaded ' . $_FILES['file']['size'] . ' bytes <br />'; 

$filehandle = fopen($_FILES['file']['tmp_name'],"r");

// get file's magic number
$MNUMBER =  bin2hex(fread($filehandle,4));
// check if libpcap
if ("$MNUMBER" != "a1b2c3d4" && $MNUMBER != "d4c3b2a1") {
print 'bad file format ! <br />';
exit;
}
...

to allow only the upload of files in the libpcap file format.

to check for the size of the uploaded file:

PHP Code:
if ($_FILES['file']['size'] > 8388608)
   print 'file size limit reached ! <br />'; 
Advertisements
Kategorien:Security Schlagwörter: , ,

LVM im Rescue Modus

2011/01/06 Kommentare aus

Um Red Hat Enterprise Linux  in den Rescue Modus zu bringen die Installations-DVD einlegen und im Boot-Prompt „linux rescue“ eingeben. Der Rescue Modus erkennt LVM Volumes standardmäßig nicht (RHEL 5). Um LVM Volumengruppen zu aktivieren müssen folgende Befehle ausgeführt werden:

lvm vgscan         # nach Volumegroups scannen
lvm vgchange -ay   # Volumegroups aktivieren
lvm lvs

lvs zeigt Volume Groups und Namen vorhandener logischer Volumes an, verwenden Sie diese Informationen um eine Prüfung des Dateisystems mit e2fsck auszuführen:

e2fsck /dev/volumegroupname/logicalvolumename

Nach erfolgtem Check und Reparatur des Dateisystems ist es empfehlenswert das System neu zu starten.

Kategorien:Linux allgemein Schlagwörter: , , , ,

Samba Server als Active Directory Domänenmitglied

2011/01/06 Kommentare aus

Es ist mittlerweile sehr einfach einen Linux basierten Samba-Server als Domänenmitglied einer Microsoft Active-Directory Struktur zu betreiben. Damit fallen die Kosten für Client-Zugriffslizenzen auf Windows Server weg. Es bleiben die Vorteile einer zentralen Benutzerverwaltung und Single Sign-On durch Windows Server sowie Stabilität und Kostenersparnis durch die Verwendung eines Linux Systems erhalten.

Wichtig bei der Konfiguration von Samba ist der richtig gesetzte Hostname und die Verwendung des Active Directory Servers als DNS und NTP Server. Distributionseigene Tools erledigen den Domänenbeitritt sehr komfortabel (CentOS/Red Hat: authconfig-tui) und meist problemlos, hier soll nur der „harte“ Weg gezeigt werden: Manuelle Anpassung aller Konfigurationsdateien.

Windows Domäne: example.com

Active Directory Server: win2008.example.com

Netbios Name des AD-Servers: win2008

Hostname setzen:

Der Hostname ist entweder manuell in den Dateien /etc/sysconfig/network und /etc/hosts oder durch die entsprechenden Distributionseigenen Tools zu setzen, Im Falle von Red Hat Enterprise Linux durch system-config-network.

hostname suse.example.com

/etc/resolv.conf editieren:

search example.com
nameserver 192.168.10.1            # Active Directory Server

/etc/samba/smb.conf editieren:

[global]
realm = EXAMPLE.COM
security = ads
# nur verwenden wenn nicht automatisch gefunden
password server = win2008

/etc/krb5.conf editieren:

[libdefaults]
Default_realm = EXAMPLE.COM
[realms]
EXAMPLE.COM = {
               kdc = win2008.example.com
               admin_server = win2008.example.com
              }

Samba und Netbios-Name Daemon aktivieren und starten:

chkconfig nmb on        # Dienste bei Systemstart starten
chkconfig smb on       
service nmb start       # Dienste jetzt starten
service smb start

Netbios Namensauflösung testen:

nmblookup win2008

Domain beitreten

Kerberos verlangt eine gleichgeschaltete Systemzeit zur Authentifizierung. Falls die Abweichung mehr als fünf Minuten beträgt schlägt eine Anmeldung fehl. Hier wird die Systemzeit manuell gesetzt, es ist aber empfehlenswert den Linux Server als NTP-Client des Windows Servers zu konfigurieren. Der Windows Active Directory Server stellt auch automatisch einen NTP-Server zu Verfügung. Die Konfiguration des Linux NTP-Clients erfolgt in /etc/ntp.conf.

ntpdate win2008 ; hwclock --systohc    # Zeit synchronisieren, Toleranz 5 min
net ads join –U Administrator –S win2008     # verlangt Domain-Admin Passwort

Domain-Benutzer Accounts aus AD auslesen und lokal anlegen:

Um Dateirechte richtig setzen zu können sollten Domänenbenutzer auch lokal auf dem Samba-Server existieren. Diese dienen nicht zur Anmeldung, benötigen keine Login-Shell, kein Heimatverzeichnis und kein Passwort.

cd /tmp
net rpc user  –U Administrator –S win2008 > users
for i in `cat users` ; do  useradd –d /tmp/tmpADUSER –s /dev/null  $i ; done
cat /etc/passwd | sed s_/tmp/tmpADUSER_/dev/null_g > passwd.tmp
mv passwd.tmp /etc/passwd

Die Unix-Dateirechte der Samba Freigabe müssen den Zugriff erlauben!

Dateien mit tar, gzip und bzip2 archivieren und komprimieren

2011/01/01 Kommentare aus

Archivieren und Komprimieren mittels tar

tar ist ein Archivierungsprogramm, das im einfachsten Fall mehrere Dateien zu einem Archiv zusammenfasst. gzip und bzip2 sind Komprimierungsprogramme, wobei bzip2 effizienter als gzip ist. Jedes dieser Programme lässt sich natürlich einzeln ausführen,  sobald man aber mehr als eine Datei komprimieren möchte sollte tar mit gzip oder bzip2 kombiniert werden.

tar -cvzf myarchive.tar.gz /etc
tar -cvjf myarchive.tar.bz2 /etc

Mit obigen Befehlen würde jeweils der Inhalt des Verzeichnisses /etc archiviert und komprimiert, einmal mit gzip und einmal mit bzip2. Erklärung der Optionen:

c Erstellen eines Archives.

v verbose, Es werden umfangreichere Rückmeldungen geliefert

z Komprimierung mittels gzip

j Komprimierung mittels bzip2

f Das Archiv wird als Datei myarchive.tar.gz erstellt

Hierbei sollte die Dateiendung beachtet werden. tar ist eines der wenigen Programme die eine bestimmte Dateiendung voraussetzt. Dateien die mittels gzip komprimiert wurden sollten auf .tar.gz oder .tgz enden, bzip2 komprimierte Dateien auf .tar.bz2.

Extrahieren von tar-Archiven

tar -xvzf myarchive.tar.gz
tar -xvjf myarchive.tar.gz

Im ersten Beispiel wird ein gzip (z) komprimiertes tar-Archiv im aktuellen Verzeichnis extrahiert (x). Der zweite Befehl unterscheidet sich nur durch die Verwendung der Option „j“ anstatt „z“ vom ersten, hierbei wird bzip2 zur Dekomprimierung angewandt.

Kategorien:RHCSA Schlagwörter: , , , ,