文件包含与php伪协议小结

文件包含与php伪协议是在CTF中经常遇到的考点

文件包含

文件包含在PHP中主要是由include()函数与require()函数实现。

本地文件包含

LFI(Local File Include)也就是本地文件包含

1
2
3
4
5
<?php
error_reporting(0);
$file = $_GET["file"];
include($file);
?>


可以通过php伪协议得到源码即
php://filter/read=convert.base64-encode/resource=index.php

base64解码后就是源码,可以做到任意文件读取

远程文件包含

RFI(Remote File Include)远程文件包含,要保证php.ini中allow_url_fopen和allow_url_include(默认为Off)要为On
还是如上代码,远程文件包含也就是将本地文件换成远程文件

当然相比于本地文件包含问题更大,在vps上写一个text.txt,内容为一句话木马,然后远程文件包含,后果可想而知

PHP伪协议

php://filter

对本地磁盘文件进行读写,最常用到的也就是在文件包含中通过base64编码,获取文件源码

php://input


将post的数据当做一个文件原始数据的只读流到file参数中,
当目标支持远程文件包含时

可以进行任意代码执行

phar:// zip://

php归档协议

1
2
phar://1.jpg/1.php
zip://1.jpg%231.php


题目

1
2
3
4
5
6
7
8
9
<?php
error_reporting(0);
$file = $_GET["file"];
if(isset($file)&&file_get_contents($file)){
echo file_get_contents($file);
}else{
echo "403 ";
}
?>
1
file_get_contents() 整个文件读入一个字符串中

通过file_get_contents可以进行ssrf,在某台内网机器的80端口发现flag