文件包含
开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称为文件包含
文件包含漏洞
开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞
PHP中相关函数
php当中会造成文件包含漏洞的函数有:include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file
- include():传入路径,如果路径不存在,回报警告,但继续执行
- include_once():只包含一次
- require():包含失败,会直接终止,不会再往下执行
- require_once()
1.php
<?php
$a = 'demo.php';
include $a;
echo 'OK'.'</br>';
?>
demo.php
<?php
echo 'IS OK'.'</br>';
?>
当require_once后再次出现require,文件会再次被包含,但当再次出现require_once时则不会再次包含
不一定包含可执行的php文件(后缀名不一定是php),只要文件中一块完成的php代码即可
分类
远程文件包含
两个文件不在同一个服务器中
allow_url_fopen
allow_url_include
若后缀名写死,可以用“?”绕过
伪协议
file:// —访问本地文件系统
http:// — 访问HTTP(s)网址
ftp:// — 访问FTP(s)URLs
php:// —访问各个输入\输出流
zlib:// —压缩流
data:// — 数据
glob:// — 查找匹配的文件路径模式
phar:// ----PHP归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// —音频流
expect:// —处理交互式的流
本地文件包含
两个文件在同一个服务器中
重点在于找到可控文件
具体场景-----伪协议
-
Phar://
条件:allow_url_fopen: off/on allow_url_include: off/on php 版本大于等于php5.3.0 -
Zip://
条件:allow_url_fopen: off/on allow_url_include: off/on
1 、现将要执行 php 代码写好并且命名为 a.txt,将 a.txt 进行 zip 压缩,命名为 a.zip,如果可以上传 zip 文件便直接上传,如若不能可将 a.zip 命名为 a.jpg 上传;
1,只能传入绝对路径。
2,要用#分隔压缩包和压缩包里的内容,并且#要用url编码%23
http://127.0.0.1/LFI.php?file=zip://D:/phpstudy/PHPTutorial/WWW/a.zip%23a.txt
http://127.0.0.1/FI/LFI.php?file=zip://D:/phpstudy/PHPTutorial/WWW/a.jpg%23a.txt
利用php流
- php://filter
是一种元封装器,设计用于数据流打开是的筛选过滤应用,realfile()、file()、file_get_contents()存在这些函数时可以使用
?file=php://filter/read=convert.base64-encode/resource=index.php
-
php://input
条件:allow_url_include=ON
可以读取没有处理过的post数据 -
data://text/plain
?xxx=data://text/plain;base64,想要file_get_contents()函数返回的值的base64编码
?file=data:text/plain,<?php phpinfo()?>
allow_url_fopen: on allow_url_include: on
http://192.168.6.128:8001/vulnerabilities/fi/?page=data://test/plain,<?php phpinfo();?>
http://192.168.6.128:8001/vulnerabilities/fi/?page=data://test/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
- http://
可以用于include外部链接
allow_url_fopen与allow_url_include同时开启。缺一不可
http://localhost/test.php?file=http://www.baidu.com
具体场景-----日志文件
很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求是,会将请求写入access.log,当发生错误时将错误写入error.log。默认情况下,日志保存路径在/var/log/apache2/
具体场景-----系统环境
Linux下的/proc/self/environ要求是php运行在cgi上面,然后和包含日志一样,在User-agent修改成payload
具体场景-----session
PHP默认生成的session文件往往存放在/tmp目录下