原因
LFI产生的原因是由于程序员未对用户可控变量进行输入检查,此漏洞的影响可能导致泄露服务器上的敏感文件,如若攻击者能够通过其他方式在Web服务器上放置代码,那么他们便可以执行任意命令
涉及到的函数
主要涉及到的函数
include() require() include_once() require_once()
magic_quotes_gpc() allow_url_fopen() allow_url_include()
move_uploaded_file() readfile() file() file_get_contents()
upload_tmp_dir() post_max_size() max_input_time()
典型漏洞代码:
<?php
include($_GET['url'].'.php');
?>
函数相关名称:
include
//只有执行到此函数时才去包含文件,若包含的文件不存在产生警告,程序继续执行
include_once
//如果一个文件已经被包含过,则不会在包含它
require
//程序一运行文件便会包含进来,若包含文件不存在产生致命错误,程序终止运行
require_once
//如果一个文件已经被包含过,则不会在包含它
各个协议实现的命令执行
%00
是否需要截断是根据包含函数后有没有对包含的文件进行拼接一个后缀名,如果有就需要使用%00进行截断
当php版本<=5.2使用%00截断
file://用于访问本地文件系统
条件(php.ini)
allow_url_fopen off/on
allow_url_include off/on
使用方法: file://[文件的绝对路径和文件名]
php://访问各个输入输出流
php伪协议
php://filter:用于读取源码并进行base64编码输出
条件(php.ini)
allow_url_fopen off/on
allow_url_include off/on
php://input:可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行
条件(php.ini)
allow_url_fopen off/on
allow_url_include on
php://stdin是只读的,php://stdout和php://stderr是只写的
php://output是一个只写的数据流,允许你以print和echo一样的方式,写入到输出缓冲区
php://fd允许直接访问指定的文件描述符
zip://,bzip://,zlib://:均属于压缩流,可以访问压缩文件中的子文件,不需要传后缀名
条件:
allow_url_fope off/on
allow_url_include off/on
zip://使用方法:
zip://[压缩文件绝对路径]#[压缩文件内的子文件名]
bzip2://使用方法:
bzip://file.bz2
zlib://使用方法:
zlib://file.gz