自学文件包含【更新中】

文件包含

开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称为文件包含

文件包含漏洞

开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞

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

    扫描二维码关注公众号,回复: 12409586 查看本文章
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目录下

一篇写的很全面,适合基础入门的文件包含漏洞文章

猜你喜欢

转载自blog.csdn.net/Luminous_song/article/details/108829172