前言
文件包含漏洞简介:
文件包含的函数的参数没有经过过滤或者是严格的定义,并且参数可以被用户所控制,这样就可能包含非预期的文件。
一.文件包含漏洞常见的函数(默认都以php脚本为准啊)①include: 包含并运行指定的文件,Include在出错的时候产生警告,脚本会继续运行
②include_once:在脚本执行期间包含并运行指定文件。该函数和include 函数类似,两者唯一的区别是 使用该函数的时候,php会加检查指定文件是否已经被包含过,如果是,则不会再被包含。
③require :包含并运行指定文件。require在出错的时候产生E_COMPLE_ERROR级别的错误,导致脚本终止运行。
④require_once: 和require函数完全相同。区别类似include和include_once。
文件包含漏洞示例(文件名称就叫做include.php吧)
无限制:没有为包含文件指定特定的前缀或者.php .html 等扩展名
利用文件包含漏洞test.txt 文件,就可以执行文件中的php代码并输出phpinfo信息
如下:
绕过方法:
1)%00截断文件包含漏洞利用条件: php版本要低于5.3.4
Magic_quotes_gpc=off
测试:http://127.0.0.1/include.php?filename=1.txt%00
2)路径长度截断文件包含操作系统存在最大路径长度的限制。可以通过输入超过最大路径的长度的目录,这样系统就会将后面的的路径给舍弃,导致扩展名截断。
漏洞利用条件:
window系统目录下的最大路径长度是256B
Linux系统目录下的最大路径长度是4096B
测试:http://127.0.0.1/include.php?finame=1.txt/../../../../../../../../../../../../../../../../../../../../../../../../../../../(省略不想打了)
3)点号截断文件包含和‘路径长度文件截断文件包含’同理
三.远程包含漏洞 ①无限制远程文件包含漏洞无限制远程文件包含是指包含文件的位置并不是在本地服务器,而是通过URL的形式包含其他服务器上的文件,执行文件中的恶意代码。
漏洞利用条件:
allow_url_fopen=on
allow_url_include=on
漏洞利用:直接传参文件的url即可,就不做演示了。
②有限制远程文件包含漏洞(后面再补图)绕过方法:
1)问号绕过可以在问好(?)后面添加HTML字符串,问号后面的扩展名.html会被当成查询,从而绕或扩展名过滤
2)井号绕过可以在井号(#)后面添加HTML字符串,#号会截断后面的扩展名.html,从而逃过扩展名过滤。#号的URL编码为%23
3)空格绕过在payload的最后对空格进行URL编码 %20
四.PHP伪协议 ①常见的php伪协议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提供的一些输入输出流访问功能,允许访问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数据
有空再更