前言
文件包含漏洞简介:
文件包含的函数的参数没有经过过滤或者是严格的定义,并且参数可以被用户所控制,这样就可能包含非预期的文件。
①include: 包含并运行指定的文件,Include在出错的时候产生警告,脚本会继续运行
②include_once:在脚本执行期间包含并运行指定文件。该函数和include 函数类似,两者唯一的区别是 使用该函数的时候,php会加检查指定文件是否已经被包含过,如果是,则不会再被包含。
③require :包含并运行指定文件。require在出错的时候产生E_COMPLE_ERROR级别的错误,导致脚本终止运行。
④require_once: 和require函数完全相同。区别类似include和include_once。
文件包含漏洞示例(文件名称就叫做include.php吧)
无限制:没有为包含文件指定特定的前缀或者.php .html 等扩展名
$filename=$_GET['filename'];
Include($filename);
?>
有限制:(随便加一个扩展名上去)
$filename=$_GET['filename'];
Include($filename.".html");
?>
window系统:
\boot.ini 系统版本信息
\php.ini PHP配置信息
\my.ini MYSQL配置信息
\httpd.conf Apache配置信息
linux系统:
/etc/passwd linux系统账号信息
/etc/httpd/conf/httpd.conf Apache配置信息
/etc/my.conf MYSQL配置信息
/usr/etc/php.ini PHP配置信息
读取文件内容(还未纠正)
通过目录遍历可以获取系统中的文件:
http://XXX.X.X.X./include.php?finame= (传路径即可)
例:我们要访问四级目录中的1.php文件
那就是 http://XXX.X.X.X./include.php?finame=../../../1.php
利用无限制本地包含漏洞执行代码
利用无限制本地包含漏洞,可以通过文件包含功能执行扩展名的文件中的代码
Os:学到这里的时候终于解惑之前的一个疑惑:在做文件上传的题目时,为什么我上传一个图片马,访问该图片用蚁剑无法连接。原因当然是:图片马里面的php代码没有办法解析,如果要解析的话可以配合文件包含漏洞,那样就可以解析图片马里面的php代码(死靶文件随便加加减减呗)
例:Test.txt文件内容是
利用文件包含漏洞test.txt 文件,就可以执行文件中的php代码并输出phpinfo信息
如下:
绕过方法:
漏洞利用条件:
php版本要低于5.3.4
Magic_quotes_gpc=off
测试:http://127.0.0.1/include.php?filename=1.txt%00
操作系统存在最大路径长度的限制。可以通过输入超过最大路径的长度的目录,这样系统就会将后面的的路径给舍弃,导致扩展名截断。
漏洞利用条件:
window系统目录下的最大路径长度是256B
Linux系统目录下的最大路径长度是4096B
测试:http://127.0.0.1/include.php?finame=1.txt/../../../../../../../../../../../../../../../../../../../../../../../../../../../(省略不想打了)
和‘路径长度文件截断文件包含’同理
无限制远程文件包含是指包含文件的位置并不是在本地服务器,而是通过URL的形式包含其他服务器上的文件,执行文件中的恶意代码。
漏洞利用条件:
allow_url_fopen=on
allow_url_include=on
直接传参文件的url即可,就不做演示了。
绕过方法:
可以在问好(?)后面添加HTML字符串,问号后面的扩展名.html会被当成查询,从而绕或扩展名过滤
可以在井号(#)后面添加HTML字符串,#号会截断后面的扩展名.html,从而逃过扩展名过滤。#号的URL编码为%23
在payload的最后对空格进行URL编码 %20
1)file:// 访问本地文件系统
2)http:// 访问HTTP(S)网址
3)ftp:// 访问FTP(S)URL
4)php:// 访问各个输出输入流
5)zlib:// 处理压缩流
6)data:// 读取数据
7)glob:// 查找匹配的文件路径模式
8)phar:// PHP归档
9)rar:// RAR数据压缩
php://伪协议是php提供的一些输入输出流访问功能,允许访问php的输入输出流,标准输入输出和错误描述符,内存中,磁盘备份的临时文件流,以及可以操作其他读取和写入文件的过滤器。
1)php://filter
php://filter是元封装器,设计用于了数据流打开时的筛选过滤应用,对本地磁盘文件进行读写。
以下两种用法相同:
?filename=php://filter/read=convert.base64-encode/resource=XXX.php
?filename=php://filter/convert.base64-encode/resource=XXX.php
名称 | 描述 |
resource=<要过滤的数据流> | 该参数是必需的。指定要过滤的数据流 |
read=<读链的筛选器列表> | 该参数可选。可以设定一个或者多个筛选器名称,以管道符(|分隔 |
write=<写链的筛选器列表> | 该参数可选。可以设定一个或者多个筛选器名称,以管道符(|)分隔 |
2)php://input
php://input可以访问请求的原始数据的只读流,既可以直接读取POST上没有经过解析的原始数据,但是使用enctype='multipat/from-data"的时候php://input是无效的。
php://input有以下三种用法:
读取POST数据
有空再更