文件包含漏洞,为了减少重复代码的编写,引入了文件包含函数,通过文件包含函数将文件包含起来,简单的说就是一个文件里面包含另一个或多个文件
php中的文件包含分为本地文件包含和远程文件包含
本地包含呢故名思意就是发生在服务器本身的,只要所包含的文件符合php语法规范都能被当成php解析,无论任何格式,例如:txt
远程文件包含则需要确定php是否开启 '' allow_url_include '' (on/off) 在php.ini配置文件中,在本地靶场测试时记得开启
php文件的包含函数
php提供了四个文件包含的函数:include() include_once() require()和require_once()
include 在找不到包含的文件时只会产生警告,脚本将继续执行
include_once 和include唯一区别就是只包含一次
require:找不到包含文件时会产生致命错误,并停止脚本
require_once: 同样和require区别就是只包含一次
php伪协议介绍:
file:// 访问本地文件系统
http:// 访问HTTP/S网址
ftp:// 访问FTP/sURLS
PHP:// 访问各个输入输出流
ZLIB:// 压缩流
data:// 数据
php.ini参数设置:
在php.ini里有两个重要参数allow_url_fopen、allow_url_include
allow_url_fopen:默认值时ON,允许url里的封装协议访问文件
allow_url_include:默认值时OFF,不允许包含url里的封装协议文件
下面举几个简单的例子:就用在本地搭建的dwva靶场来看一下。
先把难度调到最简单的low
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=file1.php
点击file1.php发现url改变,由于我们提前知道源代码方便测试就在上一层目录创建了一个txt文件里面写好phpinfo代码。
payload:http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=../1.txt
php://input用法
input可以访问请求的原始数据的只读流,将post请求的数据当做php代码执行
php://input:同时post想设置的文件内容,php执行时也会将post当作文件内容
我们也可以写入一句话木马方法同上:
没有报错就是成功了可以用菜刀进行连接
我这里就不用工具连接了可以看到可以执行命令
file协议:file协议支持大部分语言,用于访问本地文件系统,当指定了一个相对路径不以/\或者Windows盘符开头的路径,则提供的路径基于当前的工作目录
file:// 文件的绝对路径和文件名
file:// 文件的相对路径和文件名
注意:file协议在利用的时候需要完整的路径
payload:http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=file:///C:/1.txt
还有一种data协议php特有的
payload:127.0.0.1/***/****/?page=data://text/plain,<?php phpinfo();?>
data://text/plain,
直接读取文件源码
filter:封装协议
payload:http://127.0.0.1/index.php?page=php://filter/read=convert.base64-encode/resource=1.txt
这样读出来的时base64编码过的防止在读取的时候发生乱码
剩下的就不一一举例了,在测试当中可能会出先失败在有限制的情况下比如强制在后面加上html,造成解析失败,在php版本小于5.3.4的前提下可以用%00截断
最常用的应该就是长度截断了,Windows下“./”长度大于256,Linux大于4096就可以,有点类似垃圾数据溢出