Heim > Artikel > Backend-Entwicklung > PHP-Hintertür bestehend aus der Datei .user.ini
0x00-Hintergrund
Ich schätze, viele Studenten haben das mit Verachtung betrachtet und dachten, es sei ein Stück Scheiße:
Eine PHP-Hintertür, bestehend aus einer .htaccess-Datei
Dann lass es mich machen eine neue: .user.ini. Es wird häufiger verwendet als .htaccess. Unabhängig davon, ob es sich um Nginx/Apache/IIS handelt, kann diese Methode verwendet werden, solange PHP mit Fastcgi ausgeführt wird. Alle meine Nginx-Server verwenden fpm/fastcgi, alle meine IIS php5.3 und höher verwenden fastcgi/cgi und mein Apache unter Win verwendet auch fcgi. Im Gegensatz zu .htaccess, das Einschränkungen aufweist, kann man sagen, dass es sehr breit ist.
0x01 .user.ini
Was ist also .user.ini?
Dies muss mit php.ini beginnen. php.ini ist die Standardkonfigurationsdatei von PHP, die viele PHP-Konfigurationen enthält. Diese Konfigurationen sind in verschiedene Typen unterteilt: PHP_INI_SYSTEM, PHP_INI_PERDIR, PHP_INI_ALL, PHP_INI_USER. Sie können es hier ansehen: http://php.net/manual/zh/ini.list.php Was sind die Unterschiede zwischen diesen Modi? Schauen Sie sich die offizielle Erklärung an:
Bildbeschreibung hier eingeben
Es wird erwähnt, dass das Konfigurationselement mit dem Modus PHP_INI_USER in der Funktion ini_set() oder in der Registrierung festgelegt werden kann , und legen Sie es dann in .user.ini fest. .user.ini wird hier erwähnt. Um welche Konfigurationsdatei handelt es sich also? Dann erklärt das offizielle Dokument hier:
Zusätzlich zur Haupt-php.ini scannt PHP auch INI-Dateien in jedem Verzeichnis, angefangen bei dem Verzeichnis, in dem sich die ausgeführte PHP-Datei befindet, bis hin zum Web-Root Verzeichnis (angegeben durch $_SERVER['DOCUMENT_ROOT']). Wenn sich die ausgeführte PHP-Datei außerhalb des Web-Root-Verzeichnisses befindet, wird nur dieses Verzeichnis gescannt.
Nur INI-Einstellungen mit den Modi PHP_INI_PERDIR und PHP_INI_USER werden in INI-Dateien im .user.ini-Stil erkannt.
Es ist sehr klar, dass es sich bei .user.ini tatsächlich um eine php.ini handelt, die vom Benutzer „angepasst“ werden kann. (PHP_INI_PERDIR, das in der obigen Tabelle nicht erwähnt wird, kann auch in .user.ini festgelegt werden)
Tatsächlich können andere Modi als PHP_INI_SYSTEM (einschließlich PHP_INI_ALL) über .user.ini festgelegt werden.
Und im Gegensatz zu php.ini ist .user.ini eine INI-Datei, die dynamisch geladen werden kann. Das heißt, nachdem ich .user.ini geändert habe, muss ich die Server-Middleware nicht neu starten, sondern nur die von user_ini.cache_ttl festgelegte Zeit abwarten (Standard ist 300 Sekunden), bevor sie neu geladen werden kann.
Dann sahen wir die Konfigurationselemente in php.ini. Leider stellte ich zu meiner Bestürzung fest, dass sich alle leicht sensiblen Konfigurationselemente im PHP_INI_SYSTEM-Modus befanden (sogar nur php.ini), einschließlich „disable_functions“ und „extension_dir“, „enable_dl“. , usw. Mithilfe der Datei .user.ini können wir jedoch problemlos eine „Hintertür“ erstellen.
Es gibt zwei interessante Elemente in den PHP-Konfigurationselementen (das erste und das vierte im Bild unten):
geben Sie hier die Bildbeschreibung ein
auto_append_file, auto_prepend_file, klicken Sie zum Anzeigen Sehen Sie, was es bedeutet:
Geben Sie hier eine Bildbeschreibung ein
Geben Sie eine Datei an und fügen Sie sie automatisch vor der auszuführenden Datei ein, ähnlich dem Aufruf der Funktion require() vor der Datei. Auto_append_file ist ähnlich, wird jedoch nach der Datei eingefügt. Die Verwendung ist sehr einfach, schreiben Sie es einfach direkt in .user.ini:
auto_prepend_file=01.gif
01.gif ist die einzubindende Datei.
So können wir .user.ini verwenden, um ganz einfach dafür zu sorgen, dass alle PHP-Dateien „automatisch“ eine bestimmte Datei enthalten, und diese Datei kann eine normale PHP-Datei oder eine Webshell sein, die einen Satz enthält.
Testen Sie es, ich habe es auf IIS6.0 Fastcgi PHP5.3 bzw. Nginx FPM PHP5.3 getestet. Das Verzeichnis enthält .user.ini, 01.gif mit Webshell und die normale PHP-Datei echo.php:
Bildbeschreibung hier eingeben
Bildbeschreibung hier eingeben
Besuchen Sie echo .php, um die Hintertür zu sehen:
Bildbeschreibung hier eingeben
Gleiches unter Nginx:
Bildbeschreibung hier eingeben
Bildbeschreibung hier eingeben
Wir können also etwas unbeholfen darüber nachdenken: Unter welchen Umständen kann diese Haltung angewendet werden? Wenn beispielsweise eine bestimmte Website das Hochladen von .php-Dateien einschränkt, können Sie eine .user.ini hochladen, dann ein Bildpferd hochladen und diese für getshell einbinden. Voraussetzung ist jedoch, dass sich im Ordner mit .user.ini eine normale PHP-Datei befinden muss, andernfalls kann sie nicht eingebunden werden. Wenn Sie beispielsweise nur eine Hintertür verbergen möchten, ist diese Methode am bequemsten.