文件包含漏洞随笔
一、文件包含漏洞的定义
当我们使用文件包含的函数的时候(方法,如python模块),这个时候如果我们过滤不严格,那么就会导致我们这个文件可以包含恶意文件的情况,从而出现文件包含漏洞
二、文件包含漏洞原理
原理:当我们使用文件包含的函数的时候,由于是动态的使用,所以我们可以会考虑的不全面,导致出现一些意外的情况,比如用户可以将一些恶意文件输入其中,获取get shell等
三、文件包含漏洞的所涉及的函数
include:当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行。
include_ once:功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
require:require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
require_ once:功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次
highhlight_ file::highlight_ file() 函数对文件进行PHP语法高亮显示,语法通过使用HTML标签进行高亮。
当使用该函数时,整个文件都将被显示,包括密码和其他敏感信息!
show_source:show_source() 是 highlight_file() 的别名。
readfile:从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作
file_ get_contents:主要用于将文件的内容读入到一个字符串中的首选方法,但遇到读大文件操作时,不建议使用。可以考虑curl等方式代替
fopen:打开文件的函数之一
file:用于绕过文件包含漏洞的方式之一,伪函数之一
php://filter:用于绕过文件包含漏洞的方式之一,伪函数之一
php://input:用于绕过文件包含漏洞的方式之一,伪函数之一
zip://:用于绕过文件包含漏洞的方式之一,伪函数之一
compress.bzip2://:用于绕过文件包含漏洞的方式之一,伪函数之一
zlib//:用于绕过文件包含漏洞的方式之一,伪函数之一
data://:用于绕过文件包含漏洞的方式之一,伪函数之一
addslashes:addslashes() 函数在指定的预定义字符前添加反斜杠。这些字符是单引号(')、双引号(")、反斜线(\)与NUL(NULL字符)。
四、include和require函数的区别
inlude :包含的文件不存在,程序会继续执行
require:包含文件不存在,程序停止执行
五、文件包含漏洞的危害
通过文件包含漏洞,可以读取系统中的敏感文件,源代码文件等,如密码文件,通过对密码文件进行暴力破解。
若破解成功则可获取操作系统的用户账户,甚至可通过开放的远程连接服务进行连接控制。
另外不管是本地文件包含还是远程文件包含,文件包含漏洞还可能导致执行任意代码。
六、文件包含漏洞的分类
本地包含:可以进行一些本地的文件读取
远程包含:可以对外网上的文件进行读取
七、文件包含可能出现的位置
当url中出现了?page=和?file=以及?home=,可能会有文件包含漏洞(使用文件包含的函数【模块】的地方)
八、本地文件包含的条件
1.allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
2. 用户可以动态控制变量
九、远程文件包含的条件
1.在php.ini中需要allow_url_include = on和allow_url_fopen= on
2.所需的远程文件后缀不能与目标服务器的语言相同,如目标服务器解析PHP代码,则远程文件后缀不能为.php。
十、本地文件包含漏洞利用技巧
包含用户上传的文件 (我们上传的一句话木马等等)
包含data:// 或 php://input 等伪协议
包含 Session 文件
包含日志文件 ( 通过构造语句让服务器报错并将一句话随报错信息写入日志;找到日志文件路径,包含此文件;用菜刀连接;拿下网站的Webshell )
十一、远程文件包含所使用的主要函数
passthru函数:把这个文件保存到我们主机的服务器上(可以是不支持PHP的主机)
ll 列目录、文件(相当于Windows下dir)
pwd 查看当前绝对路径
whoami 查看当前用户
wget 下载指定URL的文件
十二、文件包含的绕过思路
1、直接绕过,../../之类的,查看父目录,主要看phpinfo.php和robits文件
2、%00绕过
3、加点绕过
4、空格绕过
5、点 空格绕过
6、/、绕过
7、双写绕过
8、伪协议绕过(file://,php://filter,php://input,zip://,compress.bzip2://,zlib//,data://)
十三、防御修复文件包含漏洞
1、在php中关闭allow_url_fopen 和 allow_url_include
2、设置白名单过滤,只能包含我们指定的文件
3、将敏感字符过滤(‘,“,/,\等)
4、将大小写,双写,点,空格,%00等过滤
5、将伪协议进行过滤(file://,php://filter,php://input,zip://,compress.bzip2://,zlib//,data://)
6、关闭服务器远程文件包含
7、尽量使用静态文件包含(自己写模块),少使用远程文件包含
8、在php中使用open_ basedir 配置限制访问在指定的区域