造成的原因:
通过PHP函数引入文件 ,传入的文件名没有经过合理的验证,操作了恶意文件,导致文件泄漏甚至恶意代码注入。
开始之前浅浅了解一下伪协议:
PHP伪协议是一种用于访问各种资源的特殊协议,其基本格式为 protocol://specific-part
。其中,protocol
表示伪协议的名称,specific-part
则表示具体的参数。
作用:* 访问文件
* HTTP请求与响应
* 访问文件系统
file://、php://filter、php://input、zip://、compress.bzip2://、compress.zlib://、data://等
file:// 用于访问本地文件系统,通常用来读取本地文件的且不受allow_url_fopen与allow_url_include的影响 。
php://filter用于读取源码,php://input用于执行php代码。
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
zip://, bzip2://, zlib:// 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名。
造成文件包含漏洞产生的必要条件。
-
allow_url_fopen=On(默认为On) 规定是否允许从远程服务器或者网站检索数据。
-
allow_url_include=On(php5.2之后默认为Off) 规定是否允许include/require远程文件。
php中常见的文件包含函数有以下四种:
-
include()
-
require()
-
include_once()
-
require()_once()
include与require基本是相同的,除了错误处理方面:
-
include(),只生成警告(E_WARNING),并且脚本会继续
-
require(),会生成致命错误(E_COMPILE_ERROR)并停止脚本
-
include_once()与require()_once(),如果文件已包含,则不会包含,其他特性如上。
DVWA靶场初探文件包含漏洞。
插播:
*敲敲小黑板,常常因为改了靶场密码,第二次登录进不去的宝子,注意一下:
先下载一个phpMyAdmin4.8.5,在首页数据库管理工具这里打开它。
用户名密码点击小皮面板的数据库查看(方便)。
打开数据库dvwa——>表user,password用md5加密,baudu解密一下,为了下次方便进入,也可以自己加一个用户名密码,记得密码md5加密一下。
low
没有进行任何过滤
爆出网站的绝对路径,本地包含:绝对路径(""),相对路径(../(上级目录))很难知道网站的目录结构。
远程文件包含:"D:\phpstudy_pro\WWW\dvwa-master\sss.php"
sss.php
medium
重复一下LOW发现行不通,看一下源码:
可以通过相对路径复写绕过。
high
使用白名单
fnmatch()
函数根据指定的模式来匹配文件名或字符串,使用伪协议绕过。
后期继续探讨文件包含漏洞: