前言:
文件包含是通过PHP相应函数(比如include($-REQUEST[666]))引入文件时,由于传入的文件名没有经过经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。
在文件包含中的文件,任意类型的文件都会被当作PHP文件执行。
理解漏洞才能掌握漏洞,重在理解中实践。
目录
一、理解文件包含的方式
1、条件:
(1)、include()等函数通过动态变量的方式引入需要包含的文件 (2)、用户能够控制这个动态变量
2、文件包含的方式
本地文件包含: 读取或执行本地文件的漏洞,本地文件指的是将目标服务器的文件信息。配合文件上传使用,通过知道文件上传的路径从而解析上传的木马文件。
远程文件包含: 如果php.ini的配置选项为allow_url_include为ON的话,可以加载远程文件,就是可以跳转到其它地方加载远程文件,直接可以远程加载其它地方的文件,达到直接执行任意命令。
3、常见的文件包含漏洞函数
(1)require 找不到被包含的文件会产生致命错误,并停止脚本运行
(2)include 找不到被包含的文件1只会产生警告,脚本继续执行
(3)require_once 和require类似,区别是该文件的代码已经被包含,则不会再次包含
(4)include_once 和include类似,区别是该文件的代码已经被包含,则不会再次包含
二、判断是否存在文件包含
举例说明:
DVWA中的文件包含page参数可以打开对应的文件,所以对于page参数是不可控的存在,可尝试打开一些私密文件,无限本地文件包含的效果,因此也会形成目录遍历的效果。
文件包含的表达式:
发现有文件包含的存在,但是没地方上传脚本,那首先判断目标主机是windows还是linux主机,然后对敏感目录进行信息搜集,访问不了则是没有访问的权限(相对路径是通过知道绝对路径的层次,来表达如
储存表达为 C:/phpstudy/www/dvwa/xxx
URL表达为 http://127.0.0.1/dvwa/xxx
相对路径表达为 ../../../dvwa/xxx
注:没有权限是打不开对应文件的
常见的敏感目录:
windows
C:\boot.ini | 查看系统版本 |
C:\windows\system32\inetsrv\MetaBase.xml | IIS 配置文件 |
C:\windwos\repair\sam | 存储windows系统初次安装的密码 |
C:\ProgramFiles\mysql\my.ini | Mysql配置 |
C:\ProgramFiles\mysql\data\user.MYD | root密码 |
C:\windows\php.ini | php配置信息 |
linux
/etc/password | 账户信息 |
/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配置文件 |
三、DVWA案例实践
LOW
本地文件包含(LFI)
案例1:
配合文件上传得到脚本文件的路径,然后再进行连接。首先通过文件上传的功能,将文件上传到目标服务器,得到上传后的文件路径。
将文件路径包含到page参数的后面,跳转执行。
利用任何文件都会被当作php执行特性,最后利用菜刀进行连接即可。
案例2:
apache日志进行文件包含
当发现有文件包含漏洞,但是没有地方上传文件的时候,可以利用apache日志进行文件上传。首先在web的URL后面构造getshell,在burpsuite里面将URL编码改回原来的getsehll代码。【apache的日志文件路径以apache的版本进行参考】
在apache的access.log日志或者error日志中就可以看到记录下的getshell语句,然后通过文件包含访问access.log日志,触发PHP被动,最后菜刀或者其它工具连接即可。
拓展:
文件包含会按照php格式读取apache文件,也会触发xss跨站脚本攻击(或许还有更多操作空间),但是遇到外部引入的函数(如<svg /οnlοad=alert(1)>),则不会将所有内容全部反馈到前端页面(如phpinfo),但里面所有内容会默认按照php脚本执行,所以可以进行getshell
远程文件包含(RFI)
条件:
php的配置选项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件的。
比如http://www.baidu.com/dvwa/1.txt ,存在一个脚本文件,那么可以远程访问并执行它,又或者自己开一个web服务,上传到服务器上一个getshell,让远程文件包含漏洞执行它,不过远程文件包含条件比较苛刻,所以不是所有都可以。
简单的验证方式就是在参数后面拼接百度地址,实现跳转则证明有远程包含。
medium级别
原理上是一样的,只是添加了一些过滤条件。
可以利用双写绕过,00截断的方式(条件magic_quotes_pgc=OFF php版本<5.3.4),路径长度截断(条件window OS),对远程文件包含有影响,本地文件知道绝对路径没有什么影响,相对路径的../被屏蔽了,利用双写的方式可绕过。
LFI
RFI
HIGH级别
只支持file文本传输协议对本地文件进行读取,不支持远程文件执行,需要知道文件的绝对路径。
php伪协议
file:// | 访问本地文件系统,不受allow_url_fopen与allow_url_include的影响 |
http:// | 访问http网址 |
ftp:// | 访问FTP(s)URLs |
php:// | 访问各个输入\输出流(1/0 streams) |
zlib:// | 压缩流 |
data:// | 数据 |
glob:// | 查找匹配的文件路径模式 |