产生原因:
开发过程中会把经常使用的函数写好封装在一个单独的文件中,在使用时直接调用该文件,在调用文件的过程一般称为包含。
开发时,程序员希望代码更加灵活,通常会将被包含的文件设置为变量。进行动态调用,虽然提高了灵活性,但是安全性则大大降低,这样会导致客户端可以调用一个恶意的文件,造成文件包含漏洞。并且也没没有做证书白名单过滤。
原理:文件包含漏洞其实和sql注入一样,都是通过客户端各种的操作让服务器执行自己的想要执行的代码,反馈出我们想要的信息。
先介绍四种包含函数(将PHP文件的内容插入另一个PHP文件中):
include():只会产生警报,不会停止脚本,脚本继续执行
include_once():遇上类似,多个一个检查是否已包含功能
require():会产生知名错误,直接停止运行
require_once():遇上类似,多个一个检查是否已包含功能
代码分析:
if(isset($_GET['submit']) && $_GET['filename'] !=null){
$gilename=$_DET['filename'];
include "include/$filename";
//此处直接将文件名变量包含进来执行,无安全措施,如白名单
//我们可以修改$_GET['filename']的值,让服务器访问我们指定的文件,这就是文件包含漏洞
}
接下来,说一下过程(咱们以pikachu为例-本地文件包含漏洞)
1.
本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.
我们进入了靶场文件包含漏洞练习页面,提交一个请求后可以在游览器地址栏中见
XXXXXXX 这个表示是咱们自己可以通过客户端编写命令向服务器发送并执行,我们通过上面的后端代码可以看出并不会对文件名有限制,而是直接被包含引用
我们在等号后面输入../../../../../../etc/passwd(在是针对Linux系统)
输出结果
从而将passwd目录下的内容输出
漏洞利用:
有很多象利用%00截断,路径长度
咱们之说一个
文件上传加文件包含(和前面连起来)
例如在一个页面上可以长传jpg\txt文件,
1.先做一个图片马
见图片以文本形式打开,嵌入咱们自己要执行的代码,将后缀名改为jpg
2.将图片马文件上传
3.在地址栏中,调用咱们的图片马
效果如上
咱们,思考一下,远程文件包含漏洞
远程文件包含漏洞前提:
allow_url_fopen=on
allow_url_include=on
这两个服务打开,说白了就是将上面XXXXXXX这个改为恶意站点的url,更加自由的探索对方的服务器(你离牢饭又近一步,只交流技术)