探索web世界——任务五
任务内容:
1.学习file inclusion(文件包含),了解各种伪协议姿势;
2.完成dvwa第三个模块file inclusion;
3.继续学习php.
一,file inclusion(文件包含)和各种伪协议姿势
(一)文件包含
找了找资料,理解到它的大概意思如下:
文件包含漏洞:即File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。文件包含漏洞分为本地文件包含漏洞与远程文件包含漏洞,远程文件包含漏洞是因为开启了php配置中的allow_url_fopen选项(选项开启之后,服务器允许包含一个远程的文件)。服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,而我们可以构造这个恶意文件来达到自己的目的。
文件包含分为两种类型:
(1)本地文件包含
当被包含的文件在服务器本地时,就形成本地文件包含;
(2)远程文件包含
当被包含的文件在第三方服务器时,就是远程文件包含。
PHP的文件包含函数有四种:
require():require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行 。使用require()函数包含文件时,只要程序一执行,立即调用文件,而include()只有程序执行到函数时才调用 .require()在php程序执行前执行,会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部分。
require_once():它的功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
include():当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,程序继续向下执行。
include_once():功能和include()相同,区别在于当重复调用同一文件时,程序只调用一次。
关于文件包含的实际操作,在第二部分的DVWA中的file inclusion 部分再继续学习。
(二)伪协议
是指PHP支持的协议和封装协议,有以下类型:
- file://—访问本地文件系统
- http://—访问HTTP(s)网址
- ftp:// — 访问 FTP(s) URLs
- php:// — 访问各个输入/输出流(I/O streams)
- zlib:// — 压缩流
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的流
参考PHP网站上的讲解内容,非常详细:链接
二、DVWA 的file inclusion模块
1、首先让服务器开启allow_url_include选项:
- 在PHP中打开配置文件php.ini,直接用记事本打开(点击一下它自己就以记事本方式打开了)
- 找到allow_url_fopen这一行,将allow_url_fopen = Off改为allow_url_fopen = On;
- 最后重启一下Apache,就可以啦。(本来的dvwa的页面会提醒你还没有改,改完刷新一下就没有那个提示了)变成这样:
2、下面首先对四种安全等级下的代码进行简单的对比分析:
low等级
可以看到,服务器端对page参数没有进行任何的过滤和检查。服务器期望的是用户点击下面给出的三个链接,服务器会包含相应的文件,并将结果返回。
点击file1.php后,出现如下界面:
点击file2.php后,出现如下界面:
点击file3.php后,出现如下界面:
- 漏洞利用:
首先是本地文件的获取,获取php.ini文件,文件在DVWA-master中,所以用…/…/往前挑两级目录,所以就表示为page=…/…/php.ini
成功获取到文件,显示如下:
再看远程文件执行:phpinfo.php这个文件可以显示PHP的配置信息,我们把之前的url参数中的php.ini换成phpinfo.php执行,显示如下:
这说明文件包含不但能读文件,还能执行文件。
远程文件执行还可以执行本地构造的文件:
在本地网站创建一个phpinfo.txt文件写入php代码如图:
然后执行我们的文件包含,就是在page后面加上刚才文件的url,执行后如图所示:
执行成功说明不管是不是php文件,只要包含PHP代码就可以执行。
Medium等级
在此等级下按照low等级的方法执行url是失败的,根据前面的关于代码的分析可知,这时的服务器过滤了…/这个字符,也就它他不起作用了。但是…\也能进行翻转,验证一下:
在读取本地文件时,发现可以运行成功:
更改一下文件名,也可以成功:
它也对http://进行了过滤,我们可以改用输入httphttp://来避过排查。
在执行远程文件,当这样输入时,也可以实现目标:
High等级
将前面同样的方法用到这个等级下面,发现都不行(其实可以想到肯定不行了,它的安全防御措施越来越来严密全面了)。经过分析High等级下的代码,可以大概得知,他应该只能支持读取file*开头的参数,根据前面学的file协议的相关内容,可知它的用法有以下几种:
在这里我用的圈红的形式,执行成功如下:
由于file协议只支持读取本地文件,不支持远程文件执行,不能进行远程文件的漏洞利用(可以利用文件上传漏洞配合执行文件包含)。
Impossible等级
在此等级下,之前的方式都不能成功了,从此等级的代码可以看到,它只允许四个文件名,所以它能能够有效地防止文件包含漏洞。
三、继续学习PHP
在菜鸟教程上按照分好的模块来一步步进行学习,进行中。