注:本文仅供学习参考
文件包含定义:
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。造成方便的同时,也留下了隐患。
文件包含常用函数:
require()#函数出现错误的时候,会直接报错并退出程序的执行
require_once()#只包含一次
include()#在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行
include_once()#只包含一次
原理:
在进行文件包含的时候,没有对参数进行严格的过滤
<?php
$filename = $_GET['filename'];
include($filename);
?>
如上述例子 在引用filename函数时,没有过滤,直接引用了这个函数
文件包含分类:
本地包含:可以进行一些本地的文件读取
远程包含:可以对外网上的文件进行读取
实战:
留意url,这里我想包含当前目录的1.txt(内容为phpinfo()),发现成功执行php语句
同理读取其他文件可使用../../返回上级目录,就比如我相关读取D盘下的2.txt
思路
有时候当我们发现了一个本地的文件包含漏洞,但我们也仅仅只能去读取一些本地的文件,没有办法去进行更深层次的利用,然后又在这个网站上发现了一个文件上传漏洞,同时这个文件上传漏洞如果单个来看是比较鸡肋的,比如它做了限制,只能发送图片,而这个图片却没有做严格的限制,我们可以通过一些图片木马来绕过上传,而这两个漏洞结合一下的话,就能达到很大效果了
比如我们上传了一个图片木马,没法单独去使用,但我们可以使用文件包含漏洞,去对这个文件进行包含,也就是说两个文件互相结合进行利用
这里提供一个思路getshell:就比如想getshell但又没有上传点,怎么办呢,我们可以把一句话包含进apache日志里(日志位置可以猜测一下),进行getshell。下面来看看实战。
日志位置于../../../../apache/logs/access.log
直接写一句话(注意浏览器会编码,通过burp请求)
这时打开菜刀尝试连接
成功getshell
ps:%00截断
条件:magic_quotes_gpc = Off php版本<5.3.4
比如这种
<?php
$filename = $_GET['filename'];
include($filename . ".html");
?>
远程文件包含:
PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。
条件
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
了解php伪协议:
php伪协议本来是方便使用的,但如果存在包含漏洞,攻击者可以充分利用读取或写入一些文件
这里介绍几个常用的
php://filter(本地磁盘文件进行读取)
php://input
file://伪协议 (读取文件内容)
php://filter用法
?php://filter/convert.base64-encode/resource=xxx.php
通过Base64解密后
成功读取
file://伪协议 (读取文件内容)
通过file协议可以访问本地文件系统,读取到文件的内容
这里读取我D盘下的2.txt
2.txt的内容为phpinfo();
php://input
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的。
用法:?file=php://input 数据利用POST传过去。
php://input(写入木马)
条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),(不开启会报错)就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。
如果POST的数据是执行写入一句话木马的PHP代码,就会在当前目录下写入一个木马。
php://input(读取post数据)
碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项
php://input(命令执行)
条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行
修复方式
过滤../ ./
配置php.ini文件
都关闭allow_url_fopen 和 allow_url_include
设置白名单
还有很多协议如data phar zip等等等等 有兴趣的伙伴可以去研究一下
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。