文件包含漏洞
一、漏洞描述
-
定义:使用函数去包含任意文件的时候,当包含的文件来源过滤不严谨的时候,当存在包含恶意文件后,就可以通过这个恶意的文件来达到相应的目的。
-
原理:程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这重文件调用的过程一般被称为文件包含。程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
-
常见文件包含函数:
程序 函数 ASP include() 、include_once()、require()、require_once() JSP/Servlet ava.io.file()、java.io.filereader() ASP include file、include virtual - include(): 执行到 include 时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行
- require0: 只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本
- include once0和 require once(: 若文件中代码已被包含则不会再次包含
-
伪协议
协议 解释 file:// 访问本地文件系统 http:// 访问 HTTP(s) 网址 ftp:// 访问 FTP(s) URLs php:// 访问各个输入/输出流 (I/O streams) zlib:// 压缩流 data:// 数据 (RFC 2397) glob:// 查找匹配的文件路径模式 phar:// PHP归档 ssh2:// Secure Shell 2 rar:// RAR ogg:// 音频流 expect:// 处理交互式的流
二、靶场实践
靶场采用pikachu靶场,建议采用本地自己安装的靶场,方便了解目录
1.本地文件包含
-
利用条件:
-
php.ini 中 allow_url fopen=On (默认开启)
-
用户参数可控且后台代码没有对包含的文件进行过滤
-
-
读取本地的敏感信息,linux操作系统的/etc/passwd,如下图所示
-
上传图片马,在读取本地的图片马,如下图所示
-
先上传一张图片马
<?php phpinfo();?>
-
利用文件包含读取图片马
-
2.远程文件包含
-
利用条件
-
php.ini 中 allow_url_fopen=On (默认开启) 和 allow_url_include=Off (默认关闭) 要开启
-
用户参数可控且后台代码没有对包含的文件进行过滤
-
-
远程文件包含漏洞
-
远程文件包含写入木马等操作
-
先在服务器写入一段木马
<?php file_put_contents("muma.txt",'<?php @eval($_GET["code"]);?>');?>
-
利用文件包含读取远程的一段木马,执行后页面是没有响应的,注意,靶场环境中需要给写的权限
chmod 777
,否则无法创建木马
-
执行写入的木马
-
三、漏洞防御
- 严格判断包含中的参数是否外部可控。是文件包含漏洞利用成功与否的关键点
- 路径限制:限制被包含的文件只能在某一文件内,一定要禁止目录跳转字符
- 包含文件验证:验证被包含的文件是否是白名单中的一员
- 尽量不要使用动态包含
- 设置
allow_url_include
为off