什么是文件包含漏洞
PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。最常见的就属于本地文件包含(Local File Inclusion)漏洞了。
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这种文件调用的过程一般被称为文件包含。
程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,
但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
远程文件包含漏洞的类型
1. 本地文件包含漏洞
就是在网站服务器上本身存在恶意文件,然后利用本地包含使用。
2. 远程文件包含漏洞
远程文件包含漏洞就是调用其它网站的恶意文件进行打开
常见的PHP文件包含函数
require:找不到被包含的文件时会产生致命错误,并停止脚本执行。
Include:找不到被包含的文件时只会产生警告,脚本将继续执行
Include_once:与include类似,区别就是如果该文件中的代码已经被包含,则不会再次包含。
Require_once:与require类似,区别就是如果该文件中的代码已经被包含,则不会再次包含。
文件包含示例
1. 本地包含
修改ph配置文件php.ini
写一个测试文件qswz,测试页面正常
在写一个文件包含测试页qswz111.php
这就是一个简单的文件包含过程
接下来,我们把被包含的文件名改为txt文件测试
事实说明,只要文件里面写的是php代码就会执行。当然,如果包含的不是php语法规则的内容则会暴露源码。
2. 远程包含
执行的是qswz.txt文件中的内容。
文件包含的利用
1. 读取敏感文件
Eg: 访问URL:localhost/qswz111.php?page=http://127.0.0.1/qswz.txt如果目标主机文件存在,并且具有相应的权限,那么就可以读出文件的内容,反之会被警告。
2. 远程包含shell
如果目标主机allow_url_fopen选项是激活的,就可以尝试远程包含一句话木马
3. 本地包含配合文件上传
4. PHP封装协议
file:// 访问本地文件系统
http:// 访问HTTP(S)网址
ftp:// 访问FTP(s)URLs
php:// 访问输入/输出流 (I/O streams)
zlib:// 压缩流
data:// 数据(RFC 2397)
ssh2:// Secure Shell 2
expect:// 处理交互式的流
glob:// 查找匹配的文件路径
a. 可以使用封装协议读取php文件
b. 可以使用封装协议写入php文件 php://input
5. 包含apache 的日志文件
6. 截断包含
嗯,就先这么多吧